Jak mogę zastosować łatkę -p0 z dowolnego katalogu roboczego?

26

Mam łatkę z bezwzględnymi ścieżkami, których chcę użyć. tzn. pierwsze kilka wierszy jest następujące.

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

Jednak kończy się niepowodzeniem, chyba że jestem w katalogu głównym.

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

Czy istnieje sposób patchwykorzystania ścieżki bezwzględnej w dowolnym katalogu roboczym?

Krogulec
źródło
Zamiast tego edytowałbym samą łatkę.
Braiam
@Braiam Jakie konkretne zmiany wprowadziłbym do łatki? Zasadniczo zastanawiam się, czy mogę uniknąć konieczności podawania ścieżek docelowych w patchpoleceniu.
Sparhawk
Proszę o jakiś kontekst. Czy próbujesz zastosować tę poprawkę do działającego systemu? Jeśli tak, dlaczego? Jaka jest twoja dystrybucja / system operacyjny? Co robi ta łatka? Wygląda to jak łatka na rzecz KDE. Jaki składnik Ogólnie, jeśli twoja dystrybucja nie stosuje łaty dla ciebie, powinieneś przebudować odpowiedni pakiet ze źródła z zastosowaną łatką. I możesz przyciąć wiodącą część ścieżki. To nie powinno być problemem. To, ile przycinasz, zależy od wyglądu źródła.
Faheem Mitha,
1
@FaheemMitha Tak, działa z Arch / KDE. To naprawić ten błąd . Poprawka działa, jeśli ręcznie zastosuję zmiany. Jednak nie sądzę, aby kontekst miał tak duże znaczenie w tym przypadku, ponieważ mogę replikować ten problem z plikiem testowym w /tmp/foo. Bardziej interesuje mnie ogólna odpowiedź, która dotyczy patch.
Sparhawk

Odpowiedzi:

35

Patrząc na kod źródłowy łatki GNU, to zachowanie jest wbudowane od wersji 2.7. Począwszy od poprawki GNU 2.7.1, ..akceptowane są tylko ścieżki niezawierające , chyba że katalog bieżący jest katalogiem głównym.

Aby zastosować łatkę zawierającą ścieżki bezwzględne, możesz użyć

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

W najnowszych wersjach łatki GNU możesz po prostu

sudo patch -d/ -p0 <foo.patch
Gilles „SO- przestań być zły”
źródło
Okej, to jest to. Jeśli jednak sprawdzisz moje polecenia, cd /usrrównież się nie powiedzie, mimo że pliki docelowe znajdują się w tym katalogu.
Sparhawk
@Sparhawk Przepraszamy, mój opis był częściowo niepoprawny. Test jest następujący: jeśli bieżący katalog nie jest /, to odrzuć ścieżkę bezwzględną lub ścieżkę zawierającą ..składnik.
Gilles 'SO - przestań być zły'
7
Lub prościejsudo patch -d/ -p0 <foo.patch
Qian
@ TheoYou W tym momencie przegapiłem ten komentarz. Powinieneś napisać to jako odpowiedź.
Sparhawk,