Ubuntu logo

Packaging Guide

8. Parches a los paquetes

A veces, los mantenedores de paquetes de Ubuntu tienen que cambiar el código fuente recibido desde aguas arriba para que funcione correctamente en Ubuntu. Ejemplos de esto incluyen parches aguas arriba que no han llegado todavía a la versión emitida, o cambios al sistema de compilación aguas arribas que son necesarios únicamente para compilarlos en Ubuntu. Se podría cambiar el código recibido de aguas arriba directamente, pero al hacerlo que dificulta la eliminación de los parches posteriormente cuando se hayan incorporado los cambios aguas arriba, o extraer el cambio para enviarlo al proyecto aguas arriba. En su lugar, se mantienen los cambios como parches independientes, en forma de archivos de diferencias (diff).

Hay varias formas diferentes de gestionar los parches de paquetes de Debian, aunque afortunadamente se está estandarizando en un único sistema, Quilt, que se usa ya para la mayoría de los paquetes.

Let’s look at an example package, kamoso in Trusty:

$ bzr branch ubuntu:trusty/kamoso

Los parches se mantienen en debian/patches. Este paquete tiene un parche kubuntu_01_fix_qmax_on_armel.diff para arreglar un fallo de compilación en ARM. Al parche se le ha dado un nombre descriptivo de lo que hace, un número para mantener los parches ordenados (dos parches se puede solapar si cambian el mismo archivo) y en este caso el equipo de Kubuntu añade su propio prefijo para mostrar que el parche proviene de ellos en lugar de venir de Debian.

El orden de los parches a aplicar se mantiene en debian/patches/series.

8.1. Parches con Quilt

Antes de comenzar a trabajar con Quilt necesita indicarle dónde encontrar los parches. Añádalo a su archivo ~/.bashrc:

export QUILT_PATCHES=debian/patches

Y como fuente el archivo para aplicar la nueva exportación:

$ . ~/.bashrc

Por defecto todos los parches ya están aplicados a las extracción UDD o a los paquetes descargados. Puede comprobarlo con:

$ quilt applied
kubuntu_01_fix_qmax_on_armel.diff

Si quería eliminar el parche debería ejecutar pop:

$ quilt pop
Removing patch kubuntu_01_fix_qmax_on_armel.diff
Restoring src/kamoso.cpp

No patches applied

Y para aplicar un parche use push:

$ quilt push
Applying patch kubuntu_01_fix_qmax_on_armel.diff
patching file src/kamoso.cpp

Now at patch kubuntu_01_fix_qmax_on_armel.diff

8.2. Añadir un nuevo parche

Para añadir un nuevo parche necesita indicarle a Quilt que cree un nuevo parche, qué archivos debería cambiar ese parche, editar los archivos y refrescar el parche:

$ quilt new kubuntu_02_program_description.diff
Patch kubuntu_02_program_description.diff is now on top
$ quilt add src/main.cpp
File src/main.cpp added to patch kubuntu_02_program_description.diff
$ sed -i "s,Webcam picture retriever,Webcam snapshot program,"
src/main.cpp
$ quilt refresh
Refreshed patch kubuntu_02_program_description.diff

El paso quilt add es importante, si lo olvida los archivos no terminarán en el parche.

El cambio estará ahora en debian/patches/kubuntu_02_program_description.diff y en el archivo series se habrá añadido el parche. Ahora debería añadir el archivo al empaquetado:

