2010-08-12 27 views
3

Existe-t-il des outils pouvant effectuer des opérations de définition (union, intersection, différence, etc.) sur les diffs? Par exemple, si j'ai deux différences qui se chevauchent (c.-à-d., Contiennent des mecs avec des changements identiques), j'aimerais être capable de faire des choses comme "obtenir tous les mecs qui ne sont que dans un diff" ou " obtenir tous les mecs qui sont communs aux deux diffs ".Effectuer des opérations de définition sur diffs?

Par exemple, étant donné les deux diffs A et B:

 
$ cat A.diff 
@@ ... @@ 
+ foo 
- bar 
@@ ... @@ 
+ baz 
$ cat B.diff 
@@ ... @@ 
+ foo 
- bar 
@@ ... @@ 
+ bam 

L'une des choses que je voudrais être en mesure de voir est:

 
$ diff_symetric_difference A.diff B.diff 
@@ ... @@ 
+ baz 
@@ ... @@ 
+ bam 
$ diff_subtract A.diff B.diff 
@@ ... @@ 
+ baz 

Je veux le plus souvent quand Je fais des revues de code (par exemple, parce que j'ai examiné diffs A et C, donc je voudrais voir les changements A..D - A - C).

Répondre

1

Je pense que vous pourriez accomplir cela en utilisant diff-match-patch (dmp) pour diff les différences. Utilisez la fonction diff_linesToChars comme décrit sur le mailing list pour pré-traiter les lignes de chaque diff comme des représentations de char et recevoir une table de hachage de caractères en lignes. Passez ensuite ces représentations char à dmp. La sortie sera n'importe quel tableau de suppressions, d'égalité et d'ajouts au format représentatif de caractères. Les suppressions et les ajouts sont les lignes uniques - utilisez la table de hachage pour convertir les données dans ces lignes.