Verifique se um arquivo ou pasta já foi corrigido


22

É possível saber se um arquivo já foi corrigido antes de aplicar o patch?

Eu preciso fazer isso em um script, algum pensamento?


11
Qual programa você está usando para corrigi-los? Que tipo de patches?
#

Respostas:


20

Sim, basta executar patchcom a --dry-runopção, ela falharia ou seria bem-sucedida, o que pode ser encontrado com seu status de saída.

Mas, de uma maneira mais comum (e propensa a erros) , você provavelmente precisará executá-lo com a -Ropção que significa "reverter", pois somente se ele pudesse reverter todo o patch, poderia ser considerado como "aplicado". Caso contrário (sem '-R'), poderá falhar devido a algumas partes do arquivo original terem sido alteradas. Abaixo está um exemplo simples:

if ! patch -R -p0 -s -f --dry-run <patchfile; then
  patch -p0 <patchfile
fi

(Além disso, no snippet acima, você pode até preferir silenciar patcho redirecionamento completo de seu stdout e stderr para /dev/null)


11
Isso não funciona para mim. Quando executo esse comando, se o patch não tiver sido aplicado, ele pergunta se o patch será desassociado no modo interativo e, se eu usar o modo em lote, ele ignorará a operação reversa e aplicará o patch, retornando 0.
synack 19/10/19

11
Ei, tente adicionar -sfa patch(pode ser escrito como patch -Rsfp0 --dry-run) #
poige

11
@synack foi tudo bem?
poige

16

Apenas para o caso de ajudar alguém, se você estiver usando o script bash, o exemplo dado pelo Omnifarious não funcionaria. No bash, o status de saída de um comando bem-sucedido é 0

Portanto, o seguinte funcionaria:

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

A verificação deve ser contra, em 1vez de 0:if [ $? -eq 1 ]
Crisson 20/12/15

2
Não, 0 está correto. O patch sairia com zero se a execução a seco falhar por algum motivo; nesse caso, o patch não deve ser aplicado.
Fls'Zen

Meu script estava correto no bash. O bash considera um código de saída 0 truepara os fins de if. Precisamente porque a maioria dos comandos usa um código de saída 0 para indicar sucesso.
Omnifarious

2

Aqui está um palpite, supondo que você esteja usando o patchutilitário e cada arquivo a ser corrigido tenha seu próprio patch:

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

Ou, se você corrigiu os arquivos antes e deseja saber se tocou em algum arquivo específico, é possível executar a primeira rodada de patches com a -Bopção, o que causaria o backup. Então você verifica a existência do backup.
Peterph

8
Você poderia expandir um pouco o porquê de escolher usar nohupnesse ifcaso?
Zrajm

@ zrajm - Não me lembro por que fiz isso. E quando notei (por causa de uma solicitação de aprovação de edição) que estava lá, faz tanto tempo que não há chance de recuperar o motivo. Parece-me inútil olhar para ele agora.
Omnifarious

0

No meu caso, eu queria fazer essa verificação para que a execução do comando patch não acabasse com um terminal interativo perguntando o que fazer (especialmente para CI).

Acontece que, se você precisar, também poderá usar o --forwardargumento e ele pulará o patch, se já estiver aplicado!


0

Isso funcionou para mim.

"scripts": {
    "symfony-scripts": [
        "patch -N --silent -p0 < patches/vendor/somefile.js.patch &2>/dev/null",
        "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.