10 pontos por levish 2025-09-05 | 2 comentários | Compartilhar no WhatsApp

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:

Achei que isso também poderia ser útil para outras pessoas, então estou compartilhando!

2 comentários

 
jamiecha 2025-09-06

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%

 
levish 2025-09-06

Lembro que, no WSL, os argumentos do git usados pelo script de teste eram diferentes.