2010-10-31 10 views
10

Dans le cadre d'un projet plus vaste, je veux pouvoir prendre deux corps de texte et les transmettre à un algorithme de fusion qui renvoie soit un résultat fusionné automatiquement (dans les cas où les changements ne sont pas contradictoires) potentiellement) produit un document texte unique avec les modifications en conflit mises en évidence. Fondamentalement, je veux juste une manière programmatique de faire ce que chaque système de contrôle de source sur la planète fait intérieurement, mais j'ai du mal à le trouver. Il y a des tonnes de GUI visuelles pour faire ce genre de chose qui dominent mes résultats de recherche, mais aucun d'entre eux ne semble rendre facilement accessible l'algorithme de fusion de base. Est-ce que tout le monde s'appuie sur un algorithme/une bibliothèque commune et bien comprise et que je ne connais pas le nom, alors j'ai du mal à le chercher? Est-ce que c'est un peu mineur sur diff et je devrais chercher des bibliothèques diff au lieu de bibliothèques de fusion?Comment fusionner par programmation des fichiers texte avec des conflits potentiels (ala git ou svn, etc.)?

Les bibliothèques Python seraient très utiles, mais je peux vivre avec le surcoût de l'interfaçage avec une autre bibliothèque (ou une solution de ligne de commande) si je le dois; cette opération devrait être relativement peu fréquente.

+0

Les fusions automatiques ne sont pas sûres, car elles ne comprennent pas l'intention du programmeur (pluriel); Il n'y a pas de garantie qu'un fichier "fusionné" fonctionne et encore moins fonctionne comme prévu par quelqu'un. Les systèmes de contrôle de la source en sortent en supposant implicitement que l'utilisateur va de nouveau essayer de nouveau (bien que cela se produise est une autre question). Comment utiliseriez-vous les résultats d'une fusion automatique? –

+0

Dans ce cas, je ne fusionne pas de code, je suis en train de synchroniser des fichiers texte qui peuvent avoir été modifiés alors qu'ils sont déconnectés du serveur. Lorsque le client hors ligne se reconnecte, j'ai besoin de comparer leur version locale avec la version du serveur. Les vrais conflits non fusionnables seront rares en raison de la conception de l'application, mais ils se produiront occasionnellement et j'ai juste besoin de savoir quand ils se produisent. Je ne m'attends pas à ce que l'auto-fusion soit parfaite, juste pour m'avertir quand elle échoue et me laisser dégrader gracieusement sans perdre le contenu du serveur ou du client dans le processus. – drewww

+0

Des questions comme celles-ci sont la raison pour laquelle j'aime StackOverflow. La qualité de la communauté ici est incroyable! – ehfeng

Répondre

9

Vous recherchez probablement des algorithmes de fusion comme la fusion à 3 voies, que vous pouvez trouver dans de nombreux projets open source, par exemple dans le bazar VCS (merge3.py source).

+0

Ah, ouais, je pense que c'est exactement la phrase magique dont j'avais besoin! Je vais devoir fouiller dans ces différentes versions pour voir ce qui est facilement extractible/abstrait de son contexte, mais un premier passage à travers des regards vraiment prometteurs. Merci! – drewww

1

Avez-vous vérifié sur difflib

+1

Cela semble puissant, mais il me semble qu'il ne peut pas réellement faire la partie fusion du processus, juste la partie diff. Je pourrais être capable de construire un système de fusion au-dessus de SequenceMatcher, mais cela semble être un grand pas. – drewww

+0

Si vous le souhaitez, vous pouvez extraire le code de fusion hors fusion. –

Questions connexes