¿Es posible saber si un archivo ya ha sido parcheado antes de aplicar el parche?
Necesito hacer esto en un guión, ¿alguna idea?
¿Es posible saber si un archivo ya ha sido parcheado antes de aplicar el parche?
Necesito hacer esto en un guión, ¿alguna idea?
Respuestas:
Sí, solo ejecute patchcon la --dry-runopción, ya sea que falle o tenga éxito, lo que se puede descubrir con su estado de salida.
Pero de una manera más común (y propensa a errores) , probablemente tenga que ejecutarlo con la -Ropción que significa "revertir", ya que solo si pudiera revertir todo el parche podría considerarse como "aplicado". De lo contrario (sin '-R'), podría fallar solo debido a que se modificaron algunas partes del archivo original. A continuación se muestra un ejemplo simple:
if ! patch -R -p0 -s -f --dry-run <patchfile; then
patch -p0 <patchfile
fi
(Aún más, en el fragmento de arriba puede que incluso prefieras silenciar patchcompletamente redirigiendo su stdout y stderr a /dev/null)
-sfa patch(se puede escribir como patch -Rsfp0 --dry-run)
En caso de que ayude a alguien, si está utilizando un script bash, entonces el ejemplo dado por Omnifarious no funcionaría. En bash, el estado de salida de un comando exitoso es 0
Entonces lo siguiente funcionaría:
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
1lugar de 0:if [ $? -eq 1 ]
truepara fines de if. Precisamente porque la mayoría de los comandos usan un código de salida de 0 para indicar el éxito.
Aquí hay una suposición, suponiendo que está utilizando la patchutilidad y que cada archivo que se va a parchar tiene su propio parche:
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
-Bopción, lo que provocaría que se hiciera una copia de seguridad. Luego verifica la existencia de la copia de seguridad.
nohupen ese ifcaso?
En mi caso, quería hacer esa verificación para que ejecutar el comando parche no terminara con un terminal interactivo preguntando qué hacer (especialmente para CI).
¡Resulta que si solo necesita eso, también puede usar el --forwardargumento y se saltará el parche si ya está aplicado!