Merhaba 🙂
Projede string değişikliklerini 3 yönlü merge etmem gereken bir durum vardı ve Git'in merge-file komutu gibi çalışırken string'leri doğrudan bellekte birleştirebilen bir kütüphaneye ihtiyacım oldu.
Mevcut kütüphanelere baktım ama çoğu durumda:
- mutlaka geçici dosya kullanmak gerekiyordu ya da
- çatışmaları Git ile aynı şekilde ele almıyordu ya da
- istediğim birleştirme stratejisini desteklemiyordu.
Bu yüzden sonunda libgit2'nin xdiff'i (C kodu, Git'in içiyle aynı) için Rust binding'leri yazdım.
use threeway_merge::{merge_strings, MergeOptions};
let result = merge_strings(base, ours, theirs, &MergeOptions::default())?;
Özellikler:
- Git'in tüm birleştirme algoritmalarını destekler (Myers, Patience, Histogram vb.)
- Çatışma stillerini destekler (normal, diff3, zdiff3)
- Bir tarafı otomatik olarak öncelikli seçebilir veya
unionstratejisiyle değişiklikleri birleştirebilir git merge-filetestleriyle %100 aynı şekilde çalışır
Bağlantılar:
- crates.io: https://crates.io/crates/threeway_merge
- Kaynak kod: https://github.com/levish0/threeway-merge-rs
Başkaları için de faydalı olabilir diye paylaşmak istedim!
2 yorum
Harika bir proje! Kod temiz olduğu için FFI ile bağlamak adına çok iyi bir örnek olacak gibi görünüyor.
Ama
cargo testçalıştırdığımda başarısız oluyor; acaba benim ortamım Ubuntu on WSL2 olduğu için mi diye düşünüyorum.=== COMPREHENSIVE TEST RESULTS ===
Scenarios tested: 12
Total test combinations: 576
Passing tests: 96
Failing tests: 480
Success rate: 16.7%
WSL'de test betiğinin kullandığı git'in argümanlarının farklı olduğunu hatırlıyorum.