lingo pull

Max PrilutskiyCEO a spoluzakladatel2 min čtení

Stáhne výstupy z posledního pushnutí a zapíše je na disk s detekcí konfliktů vůči lockfile.

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

Kdy ho použít#

lingo push se ukončí hned po odeslání spuštění, takže jeho výstupy získáte pomocí pull. Spusťte ho po jakémkoli pushi bez --wait — i tehdy, když push s --wait nemohl zapisovat:

  • Zavřeli jste terminál uprostřed překladu. Znovu ho otevřete a spusťte lingo pull — naváže tam, kde běh skončil.
  • Později v rámci stejné CI úlohy. Jeden krok spustí lingo push, pozdější krok na stejném runneru a ve stejném checkoutu spustí lingo pull a získá výstupy. Na jiných počítačích budou k dispozici, jakmile se commitnou.
  • Vrátili jste se k práci poté, co běh skončil, ale ještě předtím, než push stihlo zapsat výstupy. Výpadek sítě, ukončený proces — pull to dokončí.

Jak najde běh#

pull čte ~/.lingo/runs/<hash>.json, kde <hash> je odvozené z absolutní cesty ke kořenovému adresáři projektu. Soubor zaznamenává poslední runId z push. Bez něj pull skončí chybou:

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.

Tento soubor je vázaný na konkrétní počítač a nachází se mimo repozitář (proč tomu tak je, najdete v Configuration).

Detekce konfliktů#

Před zápisem každého cíle pull porovnává:

  • Hash lokálního souboru na disku
  • Hash zaznamenaný v .lingo/lock.json jako poslední známá verze na serveru

Pokud se shodují → žádné lokální úpravy, přepsání je bezpečné. Pokud se liší → existují lokální úpravy; pull by je zahodil. pull se ukončí:

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

Lockfile je tu jediný zdroj pravdy — sleduje, co server zapsal naposledy, ne zdrojový obsah. Ruční úpravy přeložených souborů, které chcete zachovat, by měly být commitnuté (aby přežily pull) nebo stažené pomocí --force (aby se přepsaly).

Příznaky#

--force / -f#

Přepíše lokální cílové soubory, které se rozešly s lockfile. Použijte až poté, co zkontrolujete konflikty a rozhodnete, že verze na serveru je směrodatná (např. když někdo jiný pushnul aktualizaci glosáře, která má mít přednost).

Doporučený workflow:

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#

Ukáže, co by pull udělalo, aniž by sáhlo na souborový systém:

bash
lingo pull --dry-run

Vypíše počet souborů, které by se zapsaly, a kolik jich už je synchronizovaných. Hodí se v CI pro ověření, že se nic nerozešlo.

Výstup#

Úspěch:

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

Dry run:

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

Spuštění selhalo nebo bylo zrušeno:

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

(pull čeká na spuštění, které je stále ve stavu pending nebo running, se stejným zobrazením průběhu jako push --wait, a pak zapíše výstupy. Ze selhaného nebo zrušeného spuštění není co stáhnout — viz Runs, state, and recovery.)

Okrajové případy#

  • Žádný předchozí push. Chyba jako výše. Neexistuje tu koncept „stáhnout překlady, které někde na serveru existují“ — pull vždy cílí na konkrétní běh.
  • Stav běhu ukazuje na smazaný / expirovaný běh. engine vrátí 404; pull to srozumitelně nahlásí. Smažte ~/.lingo/runs/<hash>.json a znovu spusťte push.
  • V .lingo/config.json je jiný engine než ten, na kterém byl běh vytvořen. ID enginu nesouhlasí — CLI skončí chybou a vypíše obě ID. Znovu spusťte push proti aktuálnímu enginu.