PATCH(1) Kullanıcı Komutları  PATCH(1)

İSİM

patch — yama dosyasını uygular

KULLANIM


patch [seçenekler] [özgün [yama]]

Genellikle şöyle kullanılır:

patch -psayı < yama

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 özgün dosyaya uygulayarak özgün dosyaların yamalı sürümlerini üretir. Normalde yamalı sürümler özgün 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 özgün 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 boru ile ed(1) metin düzenleyicisine 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.)

Sonek bağlamından daha az önek içeriğine sahip olan yama parçaları (belirsizlik uygulandıktan sonra), ilk satır numarası 1 ise dosyanın başlangıcına uygulanmalıdır. Önek bağlamından daha az sonek içeriğine sahip olan yama parçaları ise (belirsizlik uygulandıktan sonra) dosyanın sonuna uygulanmalıdır.

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.)

Reddedilen parça, birleşik veya bağlam farkı biçeminde çıkar. Girdi normal bir farksa, bağlamların çoğu basitçe boştur. 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 özgün 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 en iyi isim seçilir.

  • Eğer patch RCS, ClearCase, Perforce ve SCCS'yi yoksaymıyorsa (-g sayı veya --get=sayı seçeneklerine bakınız) ve belirtilen dosya mevcut değilse ama bir RCS, ClearCase, Perforce veya SCCS ana dosyası varsa patch belirtilen ilk dosyayı RCS, ClearCase, Perforce veya SCCS ana dosyası ile seçer.

  • Belirtilen dosya mevcut değilse, bir RCS, ClearCase, Perforce 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 bir dosya ismi seçilememişse, yamanacak dosyanın ismi size sorulur ve patch dosya ismini buna göre seçer.

Belirtilen dosyalar listesinden "en iyi" 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, bunlardan 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 numarasıdır) alır ve özgün 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 dosya yama dosyasıyla yamanır.

Eğer yama dosyası bir yamadan fazlasını içeriyorsa patch onların her birini 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

Uzun seçenekler için zorunlu olan girdiler kısa seçenekler için de zorunludur.

-b, --backup

Dosyaların yedeğini oluşturur. Bir dosya yamanırken özgün 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, --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 ikil 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, --directory=dizin

Hiçbir şey yapmadan, hemen dizine geçilir.

-D , --ifdef=tanım

Değişiklikleri işaretlemede #ifdef ... #endif yapısı tanım farklılaştırma simgesi 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 , --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 , --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 öntanımlı değer sıfırdır.

--help

Seçeneklerin bir özetini basar ve çıkar.

-i, --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.

--merge, -merge=merge, -merge=diff3

< Yama dosyasını özgün dosyaya diff3(1) veya merge(1) gibi uygular. Bir çelişki bulunursa patch bir uyarı çıktılar ve çelişkiyi <<<<<<< ve >>>>>>> satırları arasına yerleştirir. Bir çelişki genelde şuna benzer:

<<<<<<<
özgün dosyadaki satırlar
|||||||
yamadaki özgün satırlar
=======
yamadaki yeni satırlar
>>>>>>>

--merge seçeneğinin seçimlik girdisi çelişkinin çıktılanma biçemini değiştirir: diff3 biçeminde ||||||| bölümünden sonra yamadaki özgün satırlar gösterilir; merge biçeminde, bu bölüm olmaz. merge biçemi öntanımlıdır.

Bu seçenek --forward seçeneğini de uygularken --fuzz=sayı seçeneğini yok sayar.

-n, --normal

Yama dosyası, normal 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, --output=çıktıdosyası

Dosyaların yerinde yamanması yerine çıktı, çıktıdosyası dosyasına gönderilir.

-p, --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,

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.

--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, --reject-file=reddosyası

Reddedilenler öntanımlı .rej dosyası yerine reddosyasına konulur. reddosyası olarak - belirtilmişse reddedilenler yok sayılır.

-R, --reverse

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.)

--read-only=davranış

Salt-okunur bir dosyada değişiklik yapılırken belirtilen davranışa uyulur: ignore ise olası sorunlar yok sayılır, warn ise bu konuda uyarır, fail ise işlem başarısız olur.

reject-format=biçem

Reddedilenler dosyaları belirtilen biçemde üretir (context veya unified). Bu seçenek olmaksızın yama unified (birleşik) ise reddedilen parçalar da unified diff biçeminde olur. Aksi takdirde, context (bağlamsal) diff biçeminde olur.

-s, --silent, --quiet

Bir hata oluşmadıkça bilgilendirici hiçbir şey çıktılanmaz.

--follow-symlinks

Girdi dosyalarını aranırken sembolik bağlar izlenir. Sembolik bağların işaret ettiği dosyaları değiştirmek yerine sembolik bağları değiştirir. Sembolik bağlara Git tarzı yamalar artık uygulanmamaktadır. Bu seçenek, yamanın önceki sürümleriyle geriye dönük uyumluluk için mevcuttur; kullanımı önerilmez.

-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ünü ve yama seviyesini basar ve çıkar.

-V, --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, --debug=sayı

Sadece patch yamacılarını ilgilendiren hata ayıklama seçeneklerini belirtmek için kullanılır.

-Y, --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, --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 özgün 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, Perforce 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

diff(1), ed(1).

Marshall T. Rose ve Einar A. Stefferud, Proposed Standard for Message Encapsulation, Internet RFC 934 <URL: http://ftp.isi.edu/innotes/rfc934.txt> (1985-01).

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 eğik çizgi ç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çeminde 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 özgün 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, böyle bir çıktıya sahip yamayı 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üz bilmem kaç 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-patch (at) gnu.org> adresine bildiriniz.

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.

Bir yama parçasının nasıl birleştirileceğini hesaplamak, standart bulanık algoritmayı kullanmaktan çok daha zordur. Daha büyük parçalar, daha fazla bağlam, özgün konumdan daha büyük bir sapma ve daha kötü bir eşleşme, algoritmayı yavaşlatır.

TELİF HAKKI ve LİSANS

Telif Hakkı © 1984, 1985, 1986, 1988 Larry Wall.
Telif hakkı © 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2009 Free Software Foundation, Inc. Lisans GPLv3+: GNU GPL sürüm 3 veya üstü <http://gnu.org/licenses/gpl.html>. Bu bir özgür yazılımdır: yazılımı değiştirmek ve dağıtmakta özgürsünüz. Yasaların izin verdiği ölçüde HİÇBİR GARANTİ YOKTUR.

YAZARLAR

patch'in özgün 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ı. Andreas Grünbacher birleştirme desteğini sağladı.

ÇEVİREN

© 2022 Nilgün Belma Bugüner
Bu çeviri özgür yazılımdır: Yasaların izin verdiği ölçüde HİÇBİR GARANTİ YOKTUR.
Lütfen, çeviri ile ilgili bildirimde bulunmak veya çeviri yapmak için https://github.com/TLBP/manpages-tr/issues adresinde "New Issue" düğmesine tıklayıp yeni bir konu açınız ve isteğinizi belirtiniz.