Periksa apakah file atau folder sudah ditambal

22

Apakah mungkin untuk mengetahui apakah suatu file telah ditambal, sebelum menerapkan tambalan?

Saya perlu melakukan ini dalam naskah, ada pemikiran?

bunga aster
sumber
1
Program apa yang Anda gunakan untuk menambalnya? Jenis tambalan seperti apa?
Mahakuasa
1
Kuncinya adalah "-R" - unix.stackexchange.com/a/86872/6622
poige

Jawaban:

20

Yap, jalankan saja patchdengan --dry-runopsi, itu akan gagal atau berhasil yang dapat ditemukan dengan status keluarnya.

Tetapi dengan cara yang lebih umum (dan rawan kesalahan) , Anda mungkin harus menjalankannya dengan -Ropsi yang berarti "membalikkan" karena hanya jika ia dapat mengembalikan seluruh tambalan itu dapat dianggap sebagai "diterapkan". Kalau tidak (tanpa '-R') itu bisa gagal hanya karena beberapa bagian dari file asli diubah. Di bawah ini adalah contoh sederhana:

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

(Terlebih lagi, dalam cuplikan di atas Anda bahkan mungkin lebih memilih untuk diam patchsepenuhnya mengarahkan stdout dan stderr ke /dev/null)

poige
sumber
1
Ini tidak bekerja untuk saya. Ketika saya menjalankan perintah itu, jika tambalan belum diterapkan, ia bertanya apakah akan 'membatalkan' tambalan dalam mode interaktif dan, jika saya menggunakan mode batch, itu akan mengabaikan operasi balik dan menerapkan tambalan, mengembalikan 0.
synack
1
Hei, coba tambahkan -sfke patch(dapat ditulis sebagai patch -Rsfp0 --dry-run)
poige
1
@synack apakah itu berjalan ok?
poige
16

Kalau-kalau itu membantu seseorang, jika Anda menggunakan skrip bash maka contoh yang diberikan oleh Mahakuasa tidak akan berfungsi. Dalam bash status keluar dari perintah yang berhasil adalah 0

Jadi yang berikut ini akan berhasil:

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
sumber
Pengecekan seharusnya bertentangan dan 1bukannya 0:if [ $? -eq 1 ]
Crisson
2
Tidak, 0 benar. Patch akan keluar dengan non-nol jika dry-run gagal karena suatu alasan, dalam hal ini patch tidak boleh diterapkan.
Fls'Zen
Skrip saya benar di bash. bash menganggap kode keluar 0 trueuntuk keperluan if. Justru karena sebagian besar perintah menggunakan kode keluar 0 untuk menunjukkan keberhasilan.
Mahakuasa
2

Berikut ini dugaan, dengan asumsi bahwa Anda menggunakan patchutilitas dan setiap file yang akan ditambal memiliki tambalannya sendiri:

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
Beraneka ragam
sumber
Atau, jika Anda menambal file sebelumnya dan ingin tahu, apakah itu menyentuh beberapa file tertentu, Anda dapat menjalankan putaran tambalan pertama dengan -Bopsi, yang akan menyebabkan cadangan dibuat. Kemudian Anda memeriksa keberadaan cadangan.
peterph
8
Bisakah Anda mengembangkan sedikit tentang mengapa Anda memilih untuk menggunakan nohupdalam ifkasus itu?
zrajm
@zrajm - Saya tidak ingat mengapa saya melakukan itu. Dan pada saat saya perhatikan (karena permintaan persetujuan edit) bahwa itu ada di sana, sudah lama sekali tidak ada kesempatan saya akan pernah memulihkan alasannya. Sepertinya tidak ada gunanya bagi saya untuk melihatnya sekarang.
Mahakuasa
0

Dalam kasus saya, saya ingin melakukan pengecekan sehingga menjalankan perintah patch tidak akan berakhir dengan terminal interaktif yang menanyakan apa yang harus dilakukan (terutama untuk CI).

Ternyata jika Anda hanya membutuhkannya, Anda juga dapat menggunakan --forwardargumen dan itu akan melewati tambalan jika sudah diterapkan!

maxime1992
sumber
0

Ini berhasil bagi saya.

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