Linux Patch (Yama) Komutu Kullanımı

Linux’ta yüklediğiniz bir programın yeni versiyonu çıktığında apt-get veya yum gibi bir paket yöneticisi ile güncelleme yapabiliyoruz. Ama bir programı kaynak kodundan derleyerek yüklersek yama olarak yayınlanan güncellemeyi de kaynak koduna uygulamamız gerekir. Veya birisine gönderdiğimiz bir kaynak kodun üzerindeki değişiklikleri de yama dosyası olarak gönderebiliriz, alan kişinin bu yamayı uygulaması gerekir. Linux’ta bu işleri yapabileceğimiz komut: patch.

patch komutunun nasıl kullanıldığını örneklerle açıklayayım.

1- Yama Oluşturmak

Aşağıdaki içeriğe sahip merhaba.c adında bir dosya oluşturalım:

#include <stdio.h> 

int main() {
printf("Merhaba Dünya\n");
}

Bir de şu içeriğe sahip merhaba_yeni.c dosyası oluşturalım:

#include <stdio.h>

int main(int argc, char *argv[]) {
printf("Merhaba Dünya\n");
return 0;
}

Bu iki dosyanın arasındaki farktan bir yama dosyası üretmek için şu komut kullanılabilir:

$ diff -u mYamanın uygulanmasıerhaba.c merhaba_yeni.c > merhaba.patch

Bu komut iki dosyanın arasındaki farklardan oluşan şöyle bir dosya üretir:

--- merhaba.c	2016-07-11 15:26:18.868994975 +0300
+++ merhaba_yeni.c	2016-07-11 15:26:26.597209512 +0300
@@ -1,5 +1,6 @@</li>
</ol>
-#include <stdio.h> 
+#include <stdio.h>
 
-int main() {
+int main(int argc, char *argv[]) {
 printf("Merhaba Dünya\n");
+return 0;
 }

2- Yamanın Uygulanması

patch komutu yama dosyasının adını input olarak alır ve yamayı orjinal dosyaya uygular.

$ patch < merhaba.patch 
patching file merhaba.c

Yama dosyası orjinal dosyanın adını zaten içeriyordur. Yama uygulandıktan sonra merhaba.c ve merhaba_yeni.c dosyalarının içeriğinin aynı olmasını bekliyoruz.

3- Klasör İçin Yama Oluşturmak

Tek bir dosya için değil de bir klasörün (ve içindeki başka klasörler ve dosyalar) tamamı için yama oluşturabiliriz. Bunu denemek için Open VPN programının iki versiyonunu indirip arşivleri açalım.

wget https://swupdate.openvpn.org/community/releases/openvpn-2.3.11.tar.gz
tar -xvzf openvpn-2.3.11.tar.gz

wget https://swupdate.openvpn.org/community/releases/openvpn-2.3.10.tar.gz
tar -xvzf openvpn-2.3.10.tar.gz

Şimdi iki klasör arasındaki farkı bulmak için:

$ diff -ruN openvpn-2.3.10 openvpn-2.3.11 > openvpn.patch

openvpn.patch dosyasında bütün dosyalardaki farklar listelenecektir.

4- Bir Klasöre Yama Uygulamak

Oluşturduğumuz yama dosyasını klasöre uygulamak için de şu komutu kullanabiliriz:

$ patch -s -p0 < openvpn.patch

5- Yamalanan Dosyaların Yedeğini Almak

Yamaladığınız dosyalarınn yedeğini almak isterseniz -b parametresini kullanabilirsiniz:

patch -b -p0 < openvpn.patch

Yamalanan tüm dosyaların önceki hallerinin bir kopyasını adının sonuna .orig ekleyerek kopyalayacaktır.

6- Yamalanan Dosyaları Eski Haline Çevirmek

Yamaladığınız dosyaları -R parametresini kullanarak eski haline çevirebilirsiniz:

$ patch -R < merhaba.patch