[Gelistirici] [PATCH] --use-quilt

S.Çağlar Onur caglar at pardus.org.tr
6 Nis 2007 Cum 20:46:49 EEST


Selamlar;

Büyük kısmımız bir paketin yama yönetim akışında bugüne kadar aşağı yukarı şu 
işlemleri yapıyordu;

pisi build --unpack pspec.xml -d
cp /var/pisi/X/work/X /var/pisi/X/work/X.orig
cd /var/pisi/X/work/X 
...yama ekle/yama değiştir v.s v.s v.s...
diff -Nur X.orig X
...yamayı al paketin files/ klasörüne koy, pspec.xml içine yaz...
pisi build pspec.xml -d

Veya bir pakete yapılan n tane yamanın bir tanesini devre dışı bırakmak/veya 
yeni sürümle sync etmek için
...pspec.xml içinden sil/comment out et...
pisi build --unpack pspec.xml -d
cp /var/pisi/X/work/X /var/pisi/X/work/X.orig
cd /var/pisi/X/work/X 
...yama ekle/yama değiştir/yama sync et/ v.s v.s v.s...
diff -Nur X.orig X
...yamayı al paketin files/ klasörüne koy, pspec.xml içine yaz...
pisi build pspec.xml -d

Gibi yorucu, uzun (özellikle cp ve rediff kısmı) bir sürü işlem yapmak zorunda 
kalıyordu. Özellikle birbirini etkileyen yamalarda bu işleri el ile yapmak 
neredeyse imkansız hale geliyordu.

Taki bir süredir depoda kendi ve GUI'si olan quilt [1] isimli araç ile 
tanışana kadar. quilt Andrew Morton'un zamanında 1000 sayılarına ulaşan 
kernel yamalarını maintain edebilmek için yazmaya başladığı daha sonrada 
maintainer'lığını başka birinin aldığı bir proje. Halen aktif olarak birçok 
projede de kullanılıyor (örn yoğun olarak çekirdek için)

Kabaca bir versiyon kontrol yönetim sistemi kullanmadan yamaları 
push/pop/refresh/import/export/fork gibi temel işlemlerle kod ağacına 
uygulamaya/geri almaya/yenilemeye yarıyor (bir seri shell scripti aslında), 
birbirinin etkileyen yamalarda işlemleri bu yamalar tek yamaymış gibi 
yapabiliyor v.s. v.s (hallice faydalı bir araç). Temel kullanımı için kısa ve 
öz olarak şuraya göz atabilirsiniz [2]

İşin girizgah bölümünden sonra ekteki yama build işlemi için kullanılan 
pisi/util.py do_patch fonksiyonuna GNU Patch yerine quilt de kullanma desteği 
ekliyor [Aynı yamanın pisi-catbox ve pisi-1.1 branchları için olanları da 
mevcut :P, 1.1 için olanı ayrı bir e-posta'da atıp başka bir konu daha 
acacağım]. 

Gelelim --use-quilt bize ne kazandırıyor bölümüne, örnek bir akış ile 
anlatmaya çalışayım;

[caglar at zangetsu][~/svk/devel/system/base/jpeg]> sudo pisi build 
pspec.xml --unpack --use-quilt -d
DEBUG: PiSi API initialized
Paketler çalışma dizinine yazılıyor.
Last state was unpack
Arşiv açılıyor... açıldı (/var/pisi/jpeg-6b-5/work)
* Yama uygulanıyor: 05_all_jpeg-Makefile.patch
DEBUG: "quilt import -p 1 -n 
05_all_jpeg-Makefile.patch /home/caglar/svk/devel/system/base/jpeg/files/05_all_jpeg-Makefile.patch" 
için dönüş değeri 0
DEBUG: "quilt push" için dönüş değeri 0
* Yama uygulanıyor: 06_all_jpeg-libtool.patch
DEBUG: "quilt import -p 1 -n 
06_all_jpeg-libtool.patch /home/caglar/svk/devel/system/base/jpeg/files/06_all_jpeg-libtool.patch" 
için dönüş değeri 0
DEBUG: "quilt push" için dönüş değeri 0
* Yama uygulanıyor: 07_all_jpeg-LANG.patch
DEBUG: "quilt import -p 1 -n 
07_all_jpeg-LANG.patch /home/caglar/svk/devel/system/base/jpeg/files/07_all_jpeg-LANG.patch" 
için dönüş değeri 0
DEBUG: "quilt push" için dönüş değeri 0
* Yama uygulanıyor: 30_all_jpeg-crop.patch
DEBUG: "quilt import -p 1 -n 
30_all_jpeg-crop.patch /home/caglar/svk/devel/system/base/jpeg/files/30_all_jpeg-crop.patch" 
için dönüş değeri 0
DEBUG: "quilt push" için dönüş değeri 0
* Yama uygulanıyor: 50_all_jpeg-Debian-rdjpgcom_locale.patch
DEBUG: "quilt import -p 1 -n 
50_all_jpeg-Debian-rdjpgcom_locale.patch /home/caglar/svk/devel/system/base/jpeg/files/50_all_jpeg-Debian-rdjpgcom_locale.patch" 
için dönüş değeri 0
DEBUG: "quilt push" için dönüş değeri 0
* Yama uygulanıyor: 51_all_jpeg-Debian-jpeglib.h_c++.patch
DEBUG: "quilt import -p 1 -n 
51_all_jpeg-Debian-jpeglib.h_c++.patch /home/caglar/svk/devel/system/base/jpeg/files/51_all_jpeg-Debian-jpeglib.h_c++.patch" 
için dönüş değeri 0
DEBUG: "quilt push" için dönüş değeri 0
* Yama uygulanıyor: 52_all_jpeg-Debian-rdppm.patch
DEBUG: "quilt import -p 1 -n 
52_all_jpeg-Debian-rdppm.patch /home/caglar/svk/devel/system/base/jpeg/files/52_all_jpeg-Debian-rdppm.patch" 
için dönüş değeri 0
DEBUG: "quilt push" için dönüş değeri 0
DEBUG: PiSi API finalized

