Usando patch

26.nov 2004 Envía un trackback

Siempre me había preguntado por el uso de patch y hoy lo he catado realmente. Las circunstancias obligaron a parchear un archivo y quise saber lo que estaba haciendo y analizarlo algo más a fondo. Lo primero ha sido leer el parche que se iba a aplicar. Una vez convencido de las diferencias reales entre uno y otro fichero procedemos a operar:

# wget http://url.to/file.patch.gz
# gunzip file.patch.gz


Ya tenemos nuestro file.patch listo para jugar, ahora debemos tener sumo cuidado con las rutas, para ello usaremos la opción -p:

-pnum or --strip=num
Strip the smallest prefix containing num leading slashes from each file name found in the patch file. A sequence of one or more adjacent slashes is counted as a single slash. This controls how file names found in the patch file are treated, in case you keep your files in a different directory than the person who sent out the patch. For example, supposing the file name in the patch file was

Esta opción corta tantas / como niveles pongamos, lo veremos más claro en un ejemplo. Si el archivo que queremos parchear y el parche están en el mismo directorio, haremos un cat del parche para ver a dónde apunta y ajustamos la ruta con el parámetro -p:

-bash-2.05b# cat file.patch
--- /home/axel/prj/cvs/Drupal/drupal/modules/user.module 2004-09-29 14:39:51.000000000 +0400
+++ modules/user.module 2004-10-07 09:57:24.000000000 +0400

Tal cual vemos en el parche, el archivo a parchear está en /home/axel/prj..., (ruta incorrecta, recordad, nos encontramos en el mismo directorio que el archivo original). Por lo que si contamos las / (8 en total hasta llegar al archivo) haremos un:

-bash-2.05b# patch -p 8 --dry-run < file.patch
Hmm... Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|--- /home/axel/prj/cvs/Drupal/drupal/modules/user.module 2004-09-29 14:39:51.000000000 +0400
|+++ modules/user.module 2004-10-07 09:57:24.000000000 +0400
--------------------------
Patching file user.module using Plan A...
Hunk #1 succeeded at 217 (offset 27 lines).
Hunk #2 succeeded at 946 (offset 6 lines).
Hunk #3 succeeded at 980 (offset 27 lines).
Hunk #4 succeeded at 1037 (offset 6 lines).
done
-bash-2.05b#

¿El --dry-run?, pues para que simule el parche sin hacerlo realmente, bueno para no fastidiar nada. Si todo ha ido correcto (como parece), ejecutamos el mismo comando pero sin simular nada:

-bash-2.05b# patch -p 8 < file.patch

Obteniendo un resultado similar al anterior. Bien, ya sabemos un poco más sobre patch. Este ha sido el comando del día, espero que lo disfruten :D.

Comentarios
Gravatar reidrac@26.11.2004, 'Remátalo'

¿Cómo se usa diff para crear un parche? :D

Gravatar THroLL@26.11.2004, 'Creo que ese manual tiene un bug xD'

Ye r0sk, has tenido un gazapo, dices que el --dry-run es para que lo simule y cuando en teoria lo haces sin simular, usas --dry-run también.

Decirte que en lugar de "-p X" puedes usar "-pX", aunque es algo sin mas importancia =).

Un saludo.

Gravatar r0sk@26.11.2004, 'Cierto'

Correcto THrOLL, un bug se había colado en este "manual", he pasado el antivirus, a ver si ahora ya va más fino ;). Cierto tambien lo de -pX, de hecho las man así lo hacen constar.

Reidrac, lo remataría peero... ¿cómo se usa diff para crear un parche?, quizás pronto :P.

Gravatar _Diego111_@26.11.2004, '3G'

Un saludo conectado con 3G desde el airport de Barcelona.
Pillo 3 wifi y las 3 con radius, :( mi gozo en un pozo...


Escribe tu comentario
 
 
Guardar datos
Escribe tu comentario:
captcha


Intenta que tu comentario sea interesante y con información relevante al tema de la entrada. BBCodes disponibles: [url=http://direccion]texto[/url], negrita: [b]texto[/b], itálica: [i]texto[/i], subrayada: [u]texto[/u]. Para mencionar o citar a alguien (quote): [cita]texto[/cita]