Pendahuluan

Tujuan pembuatan patch[1] adalah untuk memperbaiki masalah yang ada pada software, misalnya bugs, celah ataupun untuk memperbaiki performa software. Salah satu cara membuat patch adalah dengan menggunakan diff[2]. Pada tutorial singkat kali ini, akan dibahas cara membuat patch menggunakan diff serta cara mengaplikasikan patch yang sudah dibuat.

Langkah-langkah:

  • Sebagai contoh kali ini, kita akan membuat patch untuk aplikasi tilda[3] untuk mengubah titlenya dari "Tilda" menjadi "shell". Pertama-tama, ekstrak source code tilda ke dalam dua direktori:


$ tar -xzf tilda-0.9.6.tar.gz
$ mv tilda-0.9.6 tilda-0.9.6-orig
$ tar -xzf tilda-0.9.6.tar.gz


  • Dari langkah di atas, terdapat 2 direktori yaitu "tilda-0.9.6-orig" dan "tilda-0.9.6". Kita akan mengubah file yang ada pada direktori "tilda-0.9.6" lalu membandingkan dengan yang original. Sekarang, kita mencari title yang akan diganti pada sub direktori "tilda-0.9.6/src" menggunakan perintah "grep"


$ grep Tilda tilda-0.9.6/src/*.c
tilda-0.9.6/src/configsys.c:    CFG_STR("title", "Tilda", CFGF_NONE),
tilda-0.9.6/src/key_converter.c: * This is an extremely simple converter for the Tilda-0.9.4 and less
tilda-0.9.6/src/key_converter.c: * key format to the new Tilda-0.9.5 key format, which is the standard
tilda-0.9.6/src/tilda.c:        { "hidden",             'h', 0, G_OPTION_ARG_NONE,      &hidden,            _("Start Tilda hidden"), NULL },
tilda-0.9.6/src/tilda_window.c:    label = gtk_label_new ("Tilda");
tilda-0.9.6/src/wizard.c:    window_title = g_strdup_printf ("Tilda %d Config", ltw->instance);


  • Yang akan kita ubah adalah pada file "configsys.c" dan "tilda_window.c". kita cukup menggunakan perintah "sed" untuk mengubahnya.


$ sed -i 's/Tilda/shell/' tilda-0.9.6/src/configsys.c
$ sed -i 's/Tilda/shell/' tilda-0.9.6/src/tilda_window.c


  • Langkah berikutnya adalah yang utama yaitu membuat patch menggunakan diff. Kita akan menggunakan opsi "-u" untuk membuat unified diff[4]. Opsi ini umum digunakan untuk membuat patch pada proyek-proyek open source. Caranya adalah seperti ini:


$ diff -ru tilda-0.9.6-orig tilda-0.9.6 > tilda_title.diff


  • Opsi "-r" kita gunakan untuk melakukan proses diff secara rekursif ke dalam subdirektori. Adapun outputnya nanti akan ditulis ke file "tilda_title.diff". Hasilnya seperti ini:


$ cat tilda_title.diff
diff -ru tilda-0.9.6-orig/src/configsys.c tilda-0.9.6/src/configsys.c
--- tilda-0.9.6-orig/src/configsys.c    2007-12-11 23:02:40.000000000 +0700
+++ tilda-0.9.6/src/configsys.c    2012-01-15 15:01:09.000000076 +0700
@@ -25,7 +25,7 @@
     CFG_STR("command", "", CFGF_NONE),
     CFG_STR("font", "Monospace 13", CFGF_NONE),
     CFG_STR("key", NULL, CFGF_NONE),
-    CFG_STR("title", "Tilda", CFGF_NONE),
+    CFG_STR("title", "shell", CFGF_NONE),
     CFG_STR("background_color", "white", CFGF_NONE),
     CFG_STR("working_dir", NULL, CFGF_NONE),
     CFG_STR("web_browser", "firefox", CFGF_NONE),
diff -ru tilda-0.9.6-orig/src/tilda_window.c tilda-0.9.6/src/tilda_window.c
--- tilda-0.9.6-orig/src/tilda_window.c    2008-01-18 05:07:39.000000000 +0700
+++ tilda-0.9.6/src/tilda_window.c    2012-01-15 15:01:20.903000078 +0700
@@ -482,7 +482,7 @@
     }

     /* Create page and append to notebook */
-    label = gtk_label_new ("Tilda");
+    label = gtk_label_new ("shell");
     /* Strangely enough, prepend puts pages on the end */
     index = gtk_notebook_prepend_page (GTK_NOTEBOOK(tw->notebook), tt->hbox, label);
     gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK(tw->notebook), tt->hbox, TRUE, TRUE, GTK_PACK_END);
$


  • Nah, untuk contoh penggunaannya, terlebih dahulu hapus ke-2 direktori tilda tadi, kemudian ekstrak ulang source tilda yang asli:


$ rm -rf tilda-0.9.6 tilda-0.9.6-orig/
$ tar -xzf tilda-0.9.6.tar.gz


  • Gunakan perintah "patch" dengan menggunakan input file "tilda_title.diff". Untuk mengetahui apa saja yang dilakukan oleh perintah "patch", kita bisa menggunakan opsi "--verbose". Opsi "-p0" diberikan untuk menentukan di direktori mana kita menjalankan patch (silakan lihat man page patch). Nah, caranya adalah sebagai berikut:


$ patch --verbose -p0 < tilda_title.diff
Hmm...  Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|diff -ru tilda-0.9.6-orig/src/configsys.c tilda-0.9.6/src/configsys.c
|--- tilda-0.9.6-orig/src/configsys.c    2007-12-11 23:02:40.000000000 +0700
|+++ tilda-0.9.6/src/configsys.c    2012-01-15 15:01:09.000000076 +0700
--------------------------
Patching file tilda-0.9.6/src/configsys.c using Plan A...
Hunk #1 succeeded at 25.
Hmm...  The next patch looks like a unified diff to me...
The text leading up to this was:
--------------------------
|diff -ru tilda-0.9.6-orig/src/tilda_window.c tilda-0.9.6/src/tilda_window.c
|--- tilda-0.9.6-orig/src/tilda_window.c    2008-01-18 05:07:39.000000000 +0700
|+++ tilda-0.9.6/src/tilda_window.c    2012-01-15 15:01:20.903000078 +0700
--------------------------
Patching file tilda-0.9.6/src/tilda_window.c using Plan A...
Hunk #1 succeeded at 482.
done
$


Setelah proses patch berhasil dilakukan, kita tinggal melakukan kompilasi seperti biasa. Selain itu, file "tilda_title.diff" tadi bisa disebarkan agar orang lain bisa melakukan patch juga. Nah, sekian dulu tutorial singkat kali ini, semoga bermanfaat.


Referensi:

[1] http://en.wikipedia.org/wiki/Patch_(computing)
[2] http://en.wikipedia.org/wiki/Diff
[3] http://tilda.sourceforge.net/tildadoc.php
[4] http://en.wikipedia.org/wiki/Diff#Unified_format