Se a reversão de uma correção for bem-sucedida, isso sempre significa que a correção foi totalmente aplicada?

9

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
    
por Jay 19.09.2016 / 09:09

1 resposta

0

Com este diff:

diff --git a/bar b/bar
new file mode 100644
index 0000000..e69de29
diff --git a/foo b/foo
new file mode 100644
index 0000000..257cc56
--- /dev/null
+++ b/foo
@@ -0,0 +1 @@
+foo

isso acontece:

$ cd /tmp/test
$ patch --forward -i foobar.patch
patching file bar
patching file foo
$ echo $?
0
$ rm bar
$ patch --dry-run --reverse --force -i foobar.patch
The next patch, when reversed, would delete the file bar,
which does not exist!  Applying it anyway.
checking file bar
checking file foo
$ echo $?
0

Então a resposta para sua pergunta é não.

    
por 22.01.2017 / 10:16

Tags