Esto se aborda en dos preguntas, ' Verificar si un archivo o carpeta ya ha sido parcheado ' y ' Hacer patch
regresar 0 al omitir un parche ya aplicado ', sin embargo, ninguno de los dos tuvo una respuesta satisfactoria.
Estoy escribiendo un script y quiero probar lo siguiente para un parche:
Totalmente aplicado: continuar
Parcialmente aplicado: salir
No aplicado: si puede aplicarse con éxito, hágalo y continúe, de lo contrario salga
El problema es manejar el 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
Entonces la barra existe pero foo no existe porque en algún momento fue eliminada. Ahora, si aplico el parche hacia adelante en una ejecución en seco, el código de salida es 1 ya que no se aplicó con éxito.
$ 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
Sin embargo, eso no me dice si el parche está completamente aplicado, solo que falló la ejecución en seco. No sé por qué está marcado como correcto como la respuesta de stackoverflow. Intenté revertir, pero como es un script no interactivo, solo funcionó con fuerza:
$ 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
Entonces, ¿siempre sostiene que si trato de revertir a la fuerza un parche en una ejecución en seco y tiene éxito que el parche se aplique completamente, y si falla, no se aplica completamente (o no se aplica)? Porque si es así, puedo hacer 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