10 puan yazan levish 2025-09-05 | 2 yorum | WhatsApp'ta paylaş

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 union stratejisiyle değişiklikleri birleştirebilir
  • git merge-file testleriyle %100 aynı şekilde çalışır

Bağlantılar:

Başkaları için de faydalı olabilir diye paylaşmak istedim!

2 yorum

 
jamiecha 2025-09-06

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%

 
levish 2025-09-06

WSL'de test betiğinin kullandığı git'in argümanlarının farklı olduğunu hatırlıyorum.