2007年11月3日 星期六

Quilt - Patches 整合 Script

在社群中開發程式往往是用 patch 來做來開發工具。
Developer 會在 mail list 上發 patch 出來,而 Maintainer 會把這些 patches 整合起
個,做好 review 再一個一個 commit 上 mainstream 之中。而當 Patch 的量很大,而又>有相依性之時…
一個 Open Source Project 的 Maintainer 要如何管理這些 Patch 呢?

[Quilt]就是這樣的一個好用的工具。

假設今天你在 maintain 一個案子,叫 ”mypro“ 放在 /work/mypro 底下而你拿到了 5 個
patches
001_ooxx.patch
002_lalal.patch
003_lele.patch
004_bad.patch
005_conflict.patch

你可以在 /work/mypro/ 下建立一個 patches 的目錄 (如果想自已指定請 export QUILT_PATCHES="....")
把 patches 放在 /work/mypro/patches 之中
再建一個檔案 /work/mypro/patches/series 把這五個patches 依序寫入 series 中,一行一個 patch, 如果有base 目錄不同的問題 (quilt default 是打 patch -p1) 可在後面加上 -p.
假設 003_lele.patch 這個 patch 是在 /work/mypro 下用 svn diff > 003_lele.patch 做出來的, 那在 series 之中就要寫成:
003_lele.patch -p0

所以 series 就會變成
---------------------
001_ooxx.patch
002_lalal.patch
003_lele.patch -p0
004_bad.patch
005_conflict.patch
---------------------

如此設好之後,就可以用 "quilt push" 打 patch ,用 "quilt pop " 退回上層…
如果要一次打完所有 patch 可以用 quilt push -a 一次打完…想退回 code base 時,就用 quilt pop -a 一路退到底。

可以用 quilt top 看你上一個打的 patch 是那個 patch ,用 quilt next 看下一個是那個 patch
如果發現 patch 有些地方需要修改,可以用quilt edit <檔案> 做修改…修改好了之後,可以用 quilt refresh 把修改寫入 "上一個打的 patch" ,也就是 quilt top 看得到的那個。

如果要寫新的 patch 可以用 quilt new ,加上 quilt edit <要修改的檔名>,做完後用 quilt refresh 把 diff 寫入 patch。

因為你打了多個 patch 之後 svn diff 就會混合了多個 patch ,如果只想看上個打的 patch 的影響可用 quilt diff 來看。

一般來說,如果你要手動修改你的 series 檔。可先 quilt pop -a 退回 code base 再做修改…如手動 mark 掉一些patch 或加上註解,註解是由 '#' 做為開頭。

如果code base 改變了…可 quilt pop -a 退回開頭,再 svn update (cvs ),再把一些已被 commit 的 patch remove 掉(這個要檢查一下,一般來說有 commit 都會說明 commit 了那些 patch ),再一個一個 push 回來

而如果你想 commit code 時,也可一面 push 一面 commit 。等 commit 完了,再把 series 裏已 push 且 commit 的 patch mark 掉,然後直接砍掉 /work/mypro/.pc 這個目錄…這是 quilt 管理 diff 的目錄…如此就可以直接可 upstream 同步。 (如果你是 maintainer )

當你要 release patch 到 mail list 前,可以把你的 code base 的版號(最好是 HEAD),和你之前相依的 patch (如果有的話),一起 release 出來。如果 release 的 patch 多於兩個。最好也把 series release 出來。

--
Reference:
How To Survive With Many Patches or Introduction to Quilt