Atualmente, estou trabalhando em uma ferramenta de geração de código fonte. Para garantir que minhas alterações não apresentem novos bugs, um diff
entre a saída do programa antes e depois das minhas alterações seria teoricamente uma ferramenta valiosa.
No entanto, isso acaba sendo mais difícil do que se imagina, porque a ferramenta gera linhas em que a ordem não importa (como import
instruções, declarações de função, ...) de maneira ordenada de maneira semi-aleatória. Por esse diff
motivo , a saída de é cheia de muitas mudanças que, na verdade, são apenas linhas movidas para outra posição no mesmo arquivo.
Existe uma maneira de fazer com que diff ignore esses movimentos e apenas produza as linhas que foram realmente adicionadas ou removidas?
diff
ferramenta seria capaz de separar movimentos válidos dos inválidos, pois a Ordem das instruções no código é importante e os casos em que isso não é verdade são limitados (importações, declaração de funções e classes, etc.)?Respostas:
Você pode fazer uma comparação simples, armazenar o resultado em algum lugar (para evitar outra comparação), percorrer as linhas nas duas versões e removê-las do outro lado.
Isso gerou um projeto separado para o código de trabalho. O código.
fonte
/tmp/old
e/tmp/new
nenhum resultado diff seriam desejados, já que existem apenas linhas que foram movidas. Este código, no entanto, produz resultados.Você pode tentar classificá-los primeiro. Algo como:
O Bash (e zsh) pode fazer isso em uma linha com substituição de processo
fonte
Parece que você tem controle sobre a ferramenta. Em seguida, torne sua saída previsível: em vez de emitir declarações em uma ordem semi-aleatória, use (digamos) a ordem alfabética como último recurso. Isso não apenas terá o benefício de remover detritos inúteis dos diffs, mas também de facilitar a leitura e a verificação da saída da ferramenta para um ser humano.
fonte
Se o arquivo estiver estruturado em seções, são apenas as seções que estão fora de ordem e existe uma expressão regular que você pode usar para reconhecer o cabeçalho da seção, você pode dividir os arquivos em suas seções e comparar as seções aos pares.
Por exemplo, eu fiz isso em dois dumps do MySQL para compará-los depois que alguns nomes de banco de dados mudaram de caso (e, portanto, o dump os listou em uma ordem diferente):
fonte