保存したローカルファイルをSHA-256で読み取って編集する

プロジェクトを確認し、保存されたファイルを一覧表示して読み取り、期待するSHA-256が一致する場合にのみ内容を置換します。

Linux上のAltifigence CLI 0.1.9を使用して、IDEを開かずにローカルプロジェクトの保存済みファイルを扱います。各置換では、読み取った内容のSHA-256を指定します。保存されたファイルのSHA-256がそれと一致しなくなった場合、コマンドは置換を拒否します。

プロジェクトを確認する

ローカルプロジェクトの絶対パスを使用してください。この例では$HOME/alti-projects/demo-projectを使用します。通常のユーザーとしてコマンドを実行してください。

set -euo pipefail
PROJECT="$(cd "$HOME/alti-projects/demo-project" && pwd -P)"
WORK="$(mktemp -d)"
alti ide workspace health --project "$PROJECT" > "$WORK/health.json"
jq '{ok, git}' "$WORK/health.json"

healthはまず保留中のファイルトランザクションを完了してから、プロジェクトを報告します。終了ステータスが0で、okがtrueであることを確認してください。nameはプロジェクトフォルダー名で、gitはプロジェクトに.gitフォルダーがあるかどうかを示します。

ファイルを一覧表示して読み取る

alti ide workspace files --project "$PROJECT" --limit 100 > "$WORK/files.json"
jq '{total, truncated, first: .files[:5]}' "$WORK/files.json"

filesは、保存されたファイルをプロジェクトからの相対パスで、ソートした順に一覧表示します。totalは一覧表示されたすべてのファイルの数で、totalが--limitを超える場合はtruncatedがtrueになります。既定の上限は500、最大は20000です。.git、.alti、.altifigence、node_modules、target、distなどのフォルダーは除外されます。

保存されたUTF-8テキストファイルを一つ読み取ります。これらの例ではnotes/review.txtを使用します。

alti ide workspace read --project "$PROJECT" notes/review.txt > "$WORK/review.json"
jq '{path, encoding, sha256}' "$WORK/review.json"

結果にはpath、encoding(utf-8)、sha256、contentが含まれます。sha256は保存された内容の小文字十六進数のSHA-256です。4194304バイトまでのファイルを読み取れます。

ファイルを一つ置換する

新しい内容をファイルに書き込み、読み取ったsha256を--expected-sha256として指定してください。

printf 'Third review\n' > "$WORK/review.txt"
alti ide workspace write --project "$PROJECT" notes/review.txt \
  --expected-sha256 "$(jq -r .sha256 "$WORK/review.json")" \
  --content "$WORK/review.txt" > "$WORK/write.receipt.json"
jq '{outcome}' "$WORK/write.receipt.json"

終了ステータスが0で、outcomeがcommittedであることを確認してください。

{
  "outcome": "committed"
}

レシートにはtransactionId、generation、recoveryStatus、filesも含まれ、各エントリーにはpath、beforeSha256、afterSha256があります。writeは既存のファイルを置換します。--content -は新しい内容を標準入力から読み取ります。内容は4194304バイト以内にしてください。

複数のファイルをまとめて編集する

各ファイルを読み取り、ファイルごとにpath、expected_sha256、contentのエントリーを一つずつ含むJSON配列を準備してください。

alti ide workspace read --project "$PROJECT" notes/review.txt > "$WORK/review.json"
alti ide workspace read --project "$PROJECT" notes/todo.txt > "$WORK/todo.json"
jq -s '[
  {path: .[0].path, expected_sha256: .[0].sha256, content: "Fourth review\n"},
  {path: .[1].path, expected_sha256: .[1].sha256, content: "Check the review\n"}
]' "$WORK/review.json" "$WORK/todo.json" > "$WORK/edit.json"
alti ide workspace edit --project "$PROJECT" --request "$WORK/edit.json" \
  > "$WORK/edit.receipt.json"
jq '{outcome, files: [.files[].path]}' "$WORK/edit.receipt.json"

終了ステータスが0の場合、選択したレシートのフィールドは次のとおりです。

{
  "outcome": "committed",
  "files": [
    "notes/review.txt",
    "notes/todo.txt"
  ]
}

editはファイルを変更する前にすべてのエントリーを検査し、置換を一つのトランザクションとして適用します。エントリーは1から64個にし、パスごとに一つのエントリーで、それぞれに新しい内容を指定してください。各ファイルは4194304バイト以内、すべてのエントリーの元の内容と新しい内容は16777216バイト以内にしてください。

拒否された編集に対処する

ワークスペースエンジンがwriteまたはeditのリクエストを拒否すると、コマンドは終了ステータス1で終了し、messageを含むaltifigence.ide-workspace-error.v1オブジェクトを標準エラー出力に書き込みます。CLIは、サイズが大きすぎる入力やJSONが配列ではない編集リクエストを、接頭辞error:を付けて標準エラー出力に報告し、終了ステータス1で終了します。以下のどのメッセージでも、ファイルは変更されません。

workspace edit original digest mismatch: notes/review.txtの場合は、読み取った後にファイルが変更されています。もう一度読み取り、現在のcontentを確認して、新しいsha256で置換をやり直してください。

workspace edit has no content change: notes/review.txtの場合は、新しい内容が保存された内容と同じです。そのエントリーを削除するか、内容を変更してください。

workspace edit transaction contains a duplicate pathの場合は、そのパスのエントリーを、最終的な内容を持つ一つのエントリーにまとめてください。

workspace edit SHA-256 digest must be 64 lowercase hexadecimal charactersの場合は、readのsha256の値をそのままコピーしてください。

workspace path is outside the editable file surfaceの場合は、filesの一覧にある、.や..の区間を含まないプロジェクトからの相対パスを使用してください。

filesでworkspace exceeds 20000 files; narrow the projectの場合は、より小さいプロジェクトフォルダーを開いてください。

ローカルファイルを作成、置換、削除する