Isso é abordado em duas perguntas, ' Verifique se um arquivo ou pasta já foi corrigido 'e' Faça patch
return 0 ao pular um patch já aplicado ', mas nenhum dos dois teve uma resposta satisfatória.
Estou escrevendo um script e quero testar o seguinte para um patch:
Totalmente aplicado: continuar
Parcialmente aplicado: sair
Não aplicado: se puder ser aplicado com sucesso, faça e continue, caso contrário, saia
O problema é lidar com o caso parcialmente aplicado:
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
Portanto, o bar existe, mas o foo não, porque em algum momento ele foi removido. Agora, se eu aplicar o patch para frente em um dry-run, o código de saída é 1, já que ele não é aplicado com sucesso.
$ 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
Isso não me diz se o patch é totalmente aplicado, apenas que falhou no dry-run. Não sei por que isso está marcado como a resposta do stackoverflow. Eu tentei reverter mas como é um script não interativo, ele só funcionou com força:
$ 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
Então, sempre sustenta que, se eu tentar forçar a reversão de um patch em um dry-run e for bem-sucedido, o patch é totalmente aplicado e, se falhar, não será totalmente aplicado (ou aplicado)? Porque se assim for, então eu posso fazer algo parecido com
patch --dry-run --reverse --force -i foobar.patch ||
(patch --dry-run --forward --force -i foobar.patch &&
patch --forward --force -i foobar.patch) ||
exit 1