Controlla se un file o una cartella sono già stati patchati


Risposte:


20

Sì, basta eseguire patchcon l' --dry-runopzione, o fallirebbe o avrebbe successo, che può essere scoperto con il suo stato di uscita.

Ma in un modo più comune (e soggetto a errori) , probabilmente devi eseguirlo con l' -Ropzione che significa "reverse" poiché solo se fosse in grado di ripristinare l'intera patch, potrebbe essere considerato "applicato". Altrimenti (senza '-R') potrebbe non riuscire a causa della modifica di alcune parti del file originale. Di seguito è riportato un semplice esempio:

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

(Inoltre, nello snippet sopra potresti persino preferire il silenzio patchreindirizzando completamente il suo stdout e lo stderr a /dev/null)


1
Questo non funziona per me. Quando eseguo quel comando, se la patch non è stata applicata, mi viene chiesto se "annullare l'inversione" della patch in modalità interattiva e, se utilizzo la modalità batch, ignorerà l'operazione inversa e applicherà la patch, restituendo 0.
synack

1
Ehi, prova ad aggiungere -sfa patch(può essere scritto come patch -Rsfp0 --dry-run)
poige il

1
@synack è andato bene?
poige,

16

Nel caso in cui aiuti qualcuno, se si utilizza lo script bash, l'esempio fornito da Omnifarious non funzionerebbe. In bash lo stato di uscita di un comando riuscito è 0

Quindi il seguente funzionerebbe:

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

Il controllo dovrebbe essere contrario 1invece di 0:if [ $? -eq 1 ]
Crisson,

2
No, 0 è corretto. La patch terminerebbe con un valore diverso da zero se il funzionamento a secco non fosse riuscito per qualche motivo, nel qual caso la patch non dovrebbe essere applicata.
Fls'Zen,

La mia sceneggiatura era corretta in bash. bash considera un codice di uscita pari a 0 ai truefini di if. Proprio perché la maggior parte dei comandi utilizza un codice di uscita 0 per indicare il successo.
Onnipotente il

2

Ecco una supposizione, supponendo che tu stia utilizzando l' patchutilità e ogni file da patchare ha la sua patch:

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

Oppure, se prima hai patchato i file e vuoi sapere se ha toccato un file specifico, puoi eseguire il primo giro di patch con l' -Bopzione, che causerebbe il backup. Quindi si controlla l'esistenza del backup.
peterph,

8
Potresti espandere un po 'il motivo per cui hai scelto di utilizzare nohupin quel ifcaso?
zrajm,

@zrajm - Non ricordo perché l'ho fatto. E quando ho notato (a causa di una richiesta di approvazione di modifica) che era lì, è stato tanto tempo fa che non c'è alcuna possibilità che recupererò mai il motivo. Mi sembra abbastanza inutile guardarlo ora.
Onnipotente il

0

Nel mio caso volevo fare quel controllo in modo che l'esecuzione del comando patch non finisse con un terminale interattivo che chiedeva cosa fare (specialmente per CI).

Si scopre che se hai solo bisogno che puoi anche usare l' --forwardargomento e salterà la patch se già applicato!


0

Questo ha funzionato per me.

"scripts": {
    "symfony-scripts": [
        "patch -N --silent -p0 < patches/vendor/somefile.js.patch &2>/dev/null",
        "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.