patch(1) | patch(1) |
patch - bir yama dosyasını orjinaline uygular
patch [seçenekler] [orjinal [yama]]
genellikle şöyle kullanılır:
patch -psayı <yama
patch, diff(1) ile üretilmiş bir fark listesi içeren bir yama dosyası alır ve bu yama dosyasındaki farkları bir veya daha fazla orjinal dosyaya uygulayarak orjinallerin yamalı sürümlerini üretir. Normalde yamalı sürümler orjinal dosyalara yazılarak oluşturulur. Yedekler oluşturulabilir; -b ve --backup seçeneklerine bakınız. Yamanacak dosyaların isimleri normalde yama dosyasından alınır, ancak eğer sadece bir yamanacak dosya varsa ismi komut satırında orjinal olarak belirtilebilir.
patch çalıştırıldığında fark listesinin türü -c (--context), -e (--ed), -n (--normal) veya -u (--unified) seçenekleri ile belirtilmemişse önce fark listesinin türünü saptamaya çalışır. ed fark dosyaları bir boruhattı ile ed(1) metin düzenleyicisi üzerinden uygulanırken, bağlamsal fark dosyaları (eski, yeni ve birleşik) ve normal fark dosyaları doğrudan patch tarafından uygulanır.
patch yama dosyasındaki olası bozuk alanları atlayarak yamayı uygulamaya çalışır. Bu özelliğinden yararlanarak yama dosyası içine bir açıklama yerleştirebilirsiniz ve buna rağmen yama uygulanır. Eğer diff dosyasının içeriği sürekli aynı biçimde girintilenmişse veya bir bağlamsal fark dpsyasında satırlar CRLF ile bitiyorsa ya da Internet RFC 934'de "-" için belirtildiği gibi "-" ile başlayan satırlar varsa bunlar hesaba katılır.
Bağlamsal fark dosyaları ile ve bir daha az genişletme yapan normal fark dosyaları ile patch, yama içindeki satır numaraları yanlış olduğunda bunu saptayabilir ve yama listesinin her elemanının uygulanacağı doğru yeri bulmaya çalışır. Önce listedeki her eleman ile ilgili satır numaralarını alır ve yamanın uygulanmasında kullanılan artı ve eksi ile belirlenmiş satırlara bakar. Eğer satır numaraları doğru yeri belirtmiyorsa, eksi ile belirtilmiş satırları bulmak üzere metni ileri ve geri her iki yönde tarar. patch ilk taramada değiştirilecek satırların tamamı için bir eşleşme arar. Böyle bir eşleşme bulamazsa, yama dosyası bir bağlamsal yama dosyası ise ve belirsizlik faktörü de 1 ise değiştirilecek satırların ilkini ve sonuncusunu yok sayarak bir arama daha yapar. Bulamazsa ve belirsizlik faktörü 2 veya 2 den büyükse bu kez ilk ve son iki satırı yok sayarak bir arama daha yapar. (Öntanımlı belirsizlik faktörü 2'dir.) patch yamanın uygulanacağı yeri bulamazsa, uygulayamadığı bölümü bir red dosyasına yazar. Bu dosyanın ismi normalde yama dosyasının ismine .rej eklenerek elde edilir. Eğer .rej eki çok uzun bir dosya ismi oluşturacaksa dosya isminin sonuna # eklenir, bu karakter de fazla geliyorsa dosya isminin son karakteri # ile değiştirilir. (Rededdilen kısım yamanın biçiminden bağımsız olarak sıradan bağlamsal fark biçiminde çıktılanır. Eğer girdi bir normal fark dosyası ise bağlamın çoğu basitçe boş olur.) Red dosyasındaki reddedilen kısımlarla ilgili satır numaraları yama dosyasındaki satır numaralarından farklı olabilir: yeni satır numaraları yamanın eski dosyada değil de yeni (yamanmış) dosyada bulunabileceği yaklaşık yeri belirtecek şekilde oluşturulur.
Her yama parçası tamamlandığında, eğer parçanın uygulanması başarısız olmuşsa (yeni dosyadaki) hangi satırdan itibaren devam edeceğini size bildirilir. Eğer yama parçası fark dosyasında belirtilen satırdan farklı numaralı bir satıra uygulanmışsa size yeni konumu bildirir. Yeni konumun çok farklı olması parçanın yanlış yeri yamamakta kullanıldığını belirtebilir. Bir eşleşme bulunurken belirsizlik faktörü kullanmak gerekmişse, biraz kuşku duyasınız diye bu da ayrıca bildirilir. --verbose seçeneğini belirtmişseniz başarıyla uygulanan yama parçaları hakkında da bilgi verilir.
Komut satırında orjinal dosya belirtilmemişse patch, yama dosyasındaki yama olarak uygulanabilecek alanların dışındaki alanları değerlendirerek aşağıdaki kurallara bağlı olarak yamanın uygulanacağı dosyanın ismini tespit etmeye çalışır.
Önce, aday dosya isimlerinin listesini elde etmeye çalışır. Bunu şöyle yapar:
patch bir dosya ismini aday dosya listesinden şu kurallara göre seçer:
İsimli dosyalar listesinden "eniyi" dosya ismi şöyle seçilir: önce en az sayıda dizini dosya yolu olarak alır, bundan sonra, uzantısız en kısa dosya isimleri, bundlardan sonra en kısa isimlerin tümü ve son olarak da kalan ilk isim alınır.
Ek olarak, Yama olarak uygulanacak alanların dışında Prereq: ile başlayan bir satır varsa, patch bu öngereklilikler satırındaki ilk sözcüğü (normalde bir sürüm numaraasıdır) alır ve orjinal dosyaya bu sözcük var mı diye bakar. Yoksa patch işine devam etmeden önce bir doğrulama isteği yapar.
Tüm bunların nihayetinde, şöyle bir bildirim de yapabilirsiniz:
| patch -d /usr/src/local/blurfl
ve, blurfl dizinindeki bir dosya yama dosyasıyla yamanır.
Eğer yama dosyası bir yamadan fazlasını içeriyorsa patch onların herbirini farklı birer yama dosyasından geliyormuşçasına uygular. Yama olarak uygulanabilecek her satır grubundan önce gelen satırlarda bulunan dosya isimleri ve sürüm numaralarından yukarıda bahsedildiği gibi yamanacak dosyanın ismi saptanarak bu işlem gerçekleştirilir.
/u/howard/src/blurfl/blurfl.c
Seçenek -p0 olarak verilirse bu dizge olduğu gibi ele alınır, -p1 verilirse,
u/howard/src/blurfl/blurfl.c
baştaki bölü çizgisi atılır, -p4 verilirse,
blurfl/blurfl.c
olur. -p hiç belirtilmezse sonuç blurfl.c olacaktır. Bu durumda dosya yamanın bulunduğu dizinde aranacağından dosya daha farklı bir yerdeyse bu da -d seçeneği ile belirtilebilir.
Yama içindeki kısımlardan ilkinin uygulanması başarısız olursa, patch bu kısmın eski ve yeni satırlarını yer değiştirerek böyle uygulanabiliyor mu diye bakar. Böyle uygulanabiliyorsa kullanıcıya -R seçeneğinin uygulanmasını isteyip istemediğini sorar. Uygulanamıyorsa, patch normal olarak uygulamaya devam eder. (Bilgi: Eğer yama bir normal yama ise ve boş bir içerik bile daima eşleşeceğinden ilk komut yamanın bir ek uygulanacağını belirtiyorsa bu yöntem yer değiştirmeli yamayı saptayamaz. Tesadüfen, çoğu yama bir satırın tamamen silinmesini değil ya bir ek ya da bir değişiklik yapılmasını gerektirir, bu durumda yer değiştirmeli normal fark dosyalarından silme işlemi ile başlayanlar başarıyı arttıran kuralların uygulanmasına bağlı olarak başarısız olur.)
yöntem değeri GNU Emacs'ın `version-control' değişkeni gibidir; farklı olarak patch daha açıklayıcı olan eşanlamlılarını da tanır. Geçerli yöntem değerleri şunlardır (eşsiz kısaltmalar da kabul edilir):
Dosyanın orjinal zamanı yama başlığında belirtilen zamanla eşleşmezse ya da onun içeriği yama ile tam olarak eşleşmezse, -Z (--set-utc) ve -T (--set-time) seçenekleri bir dosyanın zamanını ayarlamaktan kaçınır. Buna rağmen -f (--force) seçeneği belirtilmişse dosyanın zamanı ne olursa olsun ayarlanır.
diff çıktı biçiminin sınırlamalarından dolayı, dosyaları içeriği değiştirilmeyecekse, bu seçeneklerle bu dosyaların zamanı güncellenemez. Ayrıca, bu seçenekleri kullandığınız takdirde, zamanları güncellenmiş dosyalara bağımlı dosyaları kaldırmalısınız (make clean gibi). Böylece sonraki make çağrılarında yamanmış dosyaların zamanlarından dolayı hatalarla/uyarılarla karşılaşmazsınız.
Marshall T. Rose ve Einar A. Stefferud, Proposed Standard for
Message Encapsulation,
Internet RFC 934 <URL: ftp://ftp.isi.edu/innotes/rfc934.txt>
(1985-01).
Yama göndermeye hazırlanıyorsanız, hatırlamanız gereken bir sürü şey olacaktır.
Yamanızı sistemli olarak
oluşturmalısınız. İyi bir yöntem
diff -Naur eski yeni komutunu kullanmaktır. Burada
eski ve yeni ile eski ve yeni dizin isimleri belirtilir. Bu
isimler herhangi bir bölü çizgisi içermemelidir.
diff komutunun başlıkları yama
uygulayıcıların yamayı -Z
(--set-utc) seçeneği ile uygulayabilecekleri
şekilde Evrensel Zamanda geleneksel Unix tarih ve zaman
biçiminde içermelidir. Bu örnekte, komut Bourne
kabuğu (bash) sözdizimiyle
yazılmıştır:
LC_ALL=C TZ=UTC0 diff -Naur gcc-2.7 gcc-2.8
Yamanızı uygulayacak olanlara hangi dizine geçip hangi patch seçeneğini kullanacağını söyleyin. Seçenek dizgesi olarak -Np1 önerilir. Yaptığınız yamayı kendinizi yamayı alacakların yerine koyarak deneyin, yani orjinal dosyaların bir kopyasına bu yamayı uygulayın.
İlk diff'e göre yama seviyesini arttırmak için yamanmış bir patchlevel.h dosyası tutmaktan dolayı çok üzgün kişileri gönderdiğiniz yama sayesinde kazanabilirsiniz. Yama içine bir Prereq: satırı koyarsanız onların sıradışı yamaları uygularken bazı uyarılar almamasını sağlamış olursunuz.
Bir dosyanın yama uygulanırken oluşturulmasını isterseniz, oluşturulacak dosyayı /dev/null ile ya da zaman damgası Unix çağ başlangıcına (Epoch: 1970-01-01 00:00:00 UTC) ayarlanmış boş bir dosya ile karşılaştırılarak yapılmış bir fark dosyası ile bunu sağlayabilirsiniz. Bu sadece, oluşturulacak dosya hedef dizinde yoksa çalışır. Tersine, yama uygulanıren mevcut bir dosyanın silinmesini isterseniz, silinecek dosyayı yine zaman damgası Unix çağ başlangıcına ayarlanmış boş bir dosya ile karşılaştırılarak yapılmış bir fark dosyası ile bunu sağlayabilirsiniz. Silinmesini istediğiniz dosya, patch POSIX uyumlu değilse ve -E (--remove-empty-files) seçeneği verilmişse, silinecektir. Dosyaları oluşturan ya da silen yamalar üretmenin kolay bir yolu GNU diff'in -N (--new-file) seçeneğini kullanmaktır.
Alıcıların -pN seçeneğini kullanacağını varsayıyorsanız, bunun gibi bir çıktıya sahip yama göndermeyin:
diff -Naur v2.0.29/prog/README prog/README --- v2.0.29/prog/README Mon Mar 10 15:13:12 1997 +++ prog/README Mon Mar 17 14:58:22 1997
Çünkü burada eski ve yeni dosya isimleri farklı sayıda bölü çizgisi içermektedir ve patch'in farklı sürümleri dosya isimlerini farklı yorumlarlar. Karışıklığı önlemek için böyle bir çıktı üreten yamalar gönderin:
diff -Naur v2.0.29/prog/README v2.0.30/prog/README --- v2.0.29/prog/README Mon Mar 10 15:13:12 1997 +++ v2.0.30/prog/README Mon Mar 17 14:58:22 1997
README.orig gibi yedek dosya ismi olarak kullanılabilecek bir dosya ismi ile karşılaştırılarak üretilmiş yamalar göndermekten kaçının. Böyle bir yama patch'in gerçek dosyayı değil yedekleme dosyasını yamamasına yol açabilir. Bunun yerine old/README ve new/README gibi farklı dizinlerde bulunan aynı isimli iki dosyayı karşılaştırın.
Yer değiştirmeli yamalar göndermemeye çalışın. Böyle bir yama zaten uygulanmış bir yama gibi görüneceğinden insanları şaşırtır.
Yamanızın türetilerek elde edilen dosyaları yamamasına dikkat edin (makefile'ınızın içinde configure: configure.in diye bir satır var diye configure dosyasını yamamak gibi.). Alıcılar bu tür türetilerek elde edilen dosyaları zaten kendileri türetebilmelidir. Türetilen dosyalar için fark dosyaları göndermek zorundaysanız, fark dosyalarını UTC kullanarak üretin. Böylece alıcılar yamayı -Z (--set-utc) seçeneği ile uygulayıp yamanmış dosyalara bağımlı yamanmamış dosyaları kaldırmak zorunda kalırlar (make clean yapmak gibi).
Beşyüzbilmemkaç farklık bir listeyi tek bir dosyaya koymaktan kaçınmak iyi olurdu. Birbiriyle ilgileri nedeniyle gruplanabilen dosyalarla ilgili yamaları farklı dosyalara koymak akıllıca olur.
Tanı iletilerinin varlığı genellikle patch'in yama dosyanızı çözümleyemediğini belirtir.
--verbose seçeneği verilmişse bir Hmm... iletisi, yama dosyasında işlenemeyen bir metinin varlığını ve patch'in bu metin içinde bir yama var mı acaba, varsa bu ne tür bir yamadır acaba diye bir saptama yapmaya çalıştığını gösterir.
patch'in çıkış durumu 0 ise, listedeki yamaların hepsi başarıyla uygulanmış demektir. 1 ise bazıları uygulanamamıştır. 2 ise biraz daha fazla sorun vardır. Bir döngü içinde çok sayıda yama uyguluyorsanız her seferinde bu çıkış durumuna bakmanız icabeder, böylece kısmen yamanmış dosyalara sonraki yamayı uygulamamış olursunuz.
Bağlamsal fark dosyaları boş dosyaların ve boş dizinlerin ya da sembolik bağ gibi özel dosyaların oluşturulması ve silinmesi için güvenilir bir içerik sunamazlar. Sahiplik, dosya izinleri gibi dosyaların temel verilerinde bir değişiklik bilgisi sunamadıkları gibi bir dosyanın başka bir dosyaya sabit bağ mı olacağı gibi bilgileri de içeremezler. Bu tür değişiklikler gerekliyse, bunları gerçekleştirecek bir betik yamaya eşlik etmelidir.
patch, bir ed betiğinde olmayan satır numaraları hakkında birşey söyleyemediği gibi, bir normal fark dosyasında da sadece bir değişiklik ya da silme işlemi bulursa hatalı satır numaralarını saptayabilir. Belirsizlik faktörü olarak 3 verildiğinde bağlamsal fark dosyaları da sorun yaratabilir. Elverişli bir etkileşimli arayüz eklenene kadar, bir bağlamsal fark dosyasının böyle bir durumda sorun çıkarıp çıkarmayacağını kendiniz saptamalısınız. Şüphesiz, hatasız gerçekleşen bir derleme işlemi yamanın hatasız uygulandığını gösteriyor gibi görünse de bu daima böyle olmaz.
patch, bazan biraz fazla tahmin yapması gerekse bile genellikle doğru sonuçlar üretir. Yine de, yamanın üretildiği dosya ile yamanın uygulandığı dosya aynı sürüme ait olduğu zaman sonuçların doğru olacağı garanti edilmiştir.
POSIX standardı, patch'in geleneksel davranışından farklı davranışlar belirtir. patch'in POSIX uyumluluğu olmayan 2.1 ve daha önceki sürümleri ile çalışmak zorundaysanız bu farklardan haberdar olmanız gerekir.
Ayrıca, geleneksel patch dosya yolunu saptarken bölü çizgilerinin sayısına bakarken yeni sürümleri dosya yolunu oluşturan elemanların sayısına bakmaktadır. Bundan dolayı, birden fazla yanyana bölü çizgisi tek bir bölü çizgisi olarak ele alınmaktadır. En yüksek derecede uyumluluk adına gönderilen yamaların içindeki dosya isimlerinde // olmamasına dikkat edin.
Bunun tersine, POSIX patch'de bir eşleşmeme olsa bile yedekleme asla yapılmaz. GNU patch'de bu davranış --posix seçeneği kullanılarak yahut POSIXLY_CORRECT ortam değişkeninin varlığı sayesinde POSIX uyumluluğu sağlanarak aksi takdirde --no-backup-if-mismatch seçeneği ile etkinleştirilir.
Geleneksel patch'in -b sonek seçeneği ile GNU patch'in -b -z sonek seçenekleri eşdeğerdir.
-c -d dizin -D tanım -e -l -n -N -o çıktıdosyası -psayı -R -r reddosyası
Yazılım hatalarını lütfen eposta ile <bug-gnu-utils (at) gnu.org> adresine bildiriniz.
patch kısmî eşleşmelerde, aşırı kaymış başlangıç konumlarında ve yer değiştirmelerde daha çevik olmalıydı ama bu işlemler ek bir geçiş gerektiriyor.
Kod eğer yinelenmişse (örneğin, #ifdef ESKİKOD ... #else ... #endif ile) patch her iki sürümüde yamayamayacatır ve bu her ikisi için de uygulanabiliyorsa, yanlış sürüm yamanabilecek ve size işlemin başarılı olduğunu söylececektir.
Evvelce uygulanmış bir yamayı uygularsanız, patch yamanın yer değiştirmeli yama olarak uygulanacağını varsayabilir ve size bu yamayı uygulamamayı teklif eder. Bu bir özellik olarak yorumlanabilirdi.
Telif Hakkı © 1984, 1985, 1986, 1988 Larry Wall.
Telif Hakkı © 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
1997, 1998 Free Software Foundation, Inc.
Bu kılavuzun harfi harfine kopyalanmasına ve dağıtılmasına telif hakkı uyarısının ve bu izin uyarısının tüm kopyalarında bulunması şartıyla izin verilmiştir.
Bu kılavuzun değiştirilmiş kopyalarının kopyalanması ve dağıtılması, türetilmiş çalışmanın sonuçlarının tamamı, harfi harfine kopyalamanın koşullarını içererek ve buna eşdeğer bir izin uyarısı da sağlandığı takdirde izin verilmiştir.
Bu kılavuzun diğer dillere çevirilerinin kopyalanması ve dağıtılmasına, bu izin uyarısının bulunduğu orjinal ingilizce sürümdeki telif hakkı sahipleri tarafından onaylanmış bir çeviri değilse, yukarıda açıklanan değiştirilmiş sürümlerinin koşulları sağlandığı takdirde izin verilmiştir.
Copyright 1984, 1985, 1986, 1988 Larry Wall.
Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998 Free
Software Foundation, Inc.
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.
Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be included in translations approved by the copyright holders instead of in the original English.
patch'in orjinal sürümü Larry Wall tarafından yazılmıştır. Paul Eggert patch'in keyfî sınırlarını kaldırdı; ikilik dosyaların desteklenmesi, dosya zamanlarının ayarlanması, dosyaları silinmesi özelliklerini ekledi; ve daha iyi POSIX uyumluluğu sağladı. Diğer destekleyicilerden Wayne Davison unidiff desteğini, David MacKenzie yapılandırma ve yedekleme desteklerini sağladı.
Nilgün Belma Bugüner <nilgun (at) belgeler·gen·tr>, Ağustos 2004
21 Mart 1998 | GNU |