10 points par levish 2025-09-05 | 2 commentaires | Partager sur WhatsApp

Bonjour 🙂

Dans un projet, j’ai eu besoin d’effectuer un 3-way merge de modifications de chaînes, et il me fallait une bibliothèque capable de fonctionner comme git merge-file tout en fusionnant directement des chaînes en mémoire.

J’ai examiné les bibliothèques existantes, mais :

  • elles exigeaient souvent l’utilisation de fichiers temporaires ; ou
  • elles ne géraient pas les conflits de la même manière que Git ; ou
  • elles ne prenaient pas en charge la stratégie de fusion souhaitée.

J’ai donc fini par écrire des bindings Rust pour xdiff de libgit2 (code C, identique à l’interne de Git).

use threeway_merge::{merge_strings, MergeOptions};  
  
let result = merge_strings(base, ours, theirs, &MergeOptions::default())?;  

Caractéristiques :

  • prise en charge de tous les algorithmes de fusion de Git (Myers, Patience, Histogram, etc.)
  • prise en charge des styles de conflit (normal, diff3, zdiff3)
  • possibilité de donner automatiquement la priorité à un côté, ou de combiner les modifications avec une stratégie union
  • comportement 100 % identique aux tests de git merge-file

Liens :

Je partage ça au cas où cela pourrait aussi être utile à d’autres !

2 commentaires

 
jamiecha 2025-09-06

Super projet ! Le code est propre, donc je pense que ce serait un très bon exemple pour l’intégrer via FFI.
Cela dit, quand j’ai lancé cargo test, ça échoue ; je me demande si c’est parce que je suis sur Ubuntu via WSL2.

=== COMPREHENSIVE TEST RESULTS ===
Scenarios tested: 12
Total test combinations: 576
Passing tests: 96
Failing tests: 480
Success rate: 16.7%

 
levish 2025-09-06

Si je me souviens bien, les arguments de git utilisés par le script de test sous WSL étaient différents.