Como posso aplicar um patch -p0 em qualquer diretório ativo?

26

Eu tenho um patch com caminhos absolutos que desejo usar. isto é, as primeiras linhas são as seguintes.

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

No entanto, ele falhará, a menos que eu esteja no diretório raiz.

~$ 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 uma maneira de fazer patchuso do caminho absoluto com qualquer diretório de trabalho?

Sparhawk
fonte
Em vez disso, eu editaria o patch em si.
Braiam
@Braiam Que edições específicas eu faria no patch? Estou basicamente me perguntando se posso evitar ter que especificar qualquer caminho de destino no patchcomando.
Sparhawk
Algum contexto, por favor. Você está tentando aplicar esse patch a um sistema em execução? Se sim, por quê? Qual é a sua distribuição / SO? O que esse patch faz? Parece um patch para uma coisa do KDE. Qual componente? Em geral, se sua distribuição não está aplicando o patch para você, você deve reconstruir o pacote relevante da fonte com o patch aplicado. E você pode aparar a parte principal do caminho. Isso não deveria ser um problema. Quanto você apara depende da aparência da fonte.
Faheem Mitha 11/11
1
@FaheemMitha Sim, está funcionando, com o Arch / KDE. É para corrigir esse bug . A correção funcionará se eu aplicar manualmente as alterações. No entanto, não acho que esse contexto seja tão importante nesse caso, pois posso replicar esse problema com um arquivo de teste no /tmp/foo. Estou mais interessado em uma resposta genérica que se aplica a patch.
Sparhawk

Respostas:

35

Observando o código fonte do patch GNU, esse comportamento está embutido desde a versão 2.7. No patch 2.7.1 do GNU, apenas os caminhos relativos que não contêm ..são aceitos, a menos que o diretório atual seja o diretório raiz.

Para aplicar um patch contendo caminhos absolutos, você pode usar

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

Nas versões recentes do patch GNU, você pode simplesmente

sudo patch -d/ -p0 <foo.patch
Gilles 'SO- parar de ser mau'
fonte
Ok, é o que é. No entanto, se você verificar meus comandos, cd /usrtambém falhará, apesar dos arquivos de destino estarem nesse diretório.
Sparhawk
@ Sparhawk Desculpe, minha descrição estava parcialmente incorreta. O teste é: se o diretório atual não estiver /, rejeite qualquer caminho absoluto ou caminho que contenha um ..componente.
Gilles 'SO- stop be evil' (
7
Ou, mais simplesmente,sudo patch -d/ -p0 <foo.patch
Qian
@TheoYou Perdi esse comentário na época. Você deve escrever como resposta.
Sparhawk