Usar diff y patch para generar y aplicar parches

diff y patch son sendos comandos de GNU/Linux para generar y aplicar parches

Antes de nada, echemos un vistazo a la Wikipedia, para saber qué es eso de un parche, cuando estamos en un contexto de informática.

Cuando en informática se habla de un parche informático, refiere a los distintos cambios que se han aplicado a un programa para corregir errores, actualizarlo, eliminar secciones antiguas de software o simplemente añadirle funcionalidad. En informática, un parche consta de cambios que se aplican a un programa, para corregir errores, agregarle funcionalidad, actualizarlo, etc.

Lo entenderemos mejor con un caso práctico. Hace poco eché un vistazo a la documentación en español de GNUHealth, y encontré algunos errores tipográficos.

Creé un parche con las correcciones y se lo envié al desarrollador, lo revisó y decidió aceptarlo e incluir el parche con las correcciones. Como véis no se aplica únicamente a correcciones de errores en programas, puede aplicarse a cualquier tipo de mejora en cualquier tipo de archivo.

Veamos los pasos a seguir con los comandos diff y patch en GNU/Linux para generar dichos parches y aplicarlos.

Antes de nada decir, que este artículo fue escrito por Emiliano aka Linuxitux en su gran web ya tristemente desaparecida linuxito.com.

Yo utilizaba con frecuencia dicho artículo para recordar cómo se hacía el proceso y aunque archive.org nos puede devolver el artículo, no quería que se perdiera, por eso me lo anoto en el blog y lo comparto por si os es de utilidad.

Para este artículo utilizaré el mismo ejemplo que nos compartía Emiliano en su blog. Imaginemos que tenemos el siguiente script en bash, en un archivo llamado actualizar.sh

#!/bin/sh

echo -n "Actualizando el sistema... "

(apt-get update && apt-get -y upgrade) >> /var/log/actualizar.log 2>&1

echo "Finalizado."

Lo primero es mantener el original y trabajar sobre una copia. Por tanto copiaremos ese archivo y le llamaremos por ejemplo: actualizar.sh.nuevo

Editamos esa copia del archivo y lo modificamos a nuestro gusto, añadiendo, modificando o quitando lo que queramos. En nuestro ejemplo quedará así:

#!/bin/sh

echo -n "Actualizando el sistema... "

if (apt-get update && apt-get -y upgrade) >> /var/log/actualizar.log 2>&1 ; then
  echo "Finalizado."
else
  echo "Finalizado con errores."
fi

Creando un parche con diff

Para crear el parche en el que queden reflejados los cambios que hemos realizado en el archivo, utilizaremos el comando diff con la opción -u y guardaremos los cambios en un archivo que acabe en .patch

diff -u actualizar.sh actualizar.sh.nuevo > actualizar.sh.patch

Si tenemos curiosidad, podemos ver el contenido del archivo, que en nuestro ejemplo será algo así:

--- actualizar.sh       2016-12-14 08:07:51.563855405 -0500
+++ actualizar.sh.nuevo 2016-12-14 08:19:59.168150333 -0500
@@ -2,8 +2,10 @@
 
 echo -n "Actualizando el sistema... "
 
-(apt-get update && apt-get -y upgrade) >> /var/log/actualizar.log 2>&1
-
-echo "Finalizado."
+if (apt-get update && apt-get -y upgrade) >> /var/log/actualizar.log 2>&1 ; then
+  echo "Finalizado."
+else
+  echo "Finalizado con errores."
+fi

En el archivo se especifican los cambios realizados, el contexto y líneas donde se realizan y si se añaden líneas (+) o se eliminan (-).

Este archivo con el parche y las mejoras lo podemos enviar por correo al desarrollador de un proyecto y si lo ve correcto y apropiado lo incluirá en el código.

Aplicar un parche con patch

Quien reciba el parche deberá usar el comando patch incluyendo el nombre archivo del código original y el nombre del archivo con el parche:

patch actualizar.sh actualizar.sh.patch 

Con esto, el comando sabe qué hacer en el archivo original para añadir o eliminar lo necesario y así aplicar el parche para incorporar las modificaciones.


Con este método es sencillo enviar mejoras, correcciones a proyectos de software libre, si no tenemos cuenta en el sitio donde hospeden sus repositorios. Siempre preguntando primero si aceptan este tipo de parches.

Gracias a Emiliano por sus años de dedicación al blog, donde compartió gran cantidad de información muy valiosa, y que nos enseñó tanto a muchos que lo leíamos con asiduidad. Sirva este artículo rescatado como homenaje, ya que yo mismo lo consulté varias veces cuando me hizo falta.

¿Y a ti te ha resultado útil?

Me gustaría saber tu opinión. Deja un comentario (Puedes usar MarkDown)

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.