Guia de 10 minutos de diff y patch

Situación uno: estas tratando de compilar un paquete desde la fuente y descubres que alguien ya ha hecho el trabajo por ti de modificarlo ligeramente para compilar en tu sistema. Ellos dispusieron su trabajo en forma de parche (“patch” en inglés), pero no estás seguro de como hacer uso de éste. La respuesta es que aplicas el parche al código original con una herramienta de línea de comandos llamada, adecuadamente, patch.

Situación dos: bajaste el código fuente de un paquete open source y despues de más o menos una hora de editarlo, lograste compilarlo en tu sistema. Te gustaría que tu trabajo esté disponible para otros programadores, o para los autores del paquete, sin tener que redistribuir el todo paquete modificado. Ahora estás en la situación donde requieres crear tu propio parche, y la herramienta que necesitas es diff (de diferencia en inglés).

Esta es una guia rápida para diff y patch que te ayudará en esas situaciones, mediante la descripción de las herramientas más frecuentemente usadas. Te dice lo suficiente para empezar de la manera correcta. Despues, puedes aprender los pormenores de diff y patch en tu tiempo libre, usando las páginas del manual.

Aplicando parches con patch

Para aplicar un parche a un solo archivo, cambiate al directorio donde esta localizado el archivo e invoca a patch:

patch < foo.patch

Estas instrucciones asumen que el parche esta distribuido en un formato unificado, que identifica al archivo al cual el parche debe ser aplicado. Sino, puedes especificar el archivo desde la línea de comandos:

patch foo.txt < bar.patch

Aplicar parches a directorios enteros (quizás el caso más común) es similar, pero hay que tener cuidado acerca de elegir un “nivel p”. Lo que esto quiere decir es que, dentro de los archivos de parches, los archivos a ser parcheados se identifican por las rutas de acceso, las cuales pueden ser diferentes ahora que los archivos estan localizados en tu computadora en lugar de la computadora donde se creó el parche. El nivel p indica al parche que ignore partes de la ruta de acceso a fin de que pueda identificar correctamente los archivos. La mayoría de las veces servirá un nivel p de uno, así que usa:

patch -p1 < baz.patch

Debes cambiar al nivel superior del directorio fuente antes de ejecutar este comando. Si un nivel de parche de uno no identifica correctamente ningún archivo para parchear, revisa el archivo del parche en busca de los nombres de los archivos. Si ves un nombre como:

/users/stephen/package/src/net/http.c

y estas trabajando en un directorio que contiene net/http.c, usa

patch -p5 < baz.patch

En general, cuenta uno por cada separador (caracter slash) que remuevas desde el principio de la ruta, hasta que lo que quede sea la ruta que existe en tu directorio de trabajo. La cuenta alcanzada es el nivel p.

Para remover un parche, usa la opción -R, por ejemplo

patch -p5 -R < baz.patch

Creando parches con diff

Usar diff es simple si se trabaja con archivos individuales o directorios fuentes enteros. Para crear un parche de un único archivo, usa la forma:

diff -u original.c new.c > original.patch

Para crear un parche de un árbol fuente entero, haz una copia del árbol:

cp -R original new

Haz cualquier cambio requerido en el directorio new/. Entonces crea un parche con el siguiente comando:

diff -rupN original/ new/ > original.patch

Esta es toda la información que necesitas para iniciarte con diff y patch. Para más información usa:

man diff
man patch

Texto original de Sthepen Jungels, puedes leerlo en inglés aquí

Deja una respuesta