Comment puis-je appliquer un patch -p0 à partir de n'importe quel répertoire de travail?

26

J'ai un patch avec des chemins absolus que je souhaite utiliser. c'est-à-dire que les premières lignes sont les suivantes.

--- /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

Cependant, il échoue sauf si je suis dans le répertoire racine.

~$ 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

Existe-t-il un moyen d' patchutiliser le chemin absolu avec n'importe quel répertoire de travail?

Sparhawk
la source
Je voudrais plutôt éditer le patch lui-même.
Braiam
@Braiam Quelles modifications spécifiques devrais-je apporter au patch? Je me demande essentiellement si je peux éviter d'avoir à spécifier des chemins cibles dans la patchcommande.
Sparhawk
Un peu de contexte, s'il vous plaît. Essayez-vous d'appliquer ce correctif à un système en cours d'exécution? Si oui, pourquoi? Quelle est votre distribution / OS? Que fait ce patch? Cela ressemble à un patch pour une chose KDE. Quel composant? En général, si votre distribution n'applique pas le patch pour vous, vous devez reconstruire le package correspondant à partir de la source avec le patch appliqué. Et vous pouvez couper la partie avant du chemin. Ça ne devrait pas être un problème. La quantité de découpage dépend de l'apparence de la source.
Faheem Mitha
1
@FaheemMitha Oui, il fonctionne, avec Arch / KDE. C'est pour corriger ce bug . Le correctif fonctionne si j'applique manuellement les modifications. Cependant, je ne pense pas que le contexte compte autant dans ce cas, car je peux reproduire ce problème avec un fichier de test dans /tmp/foo. Je suis plus intéressé par une réponse générique qui s'applique à patch.
Sparhawk

Réponses:

35

En regardant le code source du patch GNU, ce comportement est intégré depuis la version 2.7. Depuis le patch GNU 2.7.1, seuls les chemins relatifs ne contenant pas ..sont acceptés, à moins que le répertoire courant ne soit le répertoire racine.

Pour appliquer un patch contenant des chemins absolus, vous pouvez utiliser

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

Dans les versions récentes du patch GNU, vous pouvez simplement

sudo patch -d/ -p0 <foo.patch
Gilles 'SO- arrête d'être méchant'
la source
D'accord, c'est ce que c'est. Cependant, si vous vérifiez mes commandes, a cd /usrégalement échoué, malgré le fait que les fichiers cibles se trouvent sous ce répertoire.
Sparhawk
@Sparhawk Désolé, ma description était en partie incorrecte. Le test est: si le répertoire courant ne l'est pas /, alors rejetez tout chemin absolu ou chemin contenant un ..composant.
Gilles 'SO- arrête d'être méchant'
7
Ou plus simplement,sudo patch -d/ -p0 <foo.patch
Qian
@TheoYou J'ai manqué ce commentaire à l'époque. Vous devriez l'écrire comme réponse.
Sparhawk