नमस्ते 🙂
एक प्रोजेक्ट में string changes का 3-way merge करने की स्थिति आई, और मुझे ऐसी लाइब्रेरी की ज़रूरत थी जो Git के merge-file की तरह काम करे और memory में सीधे strings को merge कर सके।
मैंने मौजूदा लाइब्रेरीज़ देखीं, लेकिन:
- या तो उनमें temporary files का इस्तेमाल अनिवार्य था
- या वे conflicts को Git के समान तरीके से handle नहीं करती थीं
- या वे मेरी इच्छित merge strategy को support नहीं करती थीं।
इसलिए अंततः मैंने libgit2 के xdiff (C code, Git internals जैसा ही) के लिए Rust bindings लिखे।
use threeway_merge::{merge_strings, MergeOptions};
let result = merge_strings(base, ours, theirs, &MergeOptions::default())?;
विशेषताएँ:
- Git के सभी merge algorithms का support (Myers, Patience, Histogram आदि)
- conflict styles का support (normal, diff3, zdiff3)
- एक side को अपने-आप प्राथमिकता देना, या
unionstrategy से changes को combine करना git merge-filetests के साथ 100% समान व्यवहार
लिंक:
- crates.io: https://crates.io/crates/threeway_merge
- source code: https://github.com/levish0/threeway-merge-rs
सोचा कि यह और लोगों के लिए भी उपयोगी हो सकता है, इसलिए साझा कर रहा हूँ!
2 टिप्पणियां
बहुत बढ़िया प्रोजेक्ट है! कोड काफ़ी साफ़-सुथरा है, इसलिए लगता है कि यह FFI से जोड़ने के लिए एक बहुत अच्छा उदाहरण होगा।
लेकिन
cargo testचलाकर देखा तो यह fail हो रहा है—क्या ऐसा इसलिए है क्योंकि मैं Ubuntu on WSL2 पर हूँ? ऐसा सोच रहा हूँ।=== COMPREHENSIVE TEST RESULTS ===
Scenarios tested: 12
Total test combinations: 576
Passing tests: 96
Failing tests: 480
Success rate: 16.7%
मुझे याद है कि WSL में test script जिस git का इस्तेमाल करती थी, उसके arguments अलग थे।