Parchando paquetes con debdiff

Standard

[Bug]Esta y la siguiente entrada originalmente fueron escritos en mi blog, los muevo aqui porque estan mejor relacionados con la tematica de este blog.

Introduccion.

En la ultima version de Ubuntu existe un error en mpd que hace que se detenga al reproducir archivos mp4a, el bug en cuestion esta documentado en varios sitios,  el parche tambien esta disponible e integrado en la ultima version de upstream (upstream es como se llama al proyecto original, Debian es el upstream de Ubuntu y Ubuntu es el downstream de Debian), asi el upstream del paquete mpd puede ser el paquete en Debian si se habla del paquete o el sitio donde se desarrolla mpd si se habla del programa.

Launchpad tambien alberga el error (https://bugs.launchpad.net/ubuntu/+source/mpd/+bug/519787).

Desarrollo

Se puede empezar creando una carpeta para el paquete en cuestion (apt-get source descargara mas de 3 paquetes desde el lugar donde se invoque). Personalmente he creado una carpeta en ~/misc/packages/ubuntu-10.04 y luego un alias ‘ubuntu’ que me ubica en el directorio independientemente de donde este.

$ mkdir mpd; cd mpd #se crea un directorio  para aislar todo
$ sudo apt-get install devscripts ubuntu-dev-tools  cdbs quilt 
$ sudo  apt-get source mpd 

Descarga el codigo fuente de mpd debianizado (esto es, con diffs y archivos de control/rules/patches/etc)

$ sudo  apt-get build-dep mpd 

Descarga las dependencias del paquete para comprobar que funcione despues de hacer cualquier cambio

$ cd  mpd-0.15.4; vim src/algun_archivo.fuente

Y en este punto se modifica el codigo, para este caso particular tuve que hacerlo a mano porque el parche no funcionaba al 100%, pero para otros casos o solo se editan detalles, como cambio de directorios/variables o se aplica el respectivo parche, espero comentar en mi siguiente entrada como hacerlo con quilt , un metodo un poco más elegante. Es indispensable que se tenga una idea clara de como funciona patch y diff (http://www.gnu.org/software/diffutils/manual/diff.html), otra guia un poco mas digerible esta en: (http://andalinux.wordpress.com/2009/08/24/crear-y-aplicar-parches-patches-en-linux/).

Una vez editado se actualiza debian/changelog:

$ dch  -i

La ventaja de editarlo con dch es que agrega automaticamente la version del paquete y tambien el email y la hora en el formato adecuado. La modificación al changelog se hace dependiendo de como se vea el resto, tratando de mantener el estilo. Si esta es la primera entrada, el estilo bien podria ser (para este caso particular):

mpd (0.15.4-1ubuntu4) lucid; urgency=low

* Apply patch from upstream to fix LP: #519787
– usr/decoder/ffmpeg_plugin.c (Debian bug #556198)
ffmpeg: align the output buffer

— chilicuil <chilicuil@i.am>  Mon, 17 May 2010 08:14:46 -0500

Con estilo me refiero a la forma en la que se introducen los comentarios, el esqueleto por decirlo de alguna forma siempre debe ser como se muestra:

paquete -> version del paquete -> version de la distribucion -> urgencia

descripcion muy breve de los errores que cierra, o caracteristicas que integra

descripcion mas extensa, describiendo cada uno de los archivos que se modificaron y que se hizo en cada caso, tambien se vale mencionar errores de otros bugtracks.

La version del paquete tambien tiene algunas consideraciones, como regla general, si el paquete ya existia en Ubuntu (lo mas probable, al hablar de parches), es decir, si termina en ubuntuX, donde X es un numero, se le suma +1, esto ara que apt-get prefiera este paquete sobre el original. Tambien se puede cambiar por algo como ubuntuX~usuarioX, para indicar que es un paquete personal. Cualquiera de las 2 es valida, mas tarde espero que alguien me aclare cuando usar una en lugar de la otra, que yo tampoco lo tengo muy claro.

OPCIONAL:

No hay que olvidar modificar debian/control si el paquete aun no tiene mantenedor en Ubuntu, en ese caso se debe cambiar:

Maintainer:   Original developer <dev@debian.org>

por:

Maintainer:    Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>

XSBC-Originial-Maintainer: Original developer <dev@debian.org>

Eso es todo a partir de aqui se pueden hacer 3 cosas (hasta donde se).

  • Se puede crear un paquete con el codigo (con las instrucciones necesarias para compilarlo) y con el que se aran los debdiff (el formato estandar que se maneja en launchpad para enviar parches).
$  debuild -S; cd .. ; debdiff mpd_0.15.4-1ubuntu3.dsc  \
mpd_0.15.4-1ubuntu4.dsc > mpd_0.15.4-1ubuntu4.debdiff  

El ultimo es el que se envia

  • Se puede generar un archivo con los cambios e instrucciones para compilar, que se puede subir a launchpad para crear un ppa (repositorio personal) que distribuya los *.deb
$  debuild -S -sd #si el paquete ya existia \
en ubuntu, o con -sa si  no existe aun
$ cd ..; dput ppa:chilicuil/pmx  mpd_0.15.4-1ubuntu4.source.changes 

Esto empujara los cambios a launchpad –en codigo fuente, se compilaran los debs finales en la nube

  • O se pueden crear los *.deb en local para su instalación inmediata.
$  debuild

En cuyo caso el *deb aparecera en el directorio superior ($ cd ..), los 3 comandos anteriores firmaran los paquetes con la clave de $DEBEMAIL, si no se desea asi, se tienen que especificar las opciones -us -uc

Al terminar y si no se quiere conservar el paquete, se elimina exceptuando mpd_0.15.4-1ubuntu4.debdiff, para recuperar el entorno o para probar que el parche se aplica sin errores se usa esto:

$ mkdir mpd_nuevo; cd mpd_nuevo
$ sudo  apt-get source mpd; cp ~/mpd/mpd_0.15.4-1ubuntu4.diff  \
~/mpd_nuevo/
$ cd   mpd-0.15.4/  

Cuando se hace apt-get source el paquete es descomprimido, este es el ‘original’ (no es 100% original, puesto que ya esta debianizado)

$ patch -p1 < ../mpd_0.15.4-1ubuntu4.debdiff

El resultado deberia poder volver a general los 3 paquetes descritos con anterioridad.

Los parches se pueden integrar a los reportes de launchpad:

====Resumiendo===

  • Se decarga desde apt-get source el paquete y sus dependencias
  • Se modifica el codigo, reglas, changelog
  • Se crea un paquete fuente y de ahi un parche, o un paquete fuente para subirse a launchpad, o se compila el binario. Claro que tambien se pueden hacer las 3 si se desea.

Referencias:

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s