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?

margarida
fonte
11
Qual programa você está usando para corrigi-los? Que tipo de patches?
#
11
A chave é "-R" - unix.stackexchange.com/a/86872/6622
poige

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)

poige
fonte
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
DivKis01
fonte
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
Omniforme
fonte
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!

maxime1992
fonte
0

Isso funcionou para mim.

"scripts": {
    "symfony-scripts": [
        "patch -N --silent -p0 < patches/vendor/somefile.js.patch &2>/dev/null",
        "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
neisantos
fonte