Ir al contenido principal

Como Aplicar un Patch a un Programa en Linux (How to Apply a Patch en Linux)

Los comandos aplicados en este articulo fueron realizados en la distro Kali 1.0 (based in Debian)

Una de las ventajas de los programas (software) open source es que podemos descargar los paquetes fuentes de estos que son los que contienen todos los codigos fuentes. Con ellos podriamos, modificar el mismo y crear nuevas funcionalidades (features) o corregir algun fallo.

Para mantener un orden o integridad, es bueno que las modificaciones hechas al paquete fuente original, se realicen en un patch file. El patch file es un archivo que debe aplicarse al codigo fuente original utilizando el comando con el nombre patch.

Que contiene un archivo patch?
Contiene lineas de codigo fuente de uno o mas archivos contenidos en el paquete fuente original. La extension de un archivo patch es .patch

Consideraciones
Cosas que hasta el momento no encontre en la Web y que debes de saber de como aplicar un Patch son:

1. El patch se aplica al paquete fuente de la aplicacion que deseas aplicar (valga la redundancia) el patch. No al paquete binario, ni al software instalado.

2. Para que el patch file trabaje correctamente debe ser aplicado a la version del paquete fuente correcta. En este punto quiero ampliar. En mi deseo de aplicar un patch a un programa llamado Guake (drop-down Linux terminal emulator), experimente que el patch no se aplica correctamente, si este no encuentra las lineas de codigo que espera que el archivo original tenga en la posicion esperada por el patch file. Y por ello, mi conclusion de que no puedes aplicar el patch a una version para la cual no fue hecho, a menos de que por coincidencia del destino, la nueva version tenga las mismas lineas de codigo en la posicion esperada por el patch.

3. El comando patch puede aplicar el patch file a uno o mas archivos dentro del paquete fuente. Dependiendo de esto, sera como escribas el comando patch en tu terminal.


Ahora, pasemos a una serie de sentencias con el comando patch:

1. Para aplicar un patch a un solo archivo, debes ubicarte en la ruta o carpeta de ese archivo en tu computador y llama al comando patch de la siguiente manera:

# patch < foo.patch

2. Si dejamos de asumir que el patch esta distribuido en un formato unificado y que con ello debe automaticamente identificar a que archivo debe aplicar el patch, entonces puedes especificar el archivo fuente original, que es el archivo a quien se le aplicara el patch, de la siguiente manera:

# patch foo.txt < bar.patch

3. Aplicando el patch a un directorio entero (quizas el caso mas comun) es similar, pero debes guardar cuidado con el atributo -p (p level). Te explico, dentro de los patch files, los archivos a ser parchados (the files to be patched) son identificados por su ubicacion o ruta. Toma en cuenta que el patch file fue creado en otra computadora distinta a la tuya (a menos que tu seas quien creo el patch file) y es muy probable que la ruta sea distinta. Lo que hace el p level es decirle al patch que ignore ciertos niveles o partes de la ruta (path), para que asi este pueda identificar los archivos originales correctamente. Mi recomendacion es que al descomprimir el paquete fuente original te vayas a la carpeta donde colocaste el archivo comprimido que contenia el paquete fuente y ejecutes el comando patch de la siguiente manera (NO olvides copiar el patch file en esta misma ruta):

# patch -p1 < baz.patch

De no funcionarte esta instruccion debes abrir el patch file y ver su ruta. Si por ejemplo, llegase usted a encontrar algo como esto:

/users/stephen/package/src/net/http.c

Y te encuentras en el directorio que contiene net/http.c, entonces deberias ejeucutar la instruccion de la siguiente forma:

#patch -p5 < baz.patch

En general, el -p5 hara que no se tomen en cuenta de la ruta aquellas carpetas hacia arriba desde net (debes contar 5 caracteres slash desde el inicio de la ruta. Es decir que nuestra instruccion anterior solo tomara:

net/http.c

El slash es caracter separador de cada directorio

Para remover un patch debes agregar a tu sentencia el atributo -R, ejemplo:

#patch -p5 -R < baz.patch


Fuentes de este Articulo:
1. http://jungels.net/articles/diff-patch-ten-minutes.html. El que mejor explica lo que es y hace un Patch. Tambien explica el comando Diff, que guarda mucha relacion con el command patch.

2. http://pascal.nextrem.ch/2010/05/06/build-ubuntudebian-packages-from-source-and-apply-a-patch/

Comentarios

Entradas populares de este blog

Error al recuperar un generador de clases COM para el componente con CLSID {############} debido al siguiente error: 80040154

Hello Everyone!! Realmente no se si este mensaje de error es genérico o específio. Por ende, voy a decirles que si están: - Usan Visual Studio 2010 - Windows 7 x64 - Y tan trantando de correr un programa desarrollado en una versión anterior al VS 2010 y que hace referencia a DLL's, entonces chequeate este video, porque te va a dar la solución: www.youtube.com/watch?v=pDtyGns6mOw Fin!!!

Pasar Valores de Ventana Hija a Padre (Pass values from Child to Parent Windows with PHP and Javascript)

En este articulo, la ventana hija es un listado de clientes, donde el usuario a darle clic a un cliente, se retorna el ID del Cliente a un objeto Input tipo  hidden y el Nombre del Cliente a un objeto Input tipo  Text . En la ventana padre agrega un hipervinculo como el siguiente: <a href="#" id="customer_search" onClick="showModalSendAndReturnValues('customers_search.php', ''); return false;">Abrir Ventana Hija</a> y crea dos objetos HTML Input: <input type="text" id="customer_name"> <input type="hidden" id="customer_id"> El evento onClick sera el que dispare la función que abre la ventana hija.  El return false , es importante ya que evita que la ventana padre se auto-refresque y nos lleve a otra pagina. La funcion showModalSendAndReturnValues , es un Javascript que puede ir en el header de tu pagina padre o en un archivo de funciones javas