threeway_merge – biblioteca de merge de strings em 3 vias 100% compatível com Git (Rust)
(crates.io)Olá 🙂
No projeto, houve uma situação em que era necessário fazer um merge em 3 vias de alterações em strings, e eu precisava de uma biblioteca que funcionasse como o merge-file do Git, mas que pudesse mesclar strings diretamente na memória.
Analisei as bibliotecas existentes, mas:
- exigiam o uso de arquivos temporários, ou
- não tratavam conflitos da mesma forma que o Git, ou
- muitas vezes não suportavam a estratégia de merge que eu queria.
Então, no fim, escrevi bindings em Rust para o xdiff do libgit2 (código em C, o mesmo usado internamente pelo Git).
use threeway_merge::{merge_strings, MergeOptions};
let result = merge_strings(base, ours, theirs, &MergeOptions::default())?;
Características:
- Suporte a todos os algoritmos de merge do Git (Myers, Patience, Histogram etc.)
- Suporte a estilos de conflito (
normal,diff3,zdiff3) - Possibilidade de priorizar automaticamente um dos lados ou combinar alterações com a estratégia
union - Funciona de forma 100% idêntica aos testes do
git merge-file
Links:
- crates.io: https://crates.io/crates/threeway_merge
- Código-fonte: https://github.com/levish0/threeway-merge-rs
Achei que isso também poderia ser útil para outras pessoas, então estou compartilhando!
2 comentários
Que projeto legal! O código está bem limpo, então parece ser um ótimo exemplo para integrar via FFI.
Mas quando rodei
cargo test, ele falhou; talvez seja porque estou usando Ubuntu no WSL2?=== COMPREHENSIVE TEST RESULTS ===
Scenarios tested: 12
Total test combinations: 576
Passing tests: 96
Failing tests: 480
Success rate: 16.7%
Lembro que, no WSL, os argumentos do git usados pelo script de teste eram diferentes.