Isso é abordado em duas perguntas: ' Verifique se um arquivo ou pasta já foi corrigido ' e ' Faça o patch
retorno 0 ao ignorar um patch já aplicado ', no entanto, nenhuma das respostas foi satisfatória.
Estou escrevendo um script e quero testar o seguinte para um patch:
Totalmente aplicado: continue
Parcialmente aplicado: exit
Não aplicado: se puder ser aplicado com êxito, faça-o e continue; caso contrário, saia
O problema está lidando 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, a barra existe, mas o foo não existe, porque em algum momento foi removido. Agora, se eu aplicar o patch adiante em uma execução a seco, o código de saída é 1, pois não foi 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 foi totalmente aplicado, apenas que falhou no teste a seco. Não sei por que isso está marcado como correto, 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 é válido que, se eu tentar inverter forçosamente um patch em um processo a seco e for bem-sucedido, ele será totalmente aplicado e, se falhar, não será totalmente aplicado (ou aplicado)? Porque se sim, então eu posso fazer algo como
patch --dry-run --reverse --force -i foobar.patch ||
(patch --dry-run --forward --force -i foobar.patch &&
patch --forward --force -i foobar.patch) ||
exit 1