- İSİM
- patch — bir yama dosyasını orjinaline uygular
- KULLANIM
patch [seçenekler] [orjinal [yama]]
genellikle şöyle kullanılır:
- AÇIKLAMA
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:
Başlık bir bağlamsal fark dosyası başlığı ise, patch eski ve yeni dosya isimlerini başlıktan alır. Eğer isimdeki bölü çizgilerinin sayısı -psayı veya --strip=sayı seçenekleri ile belirtilen kadar değilse bu isim yoksayılır. /dev/null ismi de ayrıca yoksayılır.
Yama olarak uygulanacak alanların dışında Index: ile başlayan satırlar varsa ve hem yeni hem de eski dosya isimleri belirtilmemişse veya patch POSIX uyumlu ise, patch dosya isimlerini Index: ile başlayan satırlardan alır.
Bundan sonraki kurallara uygun olmak üzere, aday dosya isimlerinin, başlıkta göründükleri sıraya bakılmaksızın, (eski, yeni, Index) düzeninde olacakları varsayılır.
patch bir dosya ismini aday dosya listesinden şu kurallara göre seçer:
Bazı isimli dosyalar mevcutsa, patch POSIX uyumluysa ilk dosya ismi değilse eniyi isim seçilir.
Eğer patch RCS, ClearCase ve SCCS'yi yoksaymıyorsa (-g sayı veya --get=sayı seçeneklerine bakınız) ve isimli bir dosya mevcut değilse ama bir RCS, ClearCase veya SCCS ana dosyası varsa patch ilk isimli dosyayı RCS, ClearCase veya SCCS ana dosyası ile seçer.
İsimli dosya mevcut değilse, bir RCS, ClearCase veya SCCS ana dosyası da yoksa ama bazı dosya isimleri verilmişse, patch POSIX uyumlu değilse ve yamanın bir dosya oluşturması gerekiyorsa, patch en az dizin oluşturulacak şekilde en iyi dosya ismini seçer.
Şimdiye dek bahsedilen kurallarla hal bir dosya ismi seçilememişse, yamanacak dosyanın ismi size sorulur ve patch dosya ismini buna 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.
- SEÇENEKLER
-
- -b
- --backup
Dosyaların yedeğini oluşturur. Bir dosya yamanırken orjinal dosya silinmez, ya başka bir yere kopyalanır ya da ismi değiştirilir. Mevcut olmayan bir dosyanın yedeği yapılırken, olmayan dosyayı belirtmek için sadece ismi olan cismi olmayan (boş) bir dosya oluşturulur. Yedek dosya isimlerinin nasıl oluşturulduğu -V veya --version-control seçeneklerinin açıklamalarında bulunabilir.
- --backup-if-mismatch
Yama bir dosya ile tam uyuşmazsa ve yedekleme istenmese de dosya yedeklenir. patch POSIX uyumlu değilse bu seçenek öntanımlı olarak uygulanır.
- --no-backup-if-mismatch
Yama bir dosya ile tam uyuşmazsa ve yedekleme istense de dosya yedeklenmez. patch POSIX uyumlu değilse bu seçenek öntanımlı olarak uygulanır.
- -B önek
- --prefix=önek
Basit yedek dosya ismi oluşturulurken dosya isminin önüne önek getirilir. Örneğin, -B /junk/ ile dosya ismi src/patch/util.c olan bir dosyanın basit yedeği yapılırken dosya ismi /junk/src/patch/util.c yapılır.
- --binary
Standart çıktı veya /dev/tty dışında tüm dosyalar için okuma ve yazma işlemleri iklik kipte yapılır. Bu seçenek POSIX uyumlu sistemlerde etkisizdir. DOS benzeri sistemlerde ise bu seçeneğin bir fark oluşturması için yama diff -a --binary ile üretilmiş olmalıdır.
- -c
- --context
Yama dosyası sıradan bir bağlamsal fark dosyası olarak yorumlanır.
- -d dizin
- --directory=dizin
Hiçbir şey yapmadan, hemen dizin dizinine geçilir.
- -D tanım
- --ifdef=tanım
Değişiklikleri işaretlemede #ifdef ... #endif yapısı tanım farklılaştırma sembolü ile kullanılır.
- --dry-run
Hiçbir dosyada değişiklik yapmaksızın uygulanan yamaların sonuçları basılır.
- -e
- --ed
Yama dosyası bir ed betiği olarak yorumlanır.
- -E
- --remove-empty-files
Yama uygulandıktan sonra boşalan dosyalar silinir. Aslında, bu seçenek gereksizdir, çünkü patch yamadıktan sonra dosyanın varolup olmayacağını saptamak için başlıktaki tarih damgasını inceler. Buna rağmen, girdi bir bağlamsal fark dosyası değilse ya da patch POSIX uyumlu ise, patch bu seçenek verilmedikçe yamandıktan sonra boşalan dosyaları silmez. patch böyle bir dosyayı sildikten sonra boşalmışsa dosyanın bulunduğu dizini de silmeye çalışır.
- -f
- --force
Kullanıcının ne yaptığını tam olarak bildiği varsayılır ve kullanıcıya herhangi bir soru yöneltilmez. Hangi dosyaların yamanacağını belirtmeyen başlıklar içeren yamalar atlanır; Prereq: ile başlayan satırlarda yanlış sürüm bilgisi olsa bile dosya yamanır; eski ve yeni dosyaların yer değiştirilmesi gerekse bile yamaların bu işlem yapılmadan uygulanacağı varsayılır. Bu seçenek açıklamaları engellemez, bunun için -s seçeneğine bakınız.
- -F sayı
- --fuzz=sayı
En büyük belirsizlik faktörünü belirtmekte kullanılır. Bu seçenek sadece bağlamsal fark dosyalarına uygulanır ve patch yamanacak yeri bulurken yama olarak kullanılacak satırların baştan ve sondan bu kadarını yoksayar. Çok büyük belirsizlik faktörlerinin yamanın başarısızlığını arttıracağını unutmayın. Öntanımlı belirsizlik faktörü 2'dir ve bağlamsal fark dosyalarında bağlamsal satır sayısından daha yüksek bir değer (genelde 3'tür) atanmamalıdır.
- -g sayı
- --get=sayı
Bir dosya RCS veya SCCS denetimindeyken, böyle bir dosya yoksa veya salt-okunursa ya da öntanımlı sürümüyle eşleşiyorsa; veya ClearCase denetimindeyken, böyle bir dosya yoksa, bu seçenek, patch'in eylemlerini denetlemekte kullanılır. sayı pozitifse, patch dosyayı sürüm denetim sisteminden alır; sıfırsa, RCS, SCCS veya ClearCase yoksayılır ve dosya alınmaz; negatifse dosyanın alınıp alınmayacağı kullanıcıya sorulur. Bu seçeneğin öntanımlı değeri eğer atanmışsa, PATCH_GET ortam değişkeninden alınır; atanmamışsa ve patch POSIX uyumluysa öntanımlı değer sıfır, aksi takdirde negatiftir.
- --help
Seçeneklerin bir özetini basar ve çıkar.
- -i yamadosyası
- --input=yamadosyası
Yama yamadosyası dosyasından okunur. yamadosyası olarak - verilmişse öntanımlı olarak standart girdi okunur.
- -l
- --ignore-whitespace
Yamanacak dosyaların içindeki sekmeler ve boşluklar için yama içindeki boşluklarla birebir eşleşme aranmaz, ancak herhangi bir uzunlukta boşluğun her iki dosyada da karşılıklı varlığı şarttır, satır sonlarındaki boşluklar eşleşme açısından yoksayılır. Normal karakterler tam olarak eşleştirilir. Bağlamsal her satır yamanacak dosyadaki satırlarla daima eşleştirilir.
- -n
- --normal
Yama dosyası normal bir yama dosyası olarak yorumlanır.
- -N
- --forward
Eski ve yeni dosyaların yer değiştirileceği görünen veya zaten uygulanmış yamalar yoksayılır. -R seçeneğine de bakınız.
- -o çıktıdosyası
- --output=çıktıdosyası
Dosyaların yerinde yamanması yerine çıktı, çıktıdosyası dosyasına gönderilir.
- -p sayı
- --strip=sayı
Yama dosyasında bulunan her dosya isminin başından sayı ile belirtilen sayıda bölü çizgisi içeren dizge yoksayılır. Birden fazla yanyana bölü çizgisi varsa bunlar tek bir bölü çizgisi sayılır. Yama dosyasının yamanacak dosyalardan farklı bir dizinde tutulması durumunda yamanacak dosyaların nasıl bulunacağını belirtmek amacıyla kullanılır. Örneğin, yama dosyasında yamanacak dosya isminin şöyle verildiğini varsayalım:
/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,
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.
- --posix
POSIX standardına kesinlikle uyulur:
Fark dosyası başlıklarından dosya isimleri öğrenilirken, listedeki (eski, yeni, birleşik) ilk mevcut dosya alınır.
Yamandıktan sonra boşalan dosyalar silinmez.
RCS, ClearCase veya SCCS'deki dosyalar için alınacak mı diye sormaz.
Komut satırında seçeneklerin dosyalardan önce verilmesi gerekir.
Eşleşmeyen dosyaların yedeklemesi yapılmaz.
- --quoting-style=sözcük
Çıktılanan isimler sarmalanırken sözcük ile belirtilen tarz kullanılır. sözcük şunlardan biri olabilir:
- literal
İsimler olduğu gibi çıktılanır.
- shell
İsimler kabuk metakarakterleri içeriyorsa kabuk için sarmalanır yoksa anlamı belirsiz çıktılama yapılır.
- shell-always
Normalde sarmalanmaları gerekmese bile isimler daima kabuk için sarmalanır.
- c
İsimler C dilinde dizgelere uygulandığı gibi sarmalanır.
- escape
İsimler çevreleyen çifttırnakların ihmal edilmesi dışında c tarzındaki gibi sarmalanır.
--quoting-style seçeneği için öntanımlı değeri QUOTING_STYLE ortam değişkeninde belirtebilirsiniz. Bu ortam değikeni atanmamışsa öntanımlı değer shell'dir.
- -r reddosyası
- --reject-file=reddosyası
Bu yamanın eski ve yeni dosyalar yer değiştirilerek uygulanacağı varsayılır. Yama olarak kullanılacak her bölümdeki eski ve yeni satırlar yer değiştirilerek uygulanmaya çalışılır. Yer değiştirildiğinde anlamsız olan kısımlar reddedilir. -R seçeneği ed fark betikleri ile çalışmaz, çünkü yer değiştirme işlemini gerçekleştirmek için çok az bilgi içerirler.
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.)
- -s
- --silent
- --quiet
Bir hata oluşmadıkça bilgilendirici hiçbir şey çıktılanmaz.
- -t
- --batch
-f seçeneğinde olduğu gibi sorular engellenir ama bu biraz farklı kabulllerle yapılır: başlıklarında dosya isimlerini içermeyen yamalar atlanır (-f ile aynı); yamanın Prereq: satırında yanlış sürüm belirtilen dosyalar için yamalar atlanır; ve yer değiştirme uygulanması gerekliliği saptanan yamaların yer değiştirme ile uygulanacağı varsayılır.
- -T
- --set-time
Yamanmış dosyaların erişim ve değiştirme zamanları, bağlamsal fark dosyalarının başlıklarındaki zaman bilgisinin yerel zamanı gösterdiği varsayımıyla bu zamana ayarlanır. Bu seçeneğin kullanılması önerilmez, çünkü yerel zaman kullanılarak uygulanan yamaları diğer zaman dilimlerindeki kulanıcılar kolayca kullanamazlar, ayrıca yaz saati uygulamasından dolayı yerel zaman damgaları yamanın geçmişte uygulanması gibi tuhaflıklara sebep olabilir. Bu seçenek yerine -Z veya --set-utc seçeneklerini kullanarak zamanı UTC'ye göre belirtmeyi tercih edin.
- -u
- --unified
Yama dosyası birleşik bağlamsal fark dosyası olarak yorumlanır.
- -v
- --version
patch'in sürüm başlığını ve ama seviyesini basar ve çıkar.
- -V yöntem
- --version-control=yöntem
Yedek dosya isimleri saptanırken yöntem kullanılır. Bu yöntem ayrıca bu seçenek ile gerektiğinde değiştirilmek üzere PATCH_VERSION_CONTROL (veya bu atanmamışsa VERSION_CONTROL) ortam değişkeni ile atanabilir. Burada bir yöntemin atanması yedekleme yapılacağı anlamına gelmez, sadece yedekleme yapılacaksa yedek dosyalarının ismi bu yöntem kullanılarak saptanır.
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):
- existing
- nil
Zaten varolan dosyaların numaralı yedekleri yapılır, aksi takdirde basit yedekleme yapılır. Bu öntanımlıdır.
- numbered
- t
Numaralı yedekleme yapılır. F dosyasının yedek dosyası N sürüm numarasını belirtmek üzere F.~N~ biçiminde isimlendirilir.
- simple
- never
Basit yedekleme yapılır. -B (--prefix), -Y (--basename-prefix) ve -z (--suffix) seçenekleri ile basit yedek dosyası ismi belirtilebilir. Bu seçeneklerin hiçbiri belirtilmemişse, basit yedekleme soneki kullanılır; sonek değeri SIMPLE_BACKUP_SUFFIX ortam değişkeni ile belirtilmemişse öntanımlı olarak .orig soneki kullanılır.
Numaralı ve basit yedeklemede dosya ismi çok uzun olursa bunlar yerine sonek olarak ~ kullanılır, bu işlem de dosya isminin çok uzun olmasına sebep oluyorsa dosya ismindeki son karakter ~ karakteri ile değiştirilir.
- --verbose
Yapılan işlem hakkında daha ayrıntılı bilgi verilir.
- -x sayı
- --debug=sayı
Sadece patch yamacılarını ilgilendiren hata ayıklama seçeneklerini belirtmek için kullanılır.
- -Y önek
- --basename-prefix=önek
Basit yedek dosyası ismi oluşturulurken dizinlerden arındırılmış dosya isminin önüne önek getirilir. Örneğin basit yedek dosya ismi -Y .del/ ile belirtilmişse src/patch/util.c dosyasının ismi src/patch/.del/util.c yapılır.
- -z sonek
- --suffix=sonek
Basit yedek dosyası ismi oluşturulurken dosya isminin sonuna sonek getirilir. Örneğin basit yedek dosya ismi -z - ile belirtilmişse src/patch/util.c dosyasının ismi src/patch/util.c- yapılır. Yedekleme soneki gerektiğinde bu seçenek ile değiştirilmek üzere SIMPLE_BACKUP_SUFFIX ortam değişkeni ile de atanabilir.
- -Z
- --set-utc
Yamanmış dosyaların erişim ve değiştirme zamanları, bağlamsal fark dosyalarının başlıklarındaki zaman bilgisinin koordinatlı evrensel zamanı (UTC; GMT olarak da bilinir) gösterdiği varsayımıyla bu zamana ayarlanır. Ayrıca -T veya --set-time seçeneklerinin açıklamasına da bakınız.
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.
- ORTAM DEĞİŞKENLERİ
-
- PATCH_GET
Eksik ya da salt-okunur dosyaların RCS, ClearCase veya SCCS'den öntanımlı olarak alınıp alınmayacağını belirtmek için kullanılır. -g (--get) seçeneğinin açıklamasına bakınız.
- POSIXLY_CORRECT
Bu değişken atanmışsa patch öntanımlı olarak POSIX standardına uyumlu davranır. --posix seçeneğinin açıklamasına bakınız.
- QUOTING_STYLE
--quoting-style seçeneğinin öntanımlı değeridir.
- SIMPLE_BACKUP_SUFFIX
Bu ortam değişkeninin değeri basit yedekleme dosyalarında .orig soneki yerine kullanılacak sonektir.
- TMPDIR, TMP, TEMP
Geçici dosyaları konulacağı dizindir. patch bu listeden atanmış değerlerden ilkinin değeri kullanır. Hiçbiri atanmamışsa sisteme bağlı öntanımlı değer kullanılır. Unix makinalar için bu değer normalde /tmp dizinidir.
- VERSION_CONTROL, PATCH_VERSION_CONTROL
Sürüm denetim tarzını belirtir. -v (--version-control) seçeneğinin açıklamasına bakınız.
- İLGİLİ DOSYALAR
- /dev/tty
denetim uçbirimi; kullanıcıya sorulan soruların yanıtlarını almak için kullanılır.
- $TMPDIR/p*
geçici dosyalar
- İLGİLİ BELGELER
- YAMA GÖNDERENLER İÇİN
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.
- TANI İLETİLERİ
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.
- YETERSİZLİKLER
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.
- UYUMLULUK BİLGİLERİ
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.
Geleneksel patch'de -p seçeneğinin terimi isteğe bağlıdır. Yalnız başına -p seçeneği -p0'a eşdeğerdir. Şimdiki durumda ise -p seçeneğinin bir terime sahip olması zorunludur ve -p 0 seçeneği -p0 seçeneğine eşdeğerdir. En yüksek derecede uyumluluk adına seçeneği -p0 ve -p1 gibi kullanın.
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.
Geleneksel patch'de yedekleme öntanımlı olarak etkindir. Bu davranış şimdi sadece -b (--backup) seçeneği ile etkin kılınabilmektedir.
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.
Geleneksel patch yama başlığından yamanacak dosyanın ismini öğrenmek için karmaşık (ve iyi belgelenmemiş) bir yöntem kullanır. Bu yöntem POSIX ile uyumlu olmadığı gibi, birkaç yanlış gibi görünmeyen yanlış içerir. Şimdi patch aynı karmaşıklıkta (ama daha iyi belgelenmiş) ve isteğe bağlı olarak POSIX uyumlu olabilen bir yöntem kullanmaktadır; onun artık daha az yanlış gibi görünmeyen yanlış içerdiğini düşünüyoruz. Bağlamsal fark dosyasının başlığında ve Index: satırında dosya isimlerinden önek ayırması yapıldıktan sonra kalan dosya isimleri aynı ise bu iki yöntem birbiriyle uyumludur. Yamanız, her başlıktaki dosya isimleri eşit sayıda bölü çizgisi içeriyorsa, normal olarak uyumludur.
Geleneksel patch kullanıcıya bir soru yönelteceği zaman soruyu standart hataya gönderir ve yanıtı bir uçbirim olarak sırayla şu dosyalarda arar: standart hata, standart çıktı, /dev/tty ve standard girdi. Şimdi ise patch soruyu standart çıtıya gönderip yanıtı /dev/tty'den okur. Bazı soruların öntanımlı yanıtları değiştirilmiştir, böyle öntanımlı yanıtları olan sorularda patch artık sonsuz bir döngüye girip yanıt beklememektedir.
Geleneksel patch gerçek bir hata durumunda 1 ile dönerken, uygulanamayan yamalar olduğunda bunların sayısını belirten bir çıkış değeri ile döner. Şimdi ise patch uygulanamayan yamalar olduğunda 1 ile, gerçek bir sorun olması durumunda 2 çıkış değeri ile döner.
GNU patch, geleneksel patch ve POSIX uyumlu patch için ortak olan seçeneklerle kendinizi sınırlarsanız iyi olur. Bu seçenekler aşağıda listelenmiştir. Terimli seçeneklerde terimler zorunludur ve terim ile seçenek arasındaki boşluğun olup olmaması önemlidir.
-c
-d dizin
-D tanım
-e
-l
-n
-N
-o çıktıdosyası
-psayı
-R
-r reddosyası
- YAZILIM HATALARI
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.
- KOPYALAMA
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.
- COPYING
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.
- YAZARLAR
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ı.
- ÇEVİREN
Nilgün Belma Bugüner <nilgun (at) belgeler·gen·tr>, Ağustos 2004