lingo pull

Max PrilutskiyCEO e cofundador3 min de leitura

Obtém os resultados do push mais recente e escreve-os em disco, com deteção de conflitos face ao ficheiro de bloqueio.

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

Quando utilizar#

lingo push termina assim que a execução é submetida, por isso pull é a forma de recolher os resultados. Execute-o depois de qualquer push sem --wait — e quando um push com --wait não conseguiu escrever:

  • Fechou o terminal a meio da tradução. Reabra-o, execute lingo pull — retoma a partir do ponto onde a execução ficou.
  • Mais tarde, na mesma tarefa de CI. Um passo executa lingo push; um passo posterior, no mesmo runner e checkout, executa lingo pull e obtém os resultados. As outras máquinas só os recebem depois de serem confirmados.
  • Retomou o trabalho depois de a execução terminar, mas antes de push conseguir escrever. Uma falha momentânea de rede, processo terminado à força — pull conclui o processo.

Como encontra a execução#

pull lê ~/.lingo/runs/<hash>.json, onde <hash> é derivado do caminho absoluto da raiz do projeto. O ficheiro regista o último runId de push. Sem isso, pull devolve um erro:

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.

Este ficheiro é específico de cada máquina e fica fora do repositório (consulte Configuration para perceber porquê).

Deteção de conflitos#

Antes de escrever cada destino, pull compara:

  • Hash do ficheiro local em disco
  • Hash registado em .lingo/lock.json como a última versão conhecida no servidor

Se corresponderem → não há edições locais, por isso é seguro substituir. Se forem diferentes → existem edições locais; fazer pull iria descartá-las. pull aborta:

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

O ficheiro de bloqueio é aqui a única fonte de verdade — regista o que o servidor escreveu pela última vez, não o conteúdo de origem. As edições manuais em ficheiros traduzidos que queira manter devem ser commitadas (para sobreviverem a pull) ou deve fazer pull com --force (para serem substituídas).

Opções#

--force / -f#

Substitui os ficheiros de destino locais que divergiram do ficheiro de bloqueio. Utilize esta opção depois de rever os conflitos e decidir que a versão do servidor é a canónica (por exemplo, outra pessoa fez push de uma atualização do glossário que deve ter precedência).

Workflow recomendado:

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#

Mostra o que pull faria sem alterar o sistema de ficheiros:

bash
lingo pull --dry-run

Mostra o número de ficheiros que seriam escritos e quantos já estão sincronizados. Útil em CI para confirmar que nada ficou dessincronizado.

Resultado#

Sucesso:

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

Execução simulada:

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

A execução falhou ou foi cancelada:

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

(pull aguarda uma execução que ainda esteja pendente ou em curso, com a mesma indicação de progresso que push --wait, e depois escreve os resultados. Uma execução falhada ou cancelada não tem nada para obter — consulte Execuções, estado e recuperação.)

Casos limite#

  • Sem push anterior. Erro como acima. Não existe o conceito de "fazer pull das traduções que existem algures no servidor" — pull aponta sempre para uma execução específica.
  • Estado da execução a apontar para uma execução eliminada/expirada. O motor devolve 404; pull comunica isso de forma clara. Elimine ~/.lingo/runs/<hash>.json e volte a executar push.
  • Motor diferente em .lingo/config.json daquele em que a execução foi criada. Incompatibilidade de ID do motor — a CLI devolve um erro com os IDs. Volte a executar push no motor atual.