lingo pull

Max PrilutskiyCEO e cofundador3 min de leitura

Busca os outputs do push mais recente e os grava em disco, com detecção de conflitos em relação ao lockfile.

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

Quando usar#

lingo push encerra assim que a execução é enviada, então pull é a forma de coletar as saídas. Execute-o depois de qualquer push sem --wait — e também quando um push com --wait não conseguiu gravar:

  • Fechou o terminal no meio da tradução. Reabra, execute lingo pull — ele retoma de onde a execução parou.
  • Mais tarde no mesmo job de CI. Uma etapa executa lingo push; depois, outra etapa no mesmo runner e checkout executa lingo pull e recupera as saídas. Outras máquinas passam a recebê-las assim que elas são commitadas.
  • Retomou o trabalho depois que a execução terminou, mas antes de push conseguir gravar. Oscilação de rede, processo encerrado — pull conclui o trabalho.

Como ele encontra a execução#

pull lê ~/.lingo/runs/<hash>.json, em que <hash> é derivado do caminho absoluto da raiz do projeto. O arquivo registra o último runId de push. Sem ele, pull retorna 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.

Esse arquivo é específico de cada máquina e fica fora do repositório (consulte Configuration para entender o motivo).

Detecção de conflitos#

Antes de gravar cada destino, pull compara:

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

Se forem iguais → não há edições locais, então é seguro sobrescrever. Se forem diferentes → existem edições locais; fazer pull descartaria essas alterações. pull aborta:

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

O lockfile é a única fonte de verdade aqui — ele rastreia o que o servidor gravou por último, não o conteúdo de origem. Edições manuais em arquivos traduzidos que você queira manter devem ser commitadas (para sobreviverem a pull) ou sobrescritas com --force (para serem substituídas).

Flags#

--force / -f#

Sobrescreve arquivos de destino locais que divergiram do lockfile. Use depois de revisar os conflitos e decidir que a versão do servidor é a canônica (por exemplo, quando outra pessoa fez push de uma atualização de glossário que deve ter prioridade).

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 tocar no sistema de arquivos:

bash
lingo pull --dry-run

Exibe quantos arquivos seriam gravados e quantos já estão em sincronia. Útil no CI para garantir que nada saiu do lugar.

Saída#

Sucesso:

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

Simulação:

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 está pendente ou em andamento, com a mesma exibição de progresso de push --wait, e depois grava as saídas. Uma execução com falha ou cancelada não tem nada para buscar — consulte Execuções, estado e recuperação.)

Casos extremos#

  • Nenhum push anterior. Erro como acima. Não existe o conceito de "fazer pull de traduções que existem em algum lugar no servidor" — pull sempre busca uma execução específica.
  • Estado da execução apontando para uma execução excluída/expirada. O engine retorna 404; pull reporta isso com clareza. Exclua ~/.lingo/runs/<hash>.json e execute push novamente.
  • Engine diferente em .lingo/config.json daquele em que a execução foi criada. Incompatibilidade de ID do engine — a CLI retorna erro com os IDs. Execute push novamente no engine atual.