Hallo 🙂
In einem Projekt gab es eine Situation, in der String-Änderungen per 3-Way-Merge zusammengeführt werden mussten. Dafür brauchte ich eine Bibliothek, die wie git merge-file arbeitet und Strings direkt im Speicher zusammenführen kann.
Ich habe mir bestehende Bibliotheken angesehen, aber dabei stellte sich heraus, dass sie oft:
- zwingend temporäre Dateien verwenden mussten oder
- Konflikte nicht auf die gleiche Weise wie Git behandelten oder
- die gewünschten Merge-Strategien nicht unterstützten.
Deshalb habe ich schließlich Rust-Bindings für libgit2s xdiff (C-Code, identisch mit Gits internem Verhalten) geschrieben.
use threeway_merge::{merge_strings, MergeOptions};
let result = merge_strings(base, ours, theirs, &MergeOptions::default())?;
Funktionen:
- Unterstützung für alle Merge-Algorithmen von Git (Myers, Patience, Histogram usw.)
- Unterstützung für Konfliktstile (
normal,diff3,zdiff3) - Eine Seite kann automatisch bevorzugt ausgewählt oder Änderungen per
union-Strategie kombiniert werden - Verhält sich zu 100 % identisch zu den Tests von
git merge-file
Links:
- crates.io: https://crates.io/crates/threeway_merge
- Quellcode: https://github.com/levish0/threeway-merge-rs
Ich dachte, das könnte vielleicht auch für andere nützlich sein, und wollte es deshalb teilen!
2 Kommentare
Ein tolles Projekt! Der Code ist sauber, daher scheint es ein sehr gutes Beispiel dafür zu sein, wie man es per FFI anbindet.
Allerdings schlägt
cargo testfehl, als ich es ausgeführt habe — vielleicht liegt es daran, dass ich Ubuntu unter WSL2 nutze?=== COMPREHENSIVE TEST RESULTS ===
Scenarios tested: 12
Total test combinations: 576
Passing tests: 96
Failing tests: 480
Success rate: 16.7%
Soweit ich mich erinnere, unterschieden sich die Argumente von
git, das vom Testskript unter WSL verwendet wurde.