lingo pull

Max PrilutskiyCEO 兼 共同創業者読了目安 1分

直近の push の出力を取得し、lockfile との競合を検出しながらディスクに書き込みます。

text
lingo pull [--force] [--dry-run]

使うタイミング#

lingo push は実行を送信するとすぐ終了するため、出力の取得には pull を使います。--wait なしで行ったプッシュの後や、--wait 付きのプッシュで書き込みまで完了しなかった場合に実行してください:

  • 翻訳の途中でターミナルを閉じてしまった場合。 ターミナルを開き直して lingo pull を実行すれば、実行が止まったところから続きます。
  • 同じ CI ジョブ内であとから。 あるステップで lingo push を実行し、その後、同じランナー上の同じチェックアウトで後続ステップから lingo pull を実行して出力を取得します。ほかのマシンからは、コミット後に取得できます。
  • 実行完了後、push が書き込む前に作業へ戻った場合。 一時的なネットワーク障害やプロセスの強制終了があっても、pull が残りの処理を完了します。

実行の見つけ方#

pull は ~/.lingo/runs/<hash>.json を読み込みます。ここで <hash> は、プロジェクトルートの絶対パスから導出されます。このファイルには、runId の最後の push が記録されています。これがない場合、pull はエラーになります。

text
Error: No saved run state for this project (looked for ~/.lingo/runs/<hash>.json) — run
       `lingo push` first so we know which run's outputs to pull.

このファイルはマシンごとに作られ、リポジトリの外に保存されます(理由の詳細は Configuration を参照してください)。

競合検出#

各ターゲットを書き込む前に、pull は次の 2 つを比較します。

  • ディスク上のローカルファイル のハッシュ
  • .lingo/lock.json に最後にサーバー上のバージョンとして記録されたハッシュ

一致していれば → ローカルでの編集はなく、安全に上書きできます。異なっていれば → ローカル編集があり、pull するとそれらは失われます。その場合、pull は中断します。

text
Error: 3 conflict(s) — rerun with --force

ここでの唯一の信頼できる情報源は lockfile です。追跡しているのはソースコンテンツではなく、サーバーが最後に書き込んだ内容です。残したい翻訳ファイルへの手動編集はコミットしておく(そうすれば pull を実行しても残る)か、--force を付けて pull する(そうすれば上書きされる)必要があります。

フラグ#

--force / -f#

lockfile と差異のあるローカルのターゲットファイルを上書きします。競合をレビューし、サーバー側のバージョンを正と判断したうえで使ってください(例: 他の誰かが glossary の更新を push しており、そちらを優先すべき場合)。

推奨ワークフロー:

bash
git status                          # stash or commit local edits first
git stash                           # if you want to keep them aside
lingo pull --force
git stash pop                       # re-apply your edits, resolve conflicts manually

--dry-run#

ファイルシステムには手を加えず、pull が何をするかだけを表示します。

bash
lingo pull --dry-run

書き込まれるファイル数と、すでに同期済みのファイル数を出力します。何もずれていないことを確認したい CI で便利です。

出力#

成功時:

text
✓ Pulled run lrg_a8c...: wrote 12 file(s), 4 already in sync.

ドライラン:

text
Dry run complete. 16 file(s) already in sync.

実行が失敗した場合、またはキャンセルされた場合:

text
Run lrg_a8c... is failed, not pulling yet.

(pull は、まだ保留中または実行中の実行が完了するまで push --wait と同じ進行状況表示で待機し、その後に出力を書き込みます。失敗またはキャンセルされた実行には取得できる出力がありません。実行、状態、復旧 を参照してください。)

エッジケース#

  • これまでに push が一度もない場合。 上記と同様にエラーになります。「サーバー上のどこかにある翻訳を pull する」という概念はありません。pull は常に特定の run を対象にします。
  • 削除済みまたは期限切れの run を指している実行状態。 エンジンは 404 を返し、pull はそれを分かりやすく報告します。~/.lingo/runs/<hash>.json を削除し、push を再実行してください。
  • .lingo/config.json のエンジンが、その run を作成したときのものと異なる場合。 エンジン ID が一致していないため、CLI は ID を表示してエラーにします。現在のエンジンに対して push を再実行してください。