¿Cómo aplicar un parche?

De wikijoan
Salta a la navegació Salta a la cerca

Me han estado preguntando cómo se aplican parches a la rama estable sacados del trunk de la rama de desarrollo, así que aquí va un pequeño resumen de lo que hago yo. Como de costumbre no tiene porque ser la mejor manera, si alguien tiene alguna sugerencia por favor que nos la comunique.

Cuando detectas un bug lo primero que se debe hacer es intentar reproducirlo, si consigues detectar en que situación y haciendo que cosa se produce el error ya lo tienes. Entonces tienes que irte al sistema de control de bugs para ver si ya está notificado y en caso de que lo esté ver en que estado está (corregido, pendiente, asignado, etc). Si por un casual ya está corregido es muy común que el sistema de control de bugs esté integrado en el sistema de control de versiones y puedas saber en que revisión se corrigió el bug. Los desarrolladores de ob suelen dejar un log en los commits al estilo “Fixed bug [numero] …”, también suelen poner un comentario en el sistema de control de bugs indicando que lo han corregido en la revisión x del subversion.

Una vez sepamos en que revisión se ha corregido hay que crear el parche para poder aplicarlo en cualquier instalación. En el foro se comentó que había que utilizar la orden merge de subversion pero esto sólo sirve si quieres fusionar una revision con tu copia de trabajo. Nunca podrás parchear una instalación externa ni una máquina en producción utilizando esta orden tal cual. Para el que no lo sepa una copia de trabajo de un sistema de control de versiones es una copia que te bajas desde el sistema y que contiene a parte de los archivos fuentes una serie de directorios y archivos que gestiona el propio sistema (en nuestro caso subversion) para poder funcionar. Esta copia es la que utiliza el desarrollador para realizar los cambios y enviarlos al sistema.

Para crear un parche hay que utilizar la orden diff de subversion, esta orden va a crear un archivo diff con las diferencias de los archivos o de todo el árbol de código fuente según los parámetros que le pasemos. Tenemos dos opciones, decirle que cree un parche con todas las diferencias que encuentre entre nuestra copia de trabajo hasta una revisión en concreto o indicarle el rango de versiones en las que queremos que busque las diferencias. Yo suelo sacar los cambios del árbol entre la versión que corrige el error y la inmediatamente anterior. Esto supone un problema sobretodo si la revisión actual del trunk está muy alejada de la versión etiquetada con la que estás trabajando (en mi caso la 2.35mp1) ya que si este parche depende de cambios intermedios que se hicieron en el código estos no se están aplicando. Por otra parte si te traes todas las diferencias entre tu versión y la que corrigió el bug de los archivos implicados puede suceder que rompas llamadas a funciones o historias que hay en esos archivos desde otras partes del código.

Esto ha estado pasando sobretodo en el trunk de openbravo donde por ejemplo llevan unos meses cambiando el nombre de las funciones javascript del castellano al inglés y en todas las partes del código donde se hacía una llamada a estas funciones deja de funcionar. La solución es renombrar el nombre de la función en todas los archivos que hagan una llamada a dicha función, cosa que por otra parte es bastante tedioso.

Este problema no es exclusivo de openbravo y por eso en las versiones principales y estables de las bibliotecas no se suele cambiar este tipo de cosas para no romper la compatibilidad, ejemplos son la rama qt 3.x frente a qt 4.x, gtk 1.x frente a gtk 2.x, etc que es donde realmente si que rompen esa compatibilidad.

Vamos a la parte práctica, para crear un parche tenemos que tener instalado el cliente de subversion. Una vez lo tengamos instalado debemos ejecutarlo con la orden diff:

svn diff -r 1487:1488 https://dev.openbravo.com/svn/openbravo/trunk

Esta orden que he puesto de ejemplo nos va a crear un parche con las diferencias entre la revisión 1487 y la 1488 de todos los archivos del árbol a partir del trunk, el problema es que lo va a lanzar a la salida estandar así que la redireccionaremos a un archivo de la siguiente manera:

svn diff -r 1487:1488 https://dev.openbravo.com/svn/openbravo/trunk > parche.diff

Ahora ya se puede aplicar con la orden patch copiando el archivo al directorio AppsOpenbravo de los fuentes y luego ejecutando esta orden:

patch -p0 < parche.diff

Nos queda recompilar OB con:

ant compile.development -Dtr=no -Dtab=xxx

Lo último y más importante que nos queda es probar si realmente se ha solucionado el problema.

Cheli

obtrainings.es