$ bzr add debian/patches/kubuntu_02_program_description.diff
$ bzr add .pc/*
$ dch -i "Add patch kubuntu_02_program_description.diff to improve the program description"
$ bzr commit

Quilt mantiene sus metadatos en el directorio .pc/, así que actualmente necesita añadirlo también al empaquetado. Esto debería mejorarse en el futuro.

Como regla general debería tener cuidado al añadir parches a programas a menos que lleguen desde aguas arriba, frecuentemente hay una buena razón para que el cambio no se haya hecho todavía. El ejemplo anterior cambia una cadena de la interfaz de usuario por ejemplo, así que invalidaría todas las traducciones. Si duda, pregunte al autor aguas arriba antes de añadir el parche.

8.3. Cabeceras de parche

Le recomendamos que etiquete cada parche con cabeceras DEP-3 añadiéndolas al comienzo de cada archivo de parche. Estas son algunas de las cabeceras que puede usar:

Description:Description of what the patch does. It is formatted like Description field in debian/control: first line is short description, starting with lowercase letter, the next lines are long description, indented with a space.
Author:

Quién escribió el parque (por ejemplo, «Juana Nadie <empaquetador@ejemplo.com>”).

Origin:

De dónde proviene el parche (por ejemplo, «upstream», aguas arriba), cuando no se indica el autor (Author).

Bug-Ubuntu:

Un enlace al error en Launchpad, prefiriéndose una forma corta (como https://bugs.launchpad.net/bugs/XXXXXXX). Si existen tambien errores aguas arriba o , añadir cabeceras Bug o Bug-Debian.

Forwarded:

Si el parche se reenvió aguas arriba. Uno de «yes» (sí), «no» (no) o «not-needed» (no necedsario).

Last-Update:

Fecha de la última revisión (en formato «YYYY-MM-DD»).

8.4. Actualizar a nuevas versiones de aguas arriba

Para actualizar a la nueva versión, puede usar la orden bzr merge-upstream:

$ bzr merge-upstream --version 2.0.2 https://launchpad.net/ubuntu/+archive/primary/+files/kamoso_2.0.2.orig.tar.bz2

Cuando ejecute esa orden, se des-aplicarán todos los parches, porque pueden quedarse obsoletos. Podría ser necesario refrescarlos para que se adapten al nuevo código fuentes aguas arriba o deban ser eliminados completamente. Para comprobar posibles problemas, aplique los parches uno a uno:

$ quilt push
Applying patch kubuntu_01_fix_qmax_on_armel.diff
patching file src/kamoso.cpp
Hunk #1 FAILED at 398.
1 out of 1 hunk FAILED -- rejects in file src/kamoso.cpp
Patch kubuntu_01_fix_qmax_on_armel.diff can be reverse-applied

Si puede ser aplicado a la inversa significa que el parche ya ha sido aplicado aguas arriba, de forma que ya se puede borrar:

$ quilt delete kubuntu_01_fix_qmax_on_armel
Removed patch kubuntu_01_fix_qmax_on_armel.diff

Luego continúe:

$ quilt push
Applied kubuntu_02_program_description.diff

Es una buena idea hacer un refresco, lo que actualizará el parche relativo a los fuentes cambiados aguas arriba:

$ quilt refresh
Refreshed patch kubuntu_02_program_description.diff

Luego confirme como siempre:

$ bzr commit -m "new upstream version"

8.5. Hacer que un paquete use Quilt

Los paquetes modernos usan Quilt de forma predeterminada, están incluido en el formato de empaquetado. Compruebe debian/source/format para asegurarse que pone 3.0 (quilt).

Los paquetes más antiguos que usen el formato fuente 1.0 necesitarán usar Quilt explícitamente, normalmente incluyendo un archivo makefile en debian/rules.

8.6. Configurando Quilt

Puede usar el archivo ~/.quiltrc para configurar quilt. Estas son algunas opciones que pueden resultar útiles para usar quilt con paquetes debian:

# Set the patches directory
QUILT_PATCHES="debian/patches"
# Remove all useless formatting from the patches
QUILT_REFRESH_ARGS="-p ab --no-timestamps --no-index"
# The same for quilt diff command, and use colored output
QUILT_DIFF_ARGS="-p ab --no-timestamps --no-index --color=auto"

8.7. Otros sistemas de parches

Otros sistemas de parches que se usan por los paquetes incluyen dpatch y cdbs simple-patchsys, los cuales funcionan de forma similar a Quilt, manteniendo los parches en debian/patches, pero emplean órdenes distintas para aplicar, des-aplicar o crear parches. Puede averiguar qué sistema de parches se usa por un paquete mediante la orden what-patch (del paquete ubuntu-dev-tools). Puede usar edit-patch, como se ha mostrado en capítulos previos, como una manera fiable de trabajar con todos los sistemas.

En paquetes todavía más antiguos los cambios se incluirán directamente en los fuentes y los mantendrán el archivo fuente diff.gz. Esto complica la actualización a nuevas versiones de aguas arribas o distinguir entre parches por lo que lo mejor es evitarlo.

No cambie el sistema de parches de un paquete sin haberlo discutido con el mantenedor de Debian o el equipo pertinente de Ubuntu. Si no existe un sistema parches no tenga problemas en añadir Quilt.