Bir dosya veya klasörün önceden yamalanmış olup olmadığını kontrol edin


22

Düzeltme ekini uygulamadan önce bir dosyanın önceden yamalanmış olup olmadığını bilmek mümkün müdür?

Bunu bir senaryoda yapmak gerekiyor, herhangi bir düşünce?


1
Onları düzeltmek için hangi programı kullanıyorsunuz? Ne tür yamalar?
şeye kadir

Yanıtlar:


20

Evet, sadece koşmak patchile --dry-runseçeneği, ya başarısız olur ya da çıkış durumu ile tespit edilebilecek başarılı.

Ancak daha yaygın (ve hataya yatkın) bir şekilde , muhtemelen -R"ters" anlamına gelen bir seçenekle çalıştırmanız gerekir, çünkü yalnızca tüm yamayı geri alabiliyorsa "uygulanmış" olarak kabul edilebilir. Aksi takdirde ('-R' olmadan), yalnızca orijinal dosyanın bazı bölümleri değiştiği için başarısız olabilir. Aşağıda basit bir örnek verilmiştir:

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

(Dahası, yukarıdaki snippet'te patchstdout ve stderr'ı tamamen yeniden yönlendirerek susturmayı bile tercih edebilirsiniz /dev/null)


1
Bu benim için işe yaramıyor. Bu komutu çalıştırdığımda, yama uygulanmadıysa, yamanın etkileşimli modda 'geri alınmasını' isteyip istemediğini sorar ve toplu mod kullanırsam, ters işlemi yoksayar ve yamayı uygulayarak 0 döndürür.
synack

1
Hey eklemeyi deneyin -sfiçin patch(olarak yazılabilir patch -Rsfp0 --dry-run)
poige

1
@synack iyi gitti mi?
poige

16

Birisine yardım etmesi durumunda, eğer bash betiği kullanıyorsanız, Omnifarious tarafından verilen örnek işe yaramaz. Bash'da başarılı bir komutun çıkış durumu 0'dır.

Yani aşağıdakiler işe yarar:

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

Kontrol şu 1yerine karşı olmalıdır 0:if [ $? -eq 1 ]
Crisson

2
Hayır, 0 doğrudur. Kuru çalışma bir nedenden dolayı başarısız olursa yama sıfırdan çıkar, bu durumda yama uygulanmamalıdır.
Fls'Zen

Senaryom bash'de doğruydu. bash, 0 çıkış kodunun trueif amaçları için olduğunu düşünür . Çünkü çoğu komut başarıyı göstermek için 0 çıkış kodunu kullanır.
şeye kadir

2

patchYardımcı programı kullandığınızı ve yamanacak her dosyanın kendi yamasını olduğunu varsayarsak, bir tahmin :

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

Veya, dosyaları daha önce yamaladıysanız ve belirli bir dosyaya dokunup dokunmadığını bilmek istiyorsanız, ilk yama turunu -B, yedeklemenin yapılmasına neden olacak seçenekle çalıştırabilirsiniz . Sonra yedek varlığını kontrol edin.
peterph

8
nohupBu ifdurumda neden kullanmayı seçtiğiniz konusunda biraz genişleyebilir misiniz ?
zrajm

@zrajm - Bunu neden yaptığımı hatırlayamıyorum. Ve orada bir düzenleme onay isteği nedeniyle fark ettiğim zaman, o kadar uzun zaman önce nedenini geri kazanma şansım yoktu. Şimdi ona bakmak bana anlamsız geliyor.
şeye kadir

0

Benim durumumda, yama komutunu çalıştırmanın ne yapacağını soran etkileşimli bir terminalle (özellikle CI için) sonuçlanmaması için bu kontrolü yapmak istedim.

Sadece ihtiyacınız varsa --forwardargümanı da kullanabileceğiniz ve zaten uygulanmışsa yamanın atlanacağı ortaya çıkıyor!


0

Bu benim için çalıştı.

"scripts": {
    "symfony-scripts": [
        "patch -N --silent -p0 < patches/vendor/somefile.js.patch &2>/dev/null",
        "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.