¿Cómo puedo aplicar un parche -p0 desde cualquier directorio de trabajo?

26

Tengo un parche con rutas absolutas que deseo usar. es decir, las primeras líneas son las siguientes.

--- /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml  2014-10-10 18:47:23.000000000 +1100
+++ /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml.mod  2014-11-11 09:44:17.786200477 +1100

Sin embargo, falla a menos que esté en el directorio raíz.

~$ cd
~$ sudo patch -i /tmp/fix_kde_icons.patch -p0
Ignoring potentially dangerous file name /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml
Ignoring potentially dangerous file name /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml.mod
can't find file to patch at input line 3
Perhaps you used the wrong -p or --strip option?
...
~$ cd /tmp
/tmp$ sudo patch -i /tmp/fix_kde_icons.patch -p0
... #same error as above
/tmp$ cd /usr
/usr$ sudo patch -i /tmp/fix_kde_icons.patch -p0
... #same error as above
/usr$ cd /
/$ sudo patch -i /tmp/fix_kde_icons.patch -p0
patching file /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml

¿Hay alguna manera de hacer patchuso de la ruta absoluta con cualquier directorio de trabajo?

Gavilán
fuente
En su lugar, editaría el parche.
Braiam
@Braiam ¿Qué ediciones específicas haría al parche? Básicamente me pregunto si puedo evitar tener que especificar rutas de destino en el patchcomando.
Sparhawk
Algún contexto, por favor. ¿Estás intentando aplicar este parche a un sistema en ejecución? Si es así, ¿por qué? ¿Cuál es su distribución / SO? ¿Qué hace este parche? Parece un parche para una cosa de KDE. Que componente En general, si su distribución no aplica el parche por usted, debe reconstruir el paquete relevante desde el origen con el parche aplicado. Y puede recortar la parte principal del camino. Eso no debería ser un problema. La cantidad de recorte depende de la apariencia de la fuente.
Faheem Mitha
1
@FaheemMitha Sí, se está ejecutando, con Arch / KDE. Es para arreglar este error . La solución funciona si aplico los cambios manualmente. Sin embargo, no creo que el contexto importe tanto en este caso, ya que puedo replicar este problema con un archivo de prueba /tmp/foo. Estoy más interesado en una respuesta genérica que se aplique a patch.
Sparhawk

Respuestas:

35

Mirando el código fuente del parche GNU, este comportamiento está integrado desde la versión 2.7. A partir del parche 2.7.1 de GNU, solo ..se aceptan rutas relativas que no contengan , a menos que el directorio actual sea el directorio raíz.

Para aplicar un parche que contiene rutas absolutas, puede usar

(cd / && sudo patch -p0) <foo.patch

En versiones recientes del parche GNU, simplemente puede

sudo patch -d/ -p0 <foo.patch
Gilles 'SO- deja de ser malvado'
fuente
De acuerdo, es lo que es. Sin embargo, si verifica mis comandos, cd /usrtambién falló, a pesar de que los archivos de destino están en este directorio.
Sparhawk
@Sparhawk Lo siento, mi descripción fue en parte incorrecta. La prueba es: si el directorio actual no lo es /, rechace cualquier ruta absoluta o ruta que contenga un ..componente.
Gilles 'SO- deja de ser malvado'
77
O más simplemente,sudo patch -d/ -p0 <foo.patch
Qian
@TheoYou Me perdí ese comentario en ese momento. Deberías escribirlo como respuesta.
Sparhawk