Buraya kadar bir fark yok, kodu yamalamak için sadece quilt kullandık patch 
yerine.

zangetsu jpeg-6b # quilt series
05_all_jpeg-Makefile.patch
06_all_jpeg-libtool.patch
07_all_jpeg-LANG.patch
30_all_jpeg-crop.patch
50_all_jpeg-Debian-rdjpgcom_locale.patch
51_all_jpeg-Debian-jpeglib.h_c++.patch
52_all_jpeg-Debian-rdppm.patch

Diyelim 52_all_jpeg-Debian-rdppm.patch isimli yama arkasında HUNK bırakıyordu

zangetsu jpeg-6b # quilt refresh
Refreshed patch 52_all_jpeg-Debian-rdppm.patch

artık bırakmıyor.

52_all_jpeg-Debian-rdppm.patch isimli yamayı geri alalım;
zangetsu jpeg-6b # quilt pop
Removing 52_all_jpeg-Debian-rdppm.patch
Restoring rdppm.c

Now at patch 51_all_jpeg-Debian-jpeglib.h_c++.patch

Hangi yama kimi etkliyor görmek isteyelim;
zangetsu jpeg-6b # quilt graph --all
digraph dependencies {
        n0 [label="05_all_jpeg-Makefile.patch"];
        n1 [label="06_all_jpeg-libtool.patch"];
        n2 [label="07_all_jpeg-LANG.patch"];
        n0 -> n1 [len="1.39"];
        n1 -> n2 [len="1.39"];
}

Koda bir seri değişiklik yapmak isteyelim;

zangetsu jpeg-6b # quilt new pardus.patch
Patch pardus.patch is now on top

zangetsu jpeg-6b # quilt edit jcsample.c
File jcsample.c added to patch pardus.patch

zangetsu jpeg-6b # quilt diff -z
Index: jpeg-6b/jcsample.c
===================================================================
--- jpeg-6b.orig/jcsample.c     1996-01-07 01:25:54.000000000 +0200
+++ jpeg-6b/jcsample.c  2007-04-06 20:36:32.613583302 +0300
@@ -1,5 +1,6 @@
 /*
  * jcsample.c
+ * Pardus Rocks!
  *
  * Copyright (C) 1991-1996, Thomas G. Lane.
  * This file is part of the Independent JPEG Group's software.

zangetsu jpeg-6b # quilt refresh
Refreshed patch pardus.patch

Sonra bunu beğenmeyip geri alalım
zangetsu jpeg-6b # quilt pop
Removing pardus.patch
Restoring jcsample.c

Now at patch 52_all_jpeg-Debian-rdppm.patch

Ve bunların hepsini ve daha fazlasını kodun bir kopyası v.s olmadan yapalım :)


P.S: util/uncompress bir hata içeriyor, uncompress ettiği şeyin adını 
değiştimiyor! Mesela pciutils paketi içinde files/updated-pciids.patch.bz2
/var/pisi/ altına aynı isimle fakat unpack edilmiş olarak konuyor. 

Index: pisi/util.py
===================================================================
--- pisi/util.py        (revision 13315)
+++ pisi/util.py        (working copy)
@@ -468,6 +468,7 @@
                                 os.path.basename(patchFile))
     else:
         filePath = os.path.basename(patchFile)
+    filePath = filePath.split(".")[0]

     if compressType == "gz":
         from gzip import GzipFile

gibi birşey gerekiyor. Yama bu kısmı bu sebeple içeriyor :)

Faik?

[1] http://savannah.nongnu.org/projects/quilt
[2] www.suse.de/~agruen/quilt.pdf 

Saygılar
-- 
S.Çağlar Onur <caglar at pardus.org.tr>
http://cekirdek.pardus.org.tr/~caglar/

Linux is like living in a teepee. No Windows, no Gates and an Apache in house!
-------------- sonraki bölüm --------------
A non-text attachment was scrubbed...
Name: quilt.patch
Type: text/x-diff
Size: 2616 bytes
Desc: kullanılamıyor
URL: <http://liste.pardus.org.tr/gelistirici/attachments/20070406/38c12d94/attachment.patch>
-------------- sonraki bölüm --------------
A non-text attachment was scrubbed...
Name: kullanılamıyor
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part.
URL: <http://liste.pardus.org.tr/gelistirici/attachments/20070406/38c12d94/attachment-0002.pgp>


Gelistirici mesaj listesiyle ilgili daha fazla bilgi