Actualmente estoy trabajando en una herramienta de generación de código fuente. Para asegurarme de que mis cambios no introducen ningún error nuevo, un diff
entre el resultado del programa antes y después de mis cambios sería, en teoría, una herramienta valiosa.
Sin embargo, esto resulta ser más difícil de lo que uno podría pensar, porque la herramienta genera líneas donde el orden no importa (como import
declaraciones, declaraciones de funciones, ...) de una manera ordenada de forma semi aleatoria. Debido a esto, la salida de diff
está abarrotada de muchos cambios que, de hecho, son solo líneas movidas a otra posición en el mismo archivo.
¿Hay alguna manera de hacer que diff ignore estos movimientos y solo muestre las líneas que realmente se han agregado o eliminado?
diff
herramienta separar movimientos válidos de los inválidos, ya que el orden de las instrucciones en el código es importante y los casos en que esto no es cierto son limitados (importaciones, declaración de funciones y clases, etc.)Respuestas:
Puede hacer un simple diff, almacenar el resultado en algún lugar (para evitar otro diff), recorrer las líneas en cualquiera de las versiones y luego eliminarlas del otro lado.
Esto generó un proyecto separado para el código de trabajo. El código.
fuente
/tmp/old
y/tmp/new
no se querrían resultados de diferencia ya que solo hay líneas que se han movido. Sin embargo, este código produce resultados.Puedes intentar ordenarlos primero. Algo como:
Bash (y zsh) puede hacer esto en una línea con la sustitución del proceso
fuente
Parece que tienes control sobre la herramienta. Luego haga que su salida sea predecible: en lugar de emitir declaraciones en un orden semialeatorio, use (por ejemplo) el orden alfabético como último recurso. Esto no solo tendrá el beneficio de eliminar el crujido inútil de las diferencias, sino también de hacer que la salida de la herramienta sea más fácil de leer y verificar para un ser humano.
fuente
Si el archivo está estructurado en secciones, son solo las secciones que están fuera de orden, y existe una expresión regular que puede usar para reconocer el encabezado de la sección, puede dividir los archivos en sus secciones y luego comparar las secciones por pares.
Por ejemplo, acabo de hacer esto en dos volcados de MySQL para compararlos después de que algunos de los nombres de la base de datos hayan cambiado de mayúsculas y minúsculas (y, por lo tanto, el volcado los enumeró en un orden diferente):
fuente