2010年1月17日 星期日

用git協助維護debian packaging (以desmume為例)

desmume 的開發社群位於 SourceForge 上,使用的是 subversion。因為 subversion 太慢,而且不是分散式的,所以改為透過 git-svn 來管理。既是使用 git,debian packaging 的維護當然就要靠 git-buildpackage 來幫忙。
以下從無到有,紀錄如何使用 git 來維護 debian package





首先自然是要先把 desmume 的源碼 checkout。因為是以trunk為例,為求簡單故只 checkout trunk
git svn clone https://desmume.svn.sourceforge.net/svnroot/desmume/trunk/desmume
subversion 相當慢,要有耐心一點。
git-buildpackage 需要兩個 branch,一個是原始的上游源碼,另一個是為了打包而做必要修改,同時加入 debian/ 目錄結構。預設值是 upstream 和 master,這個可以使用 gbp.conf 來修改。
為了符合預設值,要把現在的 master branch 改名為 upstream,然後再 fork 一份成為新的 master branch
git branch -m master upstream
git branch master
切到打包用的 branch
git checkout master
再來要產生 debian/ 目錄結構。幸運的是,desmume 在 debian 和 ubuntu 的官方套件庫裡都有,只是有些地方不太合用,我們可以拿來修改一下
cd /tmp
apt-get source desmume
cd desmume_0.9.4
cp -r debian /path/to/our/git/repo
修改的方式可以參考Debian新維護人員手冊
我本身是修改了 control (變更套件名稱及相依套件)、changelog (變更套件名稱及版本編號方式)、rules (修改編譯及打包的方式,主要是compiler flags)、copyright (加上自已的版權宣告)這四個檔案,並加入了 gbp.conf (控制 git-buildpackage 相關工具的設定)
修改好之後,可以先 commit 起來方便測試,若有錯誤則在修正之後用 --amend 的方式補上。
經過測試之後,可以release了,正式打包吧
git buildpackage --git-tag --git-ignore-new
在 git-buildpackage 中會呼叫 dpkg-buildpackage,可以加上相關的參數來控制。例如 launch.net 的 ppa repos 只接受 source package,應該要傳遞一個 -S 的參數給 dpkg-buildpackage
git buildpackage --git-tag --git-ignore-new -S
初次打包完成後,未來的維護就相當簡單
首先切回 upstream branch
git checkout upstream
從 subversion 抓回最新的源碼
git svn fetch
套用在 upstream branch 上
git svn rebase
切換回打包用的 branch
git checkout master
把新的源碼 merge 進來
git merge upstream
視情況作必要的修改之後,產生新的 changelog 項目
git dch --git-author -R -a
視情況修改 changelog 之後,重新用 git-buildpackage 打包就好了