Autor

Alejandro Alcalde

Data Scientist and Computer Scientist. Creator of this blog.

Más artículos de Alejandro Alcalde | Porfolio

Llevo unos cuantos años usando DWM, incluso creé un parche que permitía colorear su barra de estado. Hacía bastante tiempo que DWM se había actualizado, pero no me veía capaz de parchear mi versión modificada de DWM con la original, hasta que encontré el repositorio DWM-Patches y aprendí a usar la herramienta quilt.

¿Qué es Quilt?

Según su man:

Quilt is a tool to manage large sets of patches by keeping track of the changes each patch makes. Patches can be applied, un-applied, refreshed, etc. The key philosophical concept is that your primary output is patches.

Es decir, una herramienta que permite administrar grandes cantidades de parches a la vez que guardar un historial de los cambios que cada uno hace. Con quilt es posible aplicar, borrar o modificar cualquier parche.

Uso básico

Veamos un ejemplo sencillo, supongamos el siguiente fichero:

# fichero.txt
linea 1
linea 2
linea 3

fichero.txt será nuestra base.

Crear un parche

Para crear un parche basta con ejecutar quilt new parche1.diff:

$ quilt new parche1.diff
Patch patches/parche1.diff is now on top

Editar el fichero

Y luego especificamos el fichero sobre el que queremos hacer el parche:

$ quilt edit fichero.txt
File fichero.txt added to patch patches/parche1.diff

Ahora podemos empezar a editar fichero.txt, por ejemplo:

linea 1
modificación 1 (Por parche1.diff)
linea 2
linea 3

Ver los cambios

Tras terminar de editar, podemos ver el diff:

$ quilt diff
Index: _drafts/fichero.txt
===================================================================
--- _drafts.orig/fichero.txt
+++ _drafts/fichero.txt
@@ -1,3 +1,4 @@
 linea 1
+modificaci<C3><B3>n 1 (Por parche1.diff)
 linea 2
 linea 3

Generar el parche

Aún no hemos generado el parche, para crearlo ejecutamos:

$ quilt refresh
Refreshed patch patches/parche1.diff

Administrar parches

Listo, ahora en el directorio patches/ deberemos tener un fichero llamado parche1.diff con nuestros cambios. Actualmente solo tenemos uno, si queremos deshacer los cambios y volver al estado original de fichero.txt basta con hacer:

$ quilt pop
Removing patch patches/parche1.diff
Restoring fichero.txt

No patches applied

Como vemos, fichero.txt vuelve a su estado original:

$ cat fichero.txt
linea 1
linea 2
linea 3

Si tuvieramos más de un parche, quilt pop aceptaría el nombre del parche, o la opción -a para eliminar todos los parches. Creemos un segundo parche:

Segundo parche

Antes de crear un segundo parche, debemos aplicar el primero, o si tuvieramos varios, todos, para ello:

$ quilt push -a
Applying patch patches/parche1.diff
patching file fichero.txt

Now at patch patches/parche1.diff

Ahora estamos en condiciones de crear el nuevo parche:

$ quilt new parche2.diff
Patch patches/parche2.diff is now on top

Listar la pila de parches

Ahora que tenemos varios parches, podemos ver el orden en el que se aplican con quilt series

$ quilt series
patches/parche1.diff
patches/parche2.diff

El último en la pila es parche2, ahora mismo está vacío, ya que lo acabamos de crear. Para ester parche vamos a modificar fichero.txt y crear uno nuevo, fichero2.txt:

$ quilt add fichero2.txt
File fichero2.txt added to patch patches/parche2.diff
$ quilt add fichero.txt
File fichero.txt added to patch patches/parche2.diff
$ echo "Linea creada por parche2.diff" >> fichero.txt
$ echo "Nuevo Fichero creado por parche2.diff" > fichero2.txt
$ quilt diff
Index: _drafts/fichero.txt
===================================================================
--- _drafts.orig/fichero.txt
+++ _drafts/fichero.txt
@@ -2,3 +2,4 @@ linea 1
 modificaci<C3><B3>n 1 (Por parche1.diff)
 linea 2
 linea 3
+Linea creada por parche2.diff
Index: _drafts/fichero2.txt
===================================================================
--- /dev/null
+++ _drafts/fichero2.txt
@@ -0,0 +1 @@
+Nuevo Fichero creado por parche2.diff

Ya solo resta aplicar los cambios al parche, con quilt refresh:

$ quilt refresh
Refreshed patch patches/parche2.diff

Cuando terminemos de editar los parches, es recomendable volver al estado inicial, deshaciendo las modificaciones de todos los parches:

$ quilt pop -a
Removing patch patches/parche2.diff
Restoring fichero.txt
Removing fichero2.txt

Removing patch patches/parche1.diff
Restoring fichero.txt

No patches applied

$ ll

-rw-r--r-- 1 hkr hkr   24 Jan 30 18:31 fichero.txt
drwxr-xr-x 2 hkr hkr 4.0K Jan 30 18:29 patches/
drwxr-xr-x 2 hkr hkr 4.0K Jan 30 18:31 .pc/

Para volver a aplicarlos:

$ quilt push -a
Applying patch patches/parche1.diff
patching file fichero.txt

Applying patch patches/parche2.diff
patching file fichero.txt
patching file fichero2.txt

Now at patch patches/parche2.diff

$ ll

-rw-r--r-- 1 hkr hkr   38 Jan 30 18:32 fichero2.txt
-rw-r--r-- 1 hkr hkr   89 Jan 30 18:32 fichero.txt
drwxr-xr-x 2 hkr hkr 4.0K Jan 30 18:29 patches/
drwxr-xr-x 4 hkr hkr 4.0K Jan 30 18:32 .pc/

Para ver un ejemplo real, y más complejo, puedes visitar mi repositorio DWM.

Bibliografía

¿Has visto algún error?: Por favor, ayúdame a corregirlo contactando conmigo o comentando abajo.

Categorías: