threeway_merge – bibliothèque de fusion de chaînes en 3-way 100 % compatible avec Git (Rust)
(crates.io)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 :
- crates.io: https://crates.io/crates/threeway_merge
- code source : https://github.com/levish0/threeway-merge-rs
Je partage ça au cas où cela pourrait aussi être utile à d’autres !
2 commentaires
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%
Si je me souviens bien, les arguments de
gitutilisés par le script de test sous WSL étaient différents.