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
¿Cómo se usa diff para crear un parche? :D
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.
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 lo leamos pronto :P.
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
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]


