Sprawdź, czy plik lub folder został już załatany


Odpowiedzi:


20

Tak, po prostu uruchom patchz --dry-runopcją, albo się nie powiedzie, albo powiedzie się, co można sprawdzić na podstawie statusu wyjścia.

Ale w bardziej powszechny (i podatny na błędy) sposób prawdopodobnie musisz uruchomić go z -Ropcją, która oznacza „odwróć”, ponieważ tylko jeśli byłby w stanie cofnąć całą łatkę, można ją uznać za „zastosowaną”. W przeciwnym razie (bez „-R”) może się nie powieść z powodu zmiany niektórych części oryginalnego pliku. Poniżej znajduje się prosty przykład:

if ! patch -R -p0 -s -f --dry-run <patchfile; then
  patch -p0 <patchfile
fi

(Co więcej, we fragmencie powyżej możesz nawet chcieć patchcałkowicie uciszyć przekierowując jego stdout i stderr do /dev/null)


1
To mi nie działa. Kiedy uruchomię to polecenie, jeśli łatka nie została zastosowana, pyta, czy „cofnąć” poprawkę w trybie interaktywnym, a jeśli użyję trybu wsadowego, zignoruje operację odwrotną i zastosuje łatkę, zwracając 0.
synack

1
Hej, spróbuj dodać -sfdo patch(można zapisać jako patch -Rsfp0 --dry-run)
poige

1
@synack, czy poszło dobrze?
poige

16

Na wypadek, gdyby komuś to pomogło, jeśli używasz skryptu bash, przykład podany przez Omnifariousa nie zadziałałby. W bashu status zakończony powodzeniem komendy wynosi 0

Więc działałyby następujące rzeczy:

patch -p0 -N --dry-run --silent < patchfile 2>/dev/null
#If the patch has not been applied then the $? which is the exit status 
#for last command would have a success status code = 0
if [ $? -eq 0 ];
then
    #apply the patch
    patch -p0 -N < patchfile
fi

Sprawdzanie powinno odbywać się 1zamiast 0:if [ $? -eq 1 ]
Crisson

2
Nie, 0 jest poprawne. Łatka wyjdzie z niezerową, jeśli z jakiegoś powodu nie powiodło się uruchomienie na sucho, w którym to przypadku łatka nie powinna zostać zastosowana.
Fls'Zen,

Mój skrypt był poprawny w bash. bash uważa, że ​​kod wyjścia 0 to truedla potrzeb if. Właśnie dlatego, że większość poleceń używa kodu wyjścia 0, aby wskazać powodzenie.
Wszechobecny

2

Oto przypuszczenie, zakładając, że korzystasz z patchnarzędzia, a każdy plik do załatania ma własną łatkę:

if patch <options> -N --dry-run --silent <patchfile 2>/dev/null; then
    echo The file has not had the patch applied,
    echo and the patch will apply cleanly.
else
    echo The file may not have had the patch applied.
    echo Or maybe the patch doesn't apply to the file.
fi

Lub, jeśli załatałeś pliki wcześniej i chcesz wiedzieć, czy dotknął jakiegoś konkretnego pliku, możesz uruchomić pierwszą rundę łaty z -Bopcją, która spowodowałaby utworzenie kopii zapasowej. Następnie sprawdzasz, czy kopia zapasowa istnieje.
Peter

8
Czy mógłbyś nieco wyjaśnić, dlaczego zdecydowałeś się użyć nohupw takim ifprzypadku?
zrajm

@zrajm - Nie pamiętam, dlaczego to zrobiłem. I zanim zauważyłem (z powodu prośby o zatwierdzenie edycji), że już tam był, tak dawno temu nie ma szans, żebym kiedykolwiek odzyskał powód. Wydaje mi się, że patrzenie na to teraz zupełnie bez sensu.
Wszechobecny

0

W moim przypadku chciałem to sprawdzić, aby uruchomienie komendy patch nie zakończyło się interaktywnym terminalem z pytaniem, co robić (szczególnie dla CI).

Okazuje się, że jeśli potrzebujesz, możesz także użyć --forwardargumentu, a jeśli zostanie już zastosowany, pominie łatkę!


0

To mi zadziałało.

"scripts": {
    "symfony-scripts": [
        "patch -N --silent -p0 < patches/vendor/somefile.js.patch &2>/dev/null",
        "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.