É possível saber se um arquivo já foi corrigido antes de aplicar o patch?
Eu preciso fazer isso em um script, algum pensamento?
É possível saber se um arquivo já foi corrigido antes de aplicar o patch?
Eu preciso fazer isso em um script, algum pensamento?
Respostas:
Sim, basta executar patch
com a --dry-run
opçã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 -R
opçã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 patch
o redirecionamento completo de seu stdout e stderr para /dev/null
)
-sf
a patch
(pode ser escrito como patch -Rsfp0 --dry-run
) #
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
1
vez de 0
:if [ $? -eq 1 ]
true
para os fins de if. Precisamente porque a maioria dos comandos usa um código de saída 0 para indicar sucesso.
Aqui está um palpite, supondo que você esteja usando o patch
utilitá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
-B
opção, o que causaria o backup. Então você verifica a existência do backup.
nohup
nesse if
caso?
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 --forward
argumento e ele pulará o patch, se já estiver aplicado!