สวัสดีครับ 🙂
ในโปรเจกต์มีสถานการณ์ที่ต้องทำ 3-way merge กับการเปลี่ยนแปลงของสตริง จึงต้องการไลบรารีที่ทำงานคล้าย Git merge-file และสามารถผสานสตริงได้โดยตรงในหน่วยความจำ
ได้ลองดูไลบรารีที่มีอยู่แล้ว แต่พบว่า:
- จำเป็นต้องใช้ไฟล์ชั่วคราวเสมอ หรือ
- จัดการ conflict ไม่เหมือนกับ Git หรือ
- หลายตัวไม่รองรับกลยุทธ์การผสานที่ต้องการ
สุดท้ายจึงได้เขียน Rust binding สำหรับ xdiff ของ libgit2 (โค้ด C และเหมือนกับภายในของ Git ทุกประการ) ขึ้นมา
use threeway_merge::{merge_strings, MergeOptions};
let result = merge_strings(base, ours, theirs, &MergeOptions::default())?;
คุณสมบัติ:
- รองรับอัลกอริทึมการผสานทั้งหมดของ Git (Myers, Patience, Histogram เป็นต้น)
- รองรับรูปแบบ conflict (normal, diff3, zdiff3)
- สามารถเลือกฝั่งใดฝั่งหนึ่งโดยอัตโนมัติ หรือรวมการเปลี่ยนแปลงด้วยกลยุทธ์ union ได้
- ทำงานตรงกับการทดสอบของ
git merge-fileแบบ 100%
ลิงก์:
- crates.io: https://crates.io/crates/threeway_merge
- ซอร์สโค้ด: https://github.com/levish0/threeway-merge-rs
คิดว่าน่าจะมีประโยชน์กับคนอื่นด้วย เลยนำมาแชร์ครับ!
2 ความคิดเห็น
เป็นโปรเจ็กต์ที่ยอดเยี่ยมมาก! โค้ดสะอาดมากจนดูเหมือนจะเป็นตัวอย่างที่ดีมากสำหรับการเชื่อมต่อผ่าน FFI
แต่พอลองรัน
cargo testดูแล้วกลับล้มเหลว ไม่แน่ใจว่าเป็นเพราะผมใช้ Ubuntu on WSL2 หรือเปล่า=== COMPREHENSIVE TEST RESULTS ===
Scenarios tested: 12
Total test combinations: 576
Passing tests: 96
Failing tests: 480
Success rate: 16.7%
เท่าที่จำได้ เหมือนว่าอาร์กิวเมนต์ของ
gitที่สคริปต์ทดสอบใช้บน WSL จะแตกต่างกัน