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:
- crates.io: https://crates.io/crates/threeway_merge
- Código fuente: https://github.com/levish0/threeway-merge-rs
¡Lo comparto por si también le puede servir a alguien más!
2 comentarios
¡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 testfalla; 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%
Recuerdo que en WSL los argumentos de
gitque usaba el script de prueba eran distintos.