6P by levish 3일전 | ★ favorite | 댓글 2개

안녕하세요 🙂

프로젝트에서 문자열 변경을 3-way merge 해야 하는 상황이 있었는데, Git의 merge-file처럼 동작하면서 메모리에서 바로 문자열을 병합할 수 있는 라이브러리가 필요했습니다.

기존 라이브러리들을 살펴봤지만:

  • 임시 파일을 꼭 써야 했거나
  • Git과 동일한 방식으로 충돌을 처리하지 않거나
  • 원하는 병합 전략을 지원하지 않는 경우가 많았습니다.

그래서 결국 libgit2의 xdiff(C 코드, Git 내부와 동일) 에 대한 Rust 바인딩을 작성했습니다.

use threeway_merge::{merge_strings, MergeOptions};  
  
let result = merge_strings(base, ours, theirs, &MergeOptions::default())?;  

특징:

  • Git의 모든 병합 알고리즘 지원 (Myers, Patience, Histogram 등)
  • 충돌 스타일 지원 (normal, diff3, zdiff3)
  • 한쪽을 자동으로 우선 선택하거나, union 전략으로 변경 사항 결합 가능
  • git merge-file 테스트와 100% 동일하게 동작

링크:

혹시 다른 분들께도 유용할 것 같아 공유합니다!

멋진 프로젝트네요! 코드가 깔끔해서 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%

WSL에서 테스트 스크립트가 사용하는 git의 인수가 달랐던 것으로 기억합니다