Je travaille actuellement sur un outil de génération de code source. Pour être sûr que mes modifications n'introduisent aucun nouveau bogue, un diff
entre la sortie du programme avant et après mes modifications serait théoriquement un outil précieux.
Cependant, cela s'avère plus difficile qu'on ne pourrait le penser, car l'outil génère des lignes où l'ordre n'a pas d'importance (comme les import
instructions, les déclarations de fonctions,…) de manière semi-aléatoire. Pour cette raison, la sortie de diff
est encombrée de nombreuses modifications qui ne sont en fait que des lignes déplacées vers une autre position dans le même fichier.
Existe-t-il un moyen de faire en sorte que diff ignore ces mouvements et ne produise que les lignes qui ont vraiment été ajoutées ou supprimées?
diff
outil pourrait-il séparer les mouvements valides des mouvements invalides, car l'ordre des instructions dans le code est important et les cas où cela n'est pas vrai sont limités (importations, déclaration de fonctions et de classes, etc.) ?Réponses:
Vous pouvez faire un simple diff, stocker le résultat quelque part (pour éviter un autre diff), parcourir les lignes dans l'une ou l'autre version, puis supprimer celles de l'autre côté.
Cela a engendré un projet distinct pour le code de travail. Le code.
la source
/tmp/old
et/tmp/new
aucun résultat de comparaison ne serait souhaité car il n'y a que des lignes qui ont été déplacées. Ce code produit cependant des résultats.Vous pouvez essayer de les trier en premier. Quelque chose comme:
Bash (et zsh) peut le faire en une seule ligne avec substitution de processus
la source
Il semble que vous ayez le contrôle de l'outil. Rendez ensuite sa sortie prévisible: au lieu d'émettre des déclarations dans un ordre semi-aléatoire, utilisez (disons) l'ordre alphabétique en dernier recours. Cela aura non seulement l'avantage de supprimer la cruauté inutile des diffs, mais aussi de rendre la sortie de l'outil plus facile à lire et à vérifier pour un être humain.
la source
Si le fichier est structuré en sections, ce ne sont que les sections qui ne fonctionnent pas et qu'il existe une expression régulière que vous pouvez utiliser pour reconnaître l'en-tête de section, vous pouvez diviser les fichiers en leurs sections, puis comparer les sections par paire.
Par exemple, je viens de le faire sur deux vidages MySQL pour les comparer après que certains noms de base de données ont changé de casse (et donc le vidage les a listés dans un ordre différent):
la source