Contexte
Gestion de versions
Le différentiel est une fonction dont l'usage s'est répandu avec la gestion de versions, dans le cadre du génie logiciel. Un système de gestion de versions, tel que Subversion (Collins-Sussman et al., 2004[1]), permet de centraliser le code d'une application (arborescence de fichiers) dans un dépôt (serveur distant en général) afin que plusieurs développeurs puissent synchroniser leurs versions du code. L'action de checkout permet à chaque développeur de récupérer une copie locale du dépôt. Cette copie locale peut être mise à jour avec la version courante du dépôt par l'action d'update. Les modifications effectuées sur la copie locale peuvent être reversées dans le dépôt par l'action de commit. La version courante est alors modifiée, mais le dépôt conserve un historique des anciennes versions des fichiers (on parle de révisions). Il est également possible de créer des branches du dépôt, c'est-à-dire des versions qui évoluent indépendamment du tronc principal (trunk).
Par exemple, soient :
F la version courante d'un fichier ;
A et B deux développeurs travaillant en même temps sur leur copie locale de F ;
FA, resp. FB les versions de F modifiée par A, resp. B.
Si FA est commité en premier, le système informera B, lorsque celui-ci voudra commiter FB, que sa version de F n'est plus à jour. Deux cas de figures sont possibles : les modifications de A et de B sur F peuvent être indépendantes, ou bien concerner les mêmes lignes. Dans le premier cas, le système peut fusionner FA et FB. Dans le second, la fusion ne peut être effectuée automatiquement, amenant B à devoir choisir la bonne version sur chaque ligne conflictuelle. Pour cela, B peut s'appuyer sur la fonction de différentiel (proposée, par exemple, par les clients Subversion tels que TortoiseSVN ou Subclipse) afin de comparer FA et FB. Notons que le différentiel peut aussi être utile à B dans le premier cas, avant de demander au système de fusionner FA et FB (typiquement, pour vérifier que les modifications parallèles sont bien cohérentes entre elles). Dans un cas plus général, une revue de code peut s'appuyer sur le différentiel : par exemple, on cherche à savoir quelle modification a entraîné une régression de l'application.
La gestion de versions s'est depuis étendue au monde du document, par exemple dans les éditeurs bureautiques ou encore les Wiki.
Définitions
Soient D1 et D2 deux documents ou versions/variations d'un même document. Un différentiel, abrégé diff, est un algorithme comparant D1 et D2 et produisant une liste de différences appelée delta. Dans le cas où D2 est comparé par rapport à D1 (et non l'inverse), le delta exprime une liste d'opérations (insertions, suppressions...) à appliquer à D1 pour obtenir D2. Un patch désigne l'algorithme exécutant le delta dans l'ordre prescrit des opérations. Un merge est un algorithme permettant de fusionner D1 et D2 à partir de leur delta, tandis qu'un tree-way merge se base également sur l'ancêtre commun de D1 et de D2, noté D0, et nécessite les deltas de D1 avec D0 d'une part et de D2 avec D0 d'autre part.
Nous nous intéressons ici plus particulièrement au diff XML. En effet, dans les chaînes éditoriales, on a d'une part les formes génératrices encodées en XML, et d'autre part les formes publiées web au format HTML.
Nous appelons forme différentielle la forme permettant la relecture d'un document dans ses différentes versions/variations, en proposant notamment une visualisation des différences entre ces versions/variations. La forme différentielle entre D1 et D2 peut être construite par application sur D1 du delta résultant du diff de D2 par rapport à D1.