Questo è toccato a due domande, ' Controllare se un file o una cartella è stata già patchato ' e ' make patch
ritorno 0 quando saltare una patch già applicato ' tuttavia non ha avuto una risposta soddisfacente.
Sto scrivendo uno script e voglio testare quanto segue per una patch:
Completamente applicato: continua
Parzialmente applicato: uscita
Non applicato: se può essere applicato correttamente fallo e continua, altrimenti esci
Il problema sta gestendo il caso parzialmente applicato:
mkdir test && cd test
cat << EOF > foobar.patch
--- /dev/null
+++ foo
@@ -0,0 +1 @@
+foo
--- /dev/null
+++ bar
@@ -0,0 +1 @@
+bar
EOF
patch --forward -i foobar.patch
rm foo
Quindi la barra esiste ma il foo no perché ad un certo punto è stata rimossa. Ora, se applico la patch in avanti a secco, il codice di uscita è 1 poiché non viene applicato correttamente.
$ patch --dry-run --forward --force -i foobar.patch
checking file foo
The next patch would create the file bar,
which already exists! Skipping patch.
1 out of 1 hunk ignored
$ echo $?
1
Ciò non mi dice se la patch sia stata completamente applicata, solo che non ha funzionato correttamente. Non so perché sia contrassegnato come corretto come risposta allo stackoverflow. Ho provato a invertire ma poiché è uno script non interattivo ha funzionato solo con forza:
$ patch --dry-run --reverse --force -i foobar.patch
The next patch, when reversed, would delete the file foo,
which does not exist! Applying it anyway.
checking file foo
Hunk #1 FAILED at 1.
1 out of 1 hunk FAILED
checking file bar
$ echo $?
1
Quindi sostiene sempre che se provo a invertire forzatamente una patch in un ciclo a secco e riesce che la patch sia completamente applicata, e se fallisce non è completamente applicata (o applicata)? Perché se è così allora posso fare qualcosa del genere
patch --dry-run --reverse --force -i foobar.patch ||
(patch --dry-run --forward --force -i foobar.patch &&
patch --forward --force -i foobar.patch) ||
exit 1