10 Punkte von levish 2025-09-05 | 2 Kommentare | Auf WhatsApp teilen

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:

Ich dachte, das könnte vielleicht auch für andere nützlich sein, und wollte es deshalb teilen!

2 Kommentare

 
jamiecha 2025-09-06

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 test fehl, 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%

 
levish 2025-09-06

Soweit ich mich erinnere, unterschieden sich die Argumente von git, das vom Testskript unter WSL verwendet wurde.