Viernes de terminal: Patch y Diff

Dos de las herramientas esenciales en el desarrollo de software son Patch y Diff. No es un misterio cómo funcionan, pero pienso que este será un post interesante. 

Ambas son muy potentes, y esto es solo como tocar la superficie, tienen más utilidades y otras funciones. Básicamente con estas dos herramientas podemos crear control de versiones,


Diff

Nos referimos a comparación, compara un archivo «original» con el «nuevo», y nos informa de las diferencias que existen entre ellos. Esta herramienta también permite crear archivos .patch que nos sirven para crear parches de nuestros programas.


Patch

Es el comando con el que literalmente «parcheamos» nuestro archivo original, agregando y/o eliminando líneas de acuerdo a las instrucciones contenidas en el archivo .patch


También existe vimdiff, que es una herramienta visual para aplicar los parches sin necesidad de un archivo .patch, ya que compara «original» y «nuevo» y sobre el mismo archivo es posible editar línea por línea o todo el documento. Esto no lo explicaré pero creo que merece una mención.


Ejemplo

Ahora sí lo divertido. ¡Ejemplo!

Este es el caso, tenemos un script genial que pide tu nombre y tu edad, si eres mayor de 18 años te dice que puedes votar, del caso contrario te dice que no puedes votar.

original.sh

#!/bin/bash

echo "Escribe tu nombre: "
read nombre
echo "Escribe tu edad: "
read edad
if [[ 18 -lt $edad ]]
then
echo "Hola $nombre, tienes $edad ¡Y puedes votar!"
else
echo "Hola $nombre, tienes $edad y no puedes votar..."
fi
Imagen del código en Vim

Imagen del código en Vim

Listo, aquí se muestra el script en ejecución:

Parece que todo funciona bien

Parece que todo funciona bien

Entonces, como buenos usuarios que somos, compartimos nuestro script a un amigo :), pero nos llega un mensaje diciendo que tiene una falla, que cuando tiene 18 dice que no puede votar cuando sí debería.

Error de lógica :(

Error de lógica 

Ahora nos ponemos a corregir el pequeño error y a hacer unas cuantas modificaciones…

nuevo.sh

#!/bin/bash

maxEdad=18

echo "Escribe tu nombre: "; read nombre
echo "Escribe tu edad: "; read edad
if [[ $maxEdad -le $edad ]]; then
    echo "Hola $nombre, tienes $edad años ¡Y puedes votar!"
else
    echo "Hola $nombre, tienes $edad años y no puedes votar..."
fi
exit 0
Código nuevo escrito en Vim

Código nuevo escrito en Vim

Supongamos que el script es muy pesado. Entonces, para no mandar de nuevo todo el script, creamos un .patch 

$ diff -u original.sh nuevo.sh > parche.patch

Y ahora tenemos nuestro parche. Acá una vista en Vim:

Así se ven las instrucciones de un .patch. En blanco las líneas que no se modificaron, en azul las eliminadas, en naranja las agregadas.

Así se ven las instrucciones de un .patch. En blanco las líneas que no se modificaron, en azul las eliminadas, en naranja las agregadas.

Y para aplicarlo simplemente usamos el archivo .patch en el script a parchar. Acá se llama originalAmigo.sh, que es una copia exacta del script original.sh

Script del amigo

Script del amigo

$ patch originalAmigo.sh < parche.patch

Y esto nos deja nuestro archivo originalAmigo.sh así:

Script del amigo después de aplicar el parche

Script del amigo después de aplicar el parche

Como pueden ver es muy fácil obtener los diff y aplicar los patch. De mi parte es todo.

Saludos gente, nos leemos el próximo viernes.