Cómo actualizar un backport modificado con Git

Bueno, esta tarea es bastante compleja, y no se me ocurren muchos ejemplos teóricos, así que vamos con un caso real.

Como muchos sabréis, soy miembro activo de la OCA y un contribuyente habitual a Odoo.

Una de las novedades de Odoo 9.0 fue el módulo website_slides, que fue backporteado por la comunidad a Odoo 8.0.

Sin embargo, desde que se realizó el backport hasta el día de hoy, el módulo ha recibido varios parches upstream 9.0 que la versión backporteada no tenía, así que lo que quiero es actualizarlo, sin perder el historial de Git.

Descargar todo

Lo primero que necesito es clonar el repositorio donde se realizó el backport en la versión 8.0, añadirle un remoto que será el repositorio principal de Odoo, y descargar su rama 9.0, en la que se encuentra website_slides:

$ git clone --branch 8.0 git@github.com:OCA/website.git
$ cd website
$ git remote add odoo git@github.com:odoo/odoo.git
$ git fetch odoo 9.0

Localizar el último commit que se backporteó

Ahora tengo que examinar el historial de la rama 8.0 de OCA/website para ver cuál fue el último commit backporteado. Para eso, la verdad es que lo más cómodo es usar la interfaz de GitHub, donde encuentro que el último fue cb5004c (ojo, hablamos del último commit producto del backport, ya que luego ambos repositorios evolucionaron cada cual por su lado).

Para que no se me pierda, lo marcaré con una rama:

$ git branch _last_backported cb5004cb06d91d54c6d187908599e03a2e7f546e

Repetir el backport filtrado

Puesto que los dos repositorios son topológicamente diferentes, hay que repetir el backport que se hizo. Para ello, hay que filtrar la carpeta ./addons/website_slides de Odoo y moverlo a la carpeta ./website_slides de la versión OCA. Para ello, el proceso es similar al que hace falta para migrar módulos OCA de la versión 8.0 a la 9.0, pero con un par de trucos extra.

Por cierto, aquí usaré sintaxis de Fish, si todavía usas Bash, tradúcelo tú mismo o cambia a Fish y sé más feliz ;):

$ git checkout -b _website_slides_new_backport odoo/9.0
$ set module addons/website_slides
$ git filter-branch --force --subdirectory-filter $module
$ set module website_slides
$ git filter-branch --force --tree-filter "mkdir $module; git mv -k * $module" HEAD

Cherry-pick de los nuevos commits del nuevo backport

Ahora ya tengo la rama _website_slides_new_backport, con los commits idénticos a los originales de Odoo en la rama 9.0, pero filtrados únicamente por el directorio que me interesa; y la rama _last_backported, que marca el último commit ya existente en OCA.

Ahora voy a excluir los commits que existan en ambas ramas, y hacer cherry-pick de los restantes, escogiendo los cambios de parte de Odoo en caso de conflicto:

$ git checkout _last_backported
$ git cherry _last_backported _website_slides_new_backport | grep + | awk '{print $2}' | git cherry-pick --stdin --strategy-option theirs

Mezclar y corregir conflictos

Ahora mezclamos el backport actualizado con el que había, y borramos las ramas que ya no necesitamos:

$ git checkout -b 8.0-website_slides-update_backport origin/8.0
$ git merge _last_backported
$ git branch -D _last_backported _website_slides_new_backport

Evidentemente habrá un montón de conflictos. No queda más remedio que la corrección manual:

$ git mergetool # (Abrir GUI de resolución de conflictos en cada fichero)
$ git commit

Al terminar, tienes que comprobar manualmente que todo haya funcionado.

Resultado final

Al final, ya está abierta la solicitud de integración para actualizar website_slides en la OCA. Échale un ojo si quieres.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s