Compruebe si un archivo o carpeta ya ha sido parcheado


Respuestas:


20

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)


1
Esto no funciona para mi. Cuando ejecuto ese comando, si el parche no se ha aplicado, me pregunta si 'deshace' el parche en modo interactivo y, si uso el modo por lotes, ignorará la operación inversa y aplicará el parche, devolviendo 0.
synack

1
Oye, intenta agregar -sfa patch(se puede escribir como patch -Rsfp0 --dry-run)
poige

1
@synack, ¿te fue bien?
Poige

16

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

La comprobación debe estar en contra en 1lugar de 0:if [ $? -eq 1 ]
Crisson

2
No, 0 es correcto. El parche saldría con un valor distinto de cero si la ejecución en seco fallara por alguna razón, en cuyo caso el parche no debería aplicarse.
Fls'Zen

Mi guión fue correcto en bash. bash considera que un código de salida de 0 es truepara fines de if. Precisamente porque la mayoría de los comandos usan un código de salida de 0 para indicar el éxito.
Omnifarioso

2

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

O, si parcheó los archivos antes y desea saber si tocó algún archivo específico, puede ejecutar la primera ronda de parches con la -Bopción, lo que provocaría que se hiciera una copia de seguridad. Luego verifica la existencia de la copia de seguridad.
Peter

8
¿Podría ampliar un poco sobre por qué eligió usar nohupen ese ifcaso?
zrajm

@zrajm - No recuerdo por qué hice eso. Y cuando noté (debido a una solicitud de aprobación de edición) que estaba allí, fue hace tanto tiempo que no hay posibilidad de que recupere el motivo. Me parece bastante inútil mirarlo ahora.
Omnifarioso

0

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!


0

Esto me funcionó.

"scripts": {
    "symfony-scripts": [
        "patch -N --silent -p0 < patches/vendor/somefile.js.patch &2>/dev/null",
        "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.