Estoy buscando una aplicación que pueda comparar dos fuentes de C ++ y encontrar las diferencias significativas en el código (para comparar versiones que pueden haber sido formateadas de manera diferente). Como mínimo, algo que tiene la capacidad de ignorar los cambios en los espacios en blanco, los espacios de tabulación y las nuevas líneas que no afectan la funcionalidad de la fuente (tenga en cuenta que si una nueva línea se considera espacio en blanco depende del idioma , y C y C ++ lo hacen) ) E, idealmente, algo que pueda identificar exactamente todas las diferencias significativas de código. Estoy bajo Ubuntu.
Según diff --help | grep ignore
lo previsto, esperaba diff -bBwZ
hacer razonablemente el trabajo (esperaba obtener algunos falsos negativos, que se abordarán más adelante). Sin embargo, no lo hace.
si tengo los siguientes archivos con fragmentos
test_diff1.txt
else if (prop == "P1") { return 0; }
y test_diff2.txt
else if (prop == "P1") {
return 0;
}
entonces
$ diff -bBwZ test_diff1.txt test_diff2.txt
1c1,3
< else if (prop == "P1") { return 0; }
---
> else if (prop == "P1") {
> return 0;
> }
en lugar de resultados vacíos.
El uso de un formateador de código como "filtro" en ambas entradas puede filtrar estas diferencias, pero luego la salida resultante tendría que estar vinculada a las entradas originales para el informe final de las diferencias para mantener el texto real y los números de línea. Por lo tanto, el objetivo es alcanzable sin la necesidad de un compilador correctamente ... Sin embargo, no sé si hay algo disponible.
¿Se puede alcanzar el objetivo diff
?
De lo contrario, ¿hay una alternativa (preferiblemente, para la línea de comando)?
fuente
En una situación similar, cuando necesitaba comparar dos
git
ramas en forma agnóstica de formato de código, hice esto:ramas temporales creadas:
formateó ambas ramas usando
clang-format
:hizo comparación real:
(le
-w -b
permite ignorar la diferencia de espacio, por si acaso).Puede preferir
uncrustify
sobreclang-format
( se pueden usaruncrustify
'smod_full_brace_if
para forzar la inserción / eliminación de llaves alrededor delif
cuerpo de una sola línea ).Además, si GNU
parallel
no está instalado, úseloxargs
; hace lo mismo, pero un poco más.fuente