{"id":670,"date":"2014-03-20T02:57:37","date_gmt":"2014-03-19T23:57:37","guid":{"rendered":"http:\/\/blog.andresgomez.org\/?p=670"},"modified":"2014-12-30T21:34:21","modified_gmt":"2014-12-30T18:34:21","slug":"quickly-publishing-in-your-ubuntu-ppa","status":"publish","type":"post","link":"https:\/\/blog.andresgomez.org\/es\/2014\/03\/20\/quickly-publishing-in-your-ubuntu-ppa\/","title":{"rendered":"C\u00f3mo publicar r\u00e1pidamente en tu PPA de Ubuntu"},"content":{"rendered":"<p>Esta entrada es, principalmente, unas cuantas notas personales con instrucciones para publicar r\u00e1pidamente un paquete (habitualmente parcheado) en mis propios PPAs.<\/p>\n<h3>Parcheando un paquete existente<\/h3>\n<p>Lo primero es descargar las fuentes del paquete del repositorio que est\u00e1 proporcionando la versi\u00f3n que queremos parchear y cuyo binario tenemos instalado en el sistema.<\/p>\n<p>Por ejemplo, para parchear webkitgtk, si el paquete que est\u00e1 instalado procede directamente de Ubuntu, s\u00f3lo tendremos que comprobar que tenemos el repositorio de fuentes oficial de Ubuntu. Sin embargo, si el paquete procede de otro PPA, tendremos que comprobar que tambi\u00e9n tenemos el repositorio con las fuentes de ese mismo PPA. De no ser as\u00ed, tendremos que descargar los ficheros necesarios de forma manual. Asumamos que el paquete que tenemos instalado procede del <a href=\"https:\/\/launchpad.net\/~tanty\/+archive\/gnome3\" title=\"PPA del GNOME3 Team\" target=\"_blank\">PPA del GNOME3 Team<\/a>:<\/p>\n<pre>\r\n$ cd ~\/ppa\/ && mkdir -p webkitgtk\/gnome3 && cd webkitgtk\/gnome3\r\n$ apt-get source webkitgtk\r\nReading package lists... Done\r\nBuilding dependency tree\r\nReading state information... Done\r\nNOTICE: 'webkitgtk' packaging is maintained in the 'Git' version control system at:\r\ngit:\/\/git.debian.org\/git\/pkg-webkit\/webkit.git\r\nNeed to get 9,440 kB of source archives.\r\nGet:1 http:\/\/ppa.launchpad.net\/gnome3-team\/gnome3\/ubuntu\/ saucy\/main webkitgtk 2.3.2-1ubuntu6~saucy1 (tar) [9,353 kB]\r\nGet:2 http:\/\/ppa.launchpad.net\/gnome3-team\/gnome3\/ubuntu\/ saucy\/main webkitgtk 2.3.2-1ubuntu6~saucy1 (diff) [82.2 kB]\r\nGet:3 http:\/\/ppa.launchpad.net\/gnome3-team\/gnome3\/ubuntu\/ saucy\/main webkitgtk 2.3.2-1ubuntu6~saucy1 (dsc) [4,577 B]\r\nFetched 9,440 kB in 3s (2,769 kB\/s)\r\ngpgv: Signature made Sun 22 Dec 2013 01:34:25 AM EET using RSA key ID 153ACABA\r\ngpgv: Can't check signature: public key not found\r\ndpkg-source: warning: failed to verify signature on .\/webkitgtk_2.3.2-1ubuntu6~saucy1.dsc\r\ndpkg-source: info: extracting webkitgtk in webkitgtk-2.3.2\r\ndpkg-source: info: unpacking webkitgtk_2.3.2.orig.tar.xz\r\ndpkg-source: info: unpacking webkitgtk_2.3.2-1ubuntu6~saucy1.debian.tar.gz\r\ndpkg-source: info: applying 02_notebook_scroll.patch\r\ndpkg-source: info: applying aarch64.patch\r\ndpkg-source: info: applying fix-ppc.diff\r\ndpkg-source: info: applying fix-aarch64.patch\r\ndpkg-source: info: applying remove-use-lockfree-threadsaferefcounted.patch\r\ndpkg-source: info: applying no-jit-build-failure.patch\r\ndpkg-source: info: applying 0001-GTK-Fails-to-build-with-freetype-2.5.1.patch\r\ndpkg-source: info: applying disable-jit-harder.patch\r\ndpkg-source: info: applying fix-llint-c-loop.patch\r\ndpkg-source: info: applying fix-armv7.patch\r\ndpkg-source: info: applying bugzilla_clear_surface.patch\r\ndpkg-source: info: applying ppc64el.patch\r\n$ cd webkitgtk-2.3.2\r\n<\/pre>\n<p>Por si acaso, algo que me gusta hacer es a\u00f1adir el c\u00f3digo descargado a un sistema de control de versiones local con <em>git<\/em>:<\/p>\n<pre>\r\n$ git init\r\n$ git add *\r\n$ git commit -m \"Initial commit\"\r\n...\r\n<\/pre>\n<p>Ahora es el momento de realizar los cambios al c\u00f3digo fuente. Esta es mi principal raz\u00f3n por la que <em>git<\/em> puede resultarnos \u00fatil si es que los cambios no son triviales y necesitamos realizar algo de trabajo para tener una versi\u00f3n funcional. Una vez que hemos finalizado los cambios debemos a\u00f1adirlos al paquete debian como un parche adicional al c\u00f3digo fuente original. Esto lo haremos con <em>dpkg-source<\/em>:<\/p>\n<pre>\r\n$ dpkg-source --commit\r\ndpkg-source: info: local changes detected, the modified files are:\r\n webkitgtk-2.3.2\/Source\/WebKit2\/GNUmakefile.am\r\n webkitgtk-2.3.2\/Source\/WebKit2\/GNUmakefile.list.am\r\n webkitgtk-2.3.2\/Source\/WebKit2\/Shared\/Plugins\/Netscape\/NetscapePluginModule.h\r\n webkitgtk-2.3.2\/Source\/WebKit2\/Shared\/Plugins\/Netscape\/x11\/NetscapePluginModuleX11.cpp\r\n webkitgtk-2.3.2\/Source\/WebKit2\/UIProcess\/Plugins\/gtk\/PluginInfoCache.cpp\r\n webkitgtk-2.3.2\/Source\/WebKit2\/UIProcess\/Plugins\/gtk\/PluginInfoCache.h\r\n webkitgtk-2.3.2\/Source\/WebKit2\/UIProcess\/Plugins\/unix\/PluginInfoStoreUnix.cpp\r\nEnter the desired patch name: 0001-GTK-WK2-Blocks-when-fetching-plugins-information.patch\r\n...\r\n<\/pre>\n<p>Escribimos el nombre del parche y la descripci\u00f3n de los cambios realizados:<\/p>\n<pre>\r\n$ cat debian\/patches\/0001-GTK-WK2-Blocks-when-fetching-plugins-information.patch\r\nDescription: [GTK][WK2] Blocks when fetching plugins information\r\n https:\/\/bugs.webkit.org\/show_bug.cgi?id=115650\r\n .\r\n Patch by Carlos Garcia Campos.\r\n Reviewed by Gustavo Noronha Silva.\r\n .\r\n Use a persistent cache to store the plugins metadata to avoid\r\n having to load all the plugins everytime a plugin is used for the\r\n first time.\r\n .\r\n * GNUmakefile.am:\r\n * GNUmakefile.list.am:\r\n * Shared\/Plugins\/Netscape\/NetscapePluginModule.h:\r\n * Shared\/Plugins\/Netscape\/x11\/NetscapePluginModuleX11.cpp:\r\n (WebKit::NetscapePluginModule::parseMIMEDescription): Make this\r\n method public.\r\n (WebKit::NetscapePluginModule::buildMIMEDescription): Added this\r\n helper to build the MIME description string.\r\n * UIProcess\/Plugins\/gtk\/PluginInfoCache.cpp: Added.\r\n (WebKit::PluginInfoCache::shared):\r\n (WebKit::PluginInfoCache::PluginInfoCache):\r\n (WebKit::PluginInfoCache::~PluginInfoCache):\r\n (WebKit::PluginInfoCache::saveToFileIdleCallback):\r\n (WebKit::PluginInfoCache::saveToFile):\r\n (WebKit::PluginInfoCache::getPluginInfo):\r\n (WebKit::PluginInfoCache::updatePluginInfo):\r\n * UIProcess\/Plugins\/gtk\/PluginInfoCache.h: Added.\r\n * UIProcess\/Plugins\/unix\/PluginInfoStoreUnix.cpp:\r\n (WebKit::PluginInfoStore::getPluginInfo): Check first if we have\r\n metadata of the plugin in the cache and update the cache if we\r\n loaded the plugin to get its metadata.\r\n...\r\n<\/pre>\n<p>Finalmente, modificaremos la informaci\u00f3n de publicaci\u00f3n a\u00f1adiendo o incrementando el digito <em>\u00abnon-maintainer\u00bb<\/em>. Por ejemplo, para este caso la versi\u00f3n del c\u00f3digo descargado es <em>2.3.2-1ubuntu6~saucy1<\/em> por lo que modificaremos la versi\u00f3n a <em>2.3.2-1ubuntu6~saucy1<strong>.1<\/strong><\/em>. Debemos tambi\u00e9n acordarnos de proporcionar el nombre adecuado de distribuci\u00f3n o bien modificarlo al adecuado cuando estemos introduciendo el resumen de los cambios realizados. En este caso la distribuci\u00f3n ser\u00eda <em>saucy<\/em>. Comprueba tambi\u00e9n que est\u00e1s utilizando la direcci\u00f3n de correo electr\u00f3nico adecuada en el resumen de los cambios. En el caso de mis PPAs, uso mi cuenta personal:<\/p>\n<pre>\r\n$ DEBEMAIL=\"mi@cuenta-de.correo\" dch -n -D saucy\r\n$ cat debian\/changelog\r\nwebkitgtk (2.3.2-1ubuntu6~saucy1.1) saucy; urgency=low\r\n\r\n  * Fixes #115650:\r\n    - debian\/patches\/0001-GTK-WK2-Blocks-when-fetching-plugins-information.patch\r\n\r\n -- Andres Gomez <mi@cuenta-de.correo>  Wed, 19 Mar 2014 14:26:19 +0200\r\n...\r\n<\/pre>\n<p>Con esto habremos terminado de modificar el c\u00f3digo fuente del paquete.<\/p>\n<h4>Alternativa mediante la importaci\u00f3n de un parche<\/h4>\n<p>Quiz\u00e1 esta es la forma m\u00e1s limpia y r\u00e1pida de parchear el c\u00f3digo fuente del paquete descargado. En vez de modificar el c\u00f3digo y ejecutar <em>dpkg-source &#8211;commit<\/em>, s\u00edmplemente podemos importar un parch ya existente que se pueda aplicar sin problemas sobre el c\u00f3digo fuente.<\/p>\n<p>Para ello ejecutaremos:<\/p>\n<pre>\r\n$ quilt import \/<ruta_al_parche_original>\/mi_parche.patch\r\n<\/pre>\n<p>Este m\u00e9todo es tambi\u00e9n v\u00e1lido para versiones de paquetes Debian en los que no funciona el comando <em>dpkg-source &#8211;commit<\/em>. Adem\u00e1s, es la forma m\u00e1s r\u00e1pida de reutilizar un parche para un paquete de una versi\u00f3n previa de Ubuntu en una nueva versi\u00f3n, por ejemplo.<\/p>\n<p>A partir de este punto retomaremos los mismos pasos que se describieron anteriormente para a\u00f1adir la informaci\u00f3n de publicaci\u00f3n.<\/p>\n<h3>Construyendo el paquete con el c\u00f3digo fuente<\/h3>\n<p>S\u00f3lo tenemos que tener en cuenta que, si tenemos m\u00e1s de una clave GPG, el firmado del paquete fallar\u00e1, tal y como muestra la siguiente l\u00ednea:<\/p>\n<pre>\r\n$ debuild -S -rfakeroot\r\n...\r\nFinished running lintian.\r\nNow signing changes and any dsc files...\r\n signfile webkitgtk_2.3.2-1ubuntu6~saucy1.1.dsc Andres Gomez <mi@cuenta-de.correo>\r\ngpg: skipped \"Andres Gomez <mi@cuenta-de.correo>\": secret key not available\r\ngpg: \/tmp\/debsign.vhpVY32w\/webkitgtk_2.3.2-1ubuntu6~saucy1.1.dsc: clearsign failed: secret key not available\r\ndebsign: gpg error occurred!  Aborting....\r\ndebuild: fatal error at line 1280:\r\nrunning debsign failed\r\n<\/pre>\n<p>Debido a esto, tenemos que especificar el id de la clave a usar mediante el par\u00e1metro <em>-k<\/em>.<\/p>\n<p>Adem\u00e1s, si el c\u00f3digo fuente del paquete no procede de uno de los repositorios oficiales de Ubuntu, tendremos que proporcionar el c\u00f3digo fuente original para que tambi\u00e9n sea transferido al PPA. Esto lo haremos pasando el par\u00e1metro <em>-sa<\/em>. En nuestro ejemplo, como el c\u00f3digo fuente proced del PPA del GNOME3 Team, el comando ser\u00eda algo como:<\/p>\n<pre>\r\n$ debuild -S -sa -rfakeroot -k3FEA1034\r\n<\/pre>\n<p>Mientras que para otros paquetes que hayamos modificado a partir de fuentes que procedan directamente de uno de los repositorios oficiales de Ubuntu, usaremos:<\/p>\n<pre>\r\n$ debuild -S -rfakeroot -k3FEA1034\r\n<\/pre>\n<h3>Construcci\u00f3n local opcional<\/h3>\n<p>Construir el paquete localmente no es un paso realmente necesario pero nos dir\u00e1 si los cambios realizados est\u00e1n <em>\u00abrompiendo\u00bb<\/em> la compilaci\u00f3n.<\/p>\n<p>La mejor manera de hacer esto de una manera confiable es mediante <em>pbuilder<\/em>.<\/p>\n<p>Cuando usemos <em>pbuilder<\/em> nos tendremos que asegurar de que estamos usando los paquetes adecuados, no s\u00f3lo los que proceden de los repositorios oficiales de Ubuntu, si no tambi\u00e9n que estamos usando los que proporcionan los PPAs de los cuales depende nuestro PPA y tambi\u00e9n los proporcionados por nuestro propio PPA.<\/p>\n<p>Yo ya me he creado los ficheros comprimidos con los<em> \u00abchroot\u00bb<\/em> necesarios con las distribuciones adecuadas para mis PPAs. Sin embargo, con el \u00e1nimo de mostrar un ejemplo, usar\u00edamos un comando parecido al que sigue para crear este fichero comprimido si mi PPA objetivo fuese <em>gnome3<\/em>, que depende de mi otro PPA <em>ppa<\/em> y tambi\u00e9n del PPA <em>gnome3<\/em> del GNOME3 Team:<\/p>\n<pre>\r\n$ sudo pbuilder --create --distribution saucy --mirror \"http:\/\/fi.archive.ubuntu.com\/ubuntu\/\" --othermirror \"deb http:\/\/fi.archive.ubuntu.com\/ubuntu\/ saucy restricted universe multiverse|deb http:\/\/fi.archive.ubuntu.com\/ubuntu\/ saucy-updates main restricted universe multiverse|deb http:\/\/fi.archive.ubuntu.com\/ubuntu\/ saucy-proposed main restricted universe multiverse|deb http:\/\/fi.archive.ubuntu.com\/ubuntu\/ saucy-security main restricted universe multiverse|deb http:\/\/archive.canonical.com\/ubuntu saucy partner|deb http:\/\/ppa.launchpad.net\/gnome3-team\/gnome3\/ubuntu trusty main|deb http:\/\/ppa.launchpad.net\/tanty\/ppa\/ubuntu saucy main|deb http:\/\/ppa.launchpad.net\/tanty\/gnome3\/ubuntu saucy main\" --basetgz \/<ruta_base_de_pbuilder>\/saucy-gnome3.tgz --buildplace \/<ruta_base_de_pbuilder>\/build --aptcache  \/<ruta_base_de_pbuilder>\/aptcache\/\r\n<\/pre>\n<p>Utilizo <em>&lt;ruta_base_de_pbuilder&gt;<\/em> porque, por defecto, todo el proceso de la creaci\u00f3n del fichero comprimido se realiza en <em>\/var<\/em> y no siempre tengo el espacio necesario all\u00ed.<\/p>\n<p>Una vez que el fichero comprimido ha sido creado y siguiendo nuestro ejemplo, construir\u00edamos el paquete para el PPA objetivo <em>gnome3<\/em> tal y como sigue:<\/p>\n<pre>\r\n$ sudo pbuilder --build --mirror \"http:\/\/fi.archive.ubuntu.com\/ubuntu\/\" --othermirror \"deb http:\/\/fi.archive.ubuntu.com\/ubuntu\/ saucy main restricted universe multiverse|deb http:\/\/fi.archive.ubuntu.com\/ubuntu\/ saucy-updates main restricted universe multiverse|deb http:\/\/fi.archive.ubuntu.com\/ubuntu\/ saucy-proposed main restricted universe multiverse|deb http:\/\/fi.archive.ubuntu.com\/ubuntu\/ saucy-security main restricted universe multiverse|deb http:\/\/archive.canonical.com\/ubuntu saucy partner|deb http:\/\/ppa.launchpad.net\/gnome3-team\/gnome3\/ubuntu trusty main|deb http:\/\/ppa.launchpad.net\/tanty\/ppa\/ubuntu saucy main|deb http:\/\/ppa.launchpad.net\/tanty\/gnome3\/ubuntu saucy main\" --basetgz \/<ruta_base_de_pbuilder>\/saucy-gnome3.tgz --buildplace \/<ruta_base_de_pbuilder>\/build --aptcache  \/<ruta_base_de_pbuilder>\/aptcache\/ ..\/webkitgtk_2.3.2-1ubuntu6~saucy1.1.dsc\r\n<\/pre>\n<p>Ya s\u00f3lo resta esperar y comprobar los resultados.<\/p>\n<h3>Publicando en el PPA<\/h3>\n<p>El \u00faltimo paso es transferir el paquete con los cambios a nuestro PPA.<\/p>\n<p>En mi caso, tengo un PPA para pruebas por cada PPA estable. Estos PPAs no est\u00e1n pensados para su utilizaci\u00f3n por el usuario de Ubuntu general sino, simplemente, para poder jugar con los cambios que realizo hasta que siento que son lo suficientemente estables como para ser publicados en mis PPAs estables. Por esto, los 4 PPAs que manejo son:<\/p>\n<ul>\n<li><a href=\"https:\/\/launchpad.net\/~tanty\/+archive\/ppa\" title=\"Tanty's bugfixes and enhancements\" target=\"_blank\">ppa<\/a>: Donde publico los paquetes procedentes de repositorios oficiales de Ubuntu con cambios que me son \u00fatiles.\n<\/li>\n<li><a href=\"https:\/\/launchpad.net\/~tanty\/+archive\/ppa-next\" title=\"Tanty's next packages\" target=\"_blank\">ppa-next<\/a>: No dirigido al p\u00fablico general. Aqu\u00ed tengo los paquetes inestables hasta que son suficientemente estables como para ser publicados en el PPA <em>ppa<\/em>.\n<\/li>\n<li><a href=\"https:\/\/launchpad.net\/~tanty\/+archive\/gnome3\" title=\"Tanty's GNOME3 bugfixes and enhancements\" target=\"_blank\">gnome3<\/a>: Donde publico los paquetes procedentes del PPA del GNOME3 Team con cambios que me son \u00fatiles.\n<\/li>\n<li><a href=\"https:\/\/launchpad.net\/~tanty\/+archive\/gnome3-next\" title=\"Tanty's GNOME3 next packages\" target=\"_blank\">gnome3-next<\/a>: No dirigido al p\u00fablico general. Aqu\u00ed tengo los paquetes inestables hasta que son suficientemente estables como para ser publicados en el PPA <em>gnome3<\/em>.\n<\/li>\n<\/ul>\n<p>Durante el primer ciclo de desarrollo publico los cambios en mis PPAs <em>inestables<\/em> antes de publicarlos en los estables. Siguiendo nuestro ejemplo, el PPA en el que publicar\u00eda por primera vez ser\u00eda <em>gnome3-next<\/em>:<\/p>\n<pre>\r\n$ dput ppa:tanty\/gnome3-next ..\/webkitgtk_2.3.2-1ubuntu6~saucy1.1_source.changes\r\n<\/pre>\n<p>Cuando ya estoy lo suficientemente convencido de mis cambios, lo siguiente ser\u00eda publicar en el PPA estable:<\/p>\n<pre>\r\n$ dput -f ppa:tanty\/gnome3 ..\/webkitgtk_2.3.2-1ubuntu6~saucy1.1_source.changes\r\n<\/pre>\n<p>El argumento <em>-f<\/em> lo utilizo para evitar el error que se produce cuando ya existe un fichero de <em>\u00ablog\u00bb<\/em> procedente de una publicaci\u00f3n anterior de un fichero  <em>\u00ab.changes\u00bb<\/em> mediante <em>dput<\/em>.<\/p>\n<p>Tras esto, s\u00f3lo tenemos que esperar a que el paquete sea contru\u00eddo en los bots del PPA, actualizar nuestros repositorios y actualizar el sistema:<\/p>\n<pre>\r\n$ sudo apt-get update && sudo apt-get upgrade\r\n<\/pre>\n<p>Disfruta tu nuevo paquete!<\/p>","protected":false},"excerpt":{"rendered":"<p>Esta entrada es, principalmente, unas cuantas notas personales con instrucciones para publicar r\u00e1pidamente un paquete (habitualmente parcheado) en mis propios PPAs. Parcheando un paquete existente Lo primero es descargar las fuentes del paquete del repositorio que est\u00e1 proporcionando la versi\u00f3n &hellip; <a href=\"https:\/\/blog.andresgomez.org\/es\/2014\/03\/20\/quickly-publishing-in-your-ubuntu-ppa\/\">Sigue leyendo <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,5,6,7,9,19,12],"tags":[],"class_list":["post-670","post","type-post","status-publish","format-standard","hentry","category-english","category-espanol","category-free-software","category-general","category-igaliacom","category-linkedin","category-planetigaliacom"],"_links":{"self":[{"href":"https:\/\/blog.andresgomez.org\/es\/wp-json\/wp\/v2\/posts\/670"}],"collection":[{"href":"https:\/\/blog.andresgomez.org\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.andresgomez.org\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.andresgomez.org\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.andresgomez.org\/es\/wp-json\/wp\/v2\/comments?post=670"}],"version-history":[{"count":42,"href":"https:\/\/blog.andresgomez.org\/es\/wp-json\/wp\/v2\/posts\/670\/revisions"}],"predecessor-version":[{"id":823,"href":"https:\/\/blog.andresgomez.org\/es\/wp-json\/wp\/v2\/posts\/670\/revisions\/823"}],"wp:attachment":[{"href":"https:\/\/blog.andresgomez.org\/es\/wp-json\/wp\/v2\/media?parent=670"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.andresgomez.org\/es\/wp-json\/wp\/v2\/categories?post=670"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.andresgomez.org\/es\/wp-json\/wp\/v2\/tags?post=670"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}