10 คะแนน โดย levish 2025-09-05 | 2 ความคิดเห็น | แชร์ทาง WhatsApp

สวัสดีครับ 🙂

ในโปรเจกต์มีสถานการณ์ที่ต้องทำ 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%

ลิงก์:

คิดว่าน่าจะมีประโยชน์กับคนอื่นด้วย เลยนำมาแชร์ครับ!

2 ความคิดเห็น

 
jamiecha 2025-09-06

เป็นโปรเจ็กต์ที่ยอดเยี่ยมมาก! โค้ดสะอาดมากจนดูเหมือนจะเป็นตัวอย่างที่ดีมากสำหรับการเชื่อมต่อผ่าน 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%

 
levish 2025-09-06

เท่าที่จำได้ เหมือนว่าอาร์กิวเมนต์ของ git ที่สคริปต์ทดสอบใช้บน WSL จะแตกต่างกัน