10 puntos por levish 2025-09-05 | 2 comentarios | Compartir por WhatsApp

Hola 🙂

En un proyecto tuve una situación en la que necesitaba hacer un 3-way merge de cambios en cadenas, y necesitaba una biblioteca que funcionara como merge-file de Git pero que pudiera fusionar cadenas directamente en memoria.

Revisé bibliotecas existentes, pero:

  • requerían usar archivos temporales sí o sí, o
  • no manejaban los conflictos de la misma forma que Git, o
  • en muchos casos no soportaban la estrategia de fusión que necesitaba.

Así que al final escribí bindings en Rust para xdiff de libgit2 (código en C, igual al interior de Git).

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

Características:

  • Soporta todos los algoritmos de fusión de Git (Myers, Patience, Histogram, etc.)
  • Soporta estilos de conflicto (normal, diff3, zdiff3)
  • Permite priorizar automáticamente un lado o combinar cambios con la estrategia union
  • Funciona de forma 100% idéntica a las pruebas de git merge-file

Enlaces:

¡Lo comparto por si también le puede servir a alguien más!

2 comentarios

 
jamiecha 2025-09-06

¡Qué proyecto tan genial! El código está tan limpio que parece un muy buen ejemplo para integrarlo vía FFI.
Pero al ejecutar cargo test falla; me pregunto si será porque estoy en Ubuntu sobre 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

Recuerdo que en WSL los argumentos de git que usaba el script de prueba eran distintos.