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.
Veámoslo con un paquete de ejemplo, kamoso en Natty:
$ bzr branch ubuntu:natty/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.
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
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.
Patch Headers¶
We recommend that you tag every patch with DEP-3 headers by putting them at the top of patch file. Here are some headers that you can use:
Description: | Description of what the patch does. |
---|---|
Author: | Who wrote the patch (i.e. “Jane Doe <packager@example.com>”). |
Origin: | Where this patch comes from (i.e. “upstream”), when Author is not present. |
Bug-Ubuntu: | A link to Launchpad bug, a short form is preferred (like https://bugs.launchpad.net/bugs/XXXXXXX). If there are also bugs in upstream or Debian bugtrackers, add Bug or Bug-Debian headers. |
Forwarded: | Whether the patch was forwarded upstream. Either “yes”, “no” or “not-needed”. |
Last-Update: | Date of the last revision (in form “YYYY-MM-DD”). |
Actualizar a nuevas versiones de aguas arriba¶
To upgrade to the new version, you can use bzr merge-upstream command:
$ bzr merge-upstream --version 2.0.2 https://launchpad.net/ubuntu/+archive/primary/+files/kamoso_2.0.2.orig.tar.bz2
When you run this command, all patches will be unapplied, because they can become out of date. They might need to be refreshed to match the new upstream source or they might need to be removed altogether. To check for problems, apply the patches one at a time:
$ 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"
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.
Configuring Quilt¶
You can use ~/.quiltrc file to configure quilt. Here are some options that can be useful for using quilt with debian/packages:
# 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"
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.