Patching Tanpa Sistem Patch

Seperti telah disebutkan diatas, seseorang dapat mem-patch source original dengan hanya membuat perubahaan dalam direktori source yang telah dibongkar. Contoh nyata dari hal ini adalah cron. Jika Anda mengambil paket source cron lalu melihat isi .diff.gz maka Anda akan melihat bahwa beberapa berkas paket source original telah diubah.

apt-get source cron
zgrep +++ cron*.diff.gz

Tapi seperti telah kita singgung sebelumnya bahwa cara ini bukan cara terbaik untuk menunjukkan patch. Salah satu cara yang lebih baik adalah dengan membuat berkas patch secara individu, tapi menaruhnya di debian/patches/ dan menerapkan patch (menggunakan patch) di debian/rules. Cara inilah yang digunakan untuk udev:

apt-get source udev
zgrep +++ udev*.diff.gz
ls udev*/debian/patches/
less udev*/debian/rules

Berkas rules memiliki peraturan berikut untuk menerima dan tidak menerima patch:

# Apply patches to the package
patch: patch-stamp
patch-stamp:
        dh_testdir
        @patches=debian/patches/*.patch; for patch in $$patches; do \
                test -f $$patch || continue; \
                echo "Applying $$patch"; \
                patch -stuN -p1 < $$patch || exit 1; \
        done
        touch $@

# Remove patches from the package
unpatch:
        dh_testdir
        @if test -f patch-stamp; then \
                patches=debian/patches/*.patch; \
                for patch in $$patches; do \
                        reversepatches="$$patch $$reversepatches"; \
                done; \
                for patch in $$reversepatches; do \
                        test -f $$patch || continue; \
                        echo "Reversing $$patch"; \
                        patch -suRf -p1 < $$patch || exit 1; \
                done; \
                rm -f patch-stamp; \
        fi

Semua ini terlihat sangat baik, tapi bagaimana cara kita membuat patch baru untuk udev dengan menggunakan skema ini? Pendekatan yang umum adalah dengan:

  1. salin isi source yang ada ke direktori sementara

  2. terapkan seluruh patch ke berkas yang ingin Anda sunting; Jika Anda ingin membuat patch baru, terapkan seluruh patch yang telah ada. (hal ini penting karena patch yang ada tergantung dari patch sebelumnya)

    Jika Anda ingin, dapat pula menggunakan debian/rules untuk ini: caranya hapus patch yang datang *setelah* patch yang ingin Anda sunting, lalu jalankan 'debian/rules patch'. Nama sebenarnya untuk target patch bervariasi, Saya pribadi sejauh ini telah melihat beberapa nama yang digunakan: patch setup apply-patches unpack patch-stamp. Anda perlu melihat di dalam debian/rules untuk mengetahui nama yang digunakan untuk target patch.

  3. salin lagi seluruh isi source:

    cp -a /tmp/old /tmp/new
  4. masuk ke /tmp/new, dan lakukan modifikasi

  5. kembali ke direktori source original Anda, lalu generate patch dengan:

    diff -Nurp /tmp/old /tmp/new > mypatchname.patch

Contoh 1.

Mari kita membuat patch baru untuk udev dengan nama 90_penguins.patch yang isinya mengganti kata Linux dengan Penguin dalam berkas README udev:

cd udev*/
cp -a . /tmp/old
pushd /tmp/old
debian/rules patch
cp -a . /tmp/new; cd ../new
sed -i 's/Linux/Penguin/g' README
cd ..
diff -Nurp old new > 90_penguins.patch
popd
mv /tmp/90_penguins.patch debian/patches
rm -rf /tmp/old /tmp/new

Contoh 2.

Apa yang terjadi jika kita ingin menyunting patch yang telah ada? Kita dapat menggunakan prosedur yang sama dengan Contoh 1 tetapi kita harus menerapkan patch untuk disunting terlebih dahulu:

cp -a . /tmp/old
pushd /tmp/old
cp -a . /tmp/new; cd ../new
patch -p1 < debian/patches/10-selinux-include-udev-h.patch
sed -i '1 s/$/***** HELLO WORLD ****/' udev_selinux.c
cd ..
diff -Nurp old new > 10-selinux-include-udev-h.patch
popd
mv /tmp/10-selinux-include-udev-h.patch debian/patches
rm -rf /tmp/old /tmp/new

Sementara cara ini secara teknis baik, namun dapat berubah menjadi rumit dan tidak terkendali. Untuk membuat proses patch lebih mudah dan tidak berbelit maka sistem patch dikembangkan. Kita akan melihat beberapa contoh populernya.