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

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

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 🙁

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

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.

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

$ patch originalAmigo.sh < parche.patch

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

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.


9 comentarios

  1.   Xerix dijo

    Genial, muchas gracias 🙂

  2.   angelblade dijo

    Si deseas un poco de color, usa colordiff ^__^

  3.   eliotime3000 dijo

    Ahora entiendo cómo funcionan los parches en Debian.

  4.   fer_pflores dijo

    Hola, se que se pueden mostrar notificaciones del sistema con notify-send desde la consola, pero lo que quisiera hacer es poder programar a que hora o en cuanto tiempo me muestre una notificacion, hay alguna manera de hacerlo? Uso elementary, el cual tiene su base en Ubuntu 12.04, por si es de ayuda, gracias

    1.    elav dijo

      Pues si se puede hacer usando el cron del sistema 😉

      1.    fer_pflores dijo

        y eso como se puede hacer? apenas aprendí a usar el comando notify-send

        1.    wada dijo

          Puedes buscar cron acá en el blog hay muchos post sobre el 🙂

  5.   Joaquin dijo

    Muy bueno, gracias!

  6.   dhunter dijo

    Siempre uso esto para actualizar el kernel, descargo solo los patch y aplico a los sources, así no tengo que bajar 80mb cada release.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.