Pular para conteúdo

AUR-566: fix emite diff unificado padrão com contexto

O problema

O tutorial do AUR-561 mediu que aurumcode fix imprimia hunks sem linhas de contexto (@@ -6,1 +6,1 @@), que o git apply só aceita com --unidiff-zero, enquanto docs/getting-started.md mandava git apply sem a flag.

O que muda

  • internal/apply: BuildPlan(suggestions, fsys) e BuildPatch(suggestions, fsys) leem o arquivo de cada sugestão (por fs.FS; o fix passa os.DirFS(cwd)) e renderizam cada hunk com três linhas de contexto reais (contextLines), cabeçalhos --- a/x / +++ b/x e @@ -l,n +l,n @@ corretos. Sem dependência nova: o diff de linhas continua sendo o LCS próprio.
  • O contexto que o LCS da sugestão já continha é aparado e substituído pelo do arquivo, então cada lado tem no máximo três linhas.
  • Mudanças cujo contexto se toca (distância de até seis linhas) viram um só hunk; o número de linha do lado novo acompanha o deslocamento acumulado.
  • Arquivo sem newline final recebe \ No newline at end of file; acrescentar depois de uma última linha sem newline é recusado (falha fechada).
  • current_code que não bate com o arquivo, linha inexistente, arquivo ausente e sugestões sobrepostas fazem o plano falhar, nomeando arquivo e linha. Isso substitui a mensagem genérica "patch does not apply".
  • CreateFilePatch e DeleteFilePatch renderizam arquivo novo (--- /dev/null) e remoção (+++ /dev/null). O fix não os usa: uma sugestão sem current_code continua sendo descartada (o conteúdo das sugestões não muda, é non-goal); as funções são a API para quem criar ou apagar arquivos.
  • cmd/aurumcode: o fix valida com git apply --check sem flag e imprime o patch sem linha em branco final.
  • docs/getting-started.md, docs/tutorials/revisao.md e a demo demo/tutoriais/revisao (caso fix reexecutado, out/ regravado) usam git apply puro.

Prova

tests/acceptance/AUR-566.sh all: AC-001 (git apply sem flag num repositório de exemplo, correção no arquivo), AC-002 (contexto de três, cabeçalhos, arquivo novo e remoção aplicam com git apply; patch -p1 --dry-run quando patch existe), AC-003 (run.sh --check do tutorial), AC-001-MUT-001 (contexto zero reprova AC-001).

Execução real

bash demo/tutoriais/revisao/run.sh fix na imagem do produto (sem rede, uid do usuário): o patch saiu com @@ -3,6 +3,6 @@, git apply --check e git apply passaram sem flag, e a mesma sugestão, já velha, saiu com 1 e aurumcode fix: app.go:6: working tree does not match the suggestion's current_code.

Limites

Sem patch(1) no contêiner do Go, o patch -p1 --dry-run é exercido só onde o binário existe. O fix usa o diretório corrente como raiz dos caminhos.