章 8. 更新套件

內容目錄

8.1. 新的 Debian 版本
8.2. 檢査新上游版本
8.3. 新上游版本
8.4. 更新打包風格
8.5. UTF-8 轉換
8.6. 對更新套件的幾點提示

一旦你發佈了一個軟件包,在之後的某個時間裏就需要對它進行更新。

假設你收到一個針對你的軟件包報告的 Bug ,其編號爲 #654321,它描述了一個你可以解決的問題。要創建軟件包的一個新 Debian 修訂版本,你需要:

有一種棘手的情況,當你在上傳正常版本到官方倉庫中之前,你制作了一個本地包以進行打包實驗,例如, 1.0.1-1。 爲了平滑升級,創建一個 changelog 條目,其中包含類似1.0.1-1~rc1 這樣的版本字符串不失爲一劑良方。 你可以通過合併這樣的本地修改條目到官方包的單個條目中來整理 changelog。 參見 節 2.6, “套件名稱和版本” 來瞭解版本字符串的順序。

在爲 Debian 倉庫準備新上游版本的軟件包前,你必須首先檢查新的上游更新。

檢查工作應從閱讀上游 changelogNEWS 以及所有隨新版本一同發佈的文檔。

然後應按照以下步驟檢查新舊版本之間源碼的差別,小心任何可疑的內容:

$ diff -urN foo-oldversion foo-newversion

對於 Autotools 自動生成的文件發生的改動,例如 missingaclocal.m4config.guessconfig.h.inconfig.subconfiguredepcompinstall-shltmain.shMakefile.in 是可以忽略的。你可以在運行 diff 進行代碼檢查前刪除它們。

如果軟件包 foo 是使用新的 3.0 (native)3.0 (quilt) 格式打包的,製作新的上游版本時需要先把舊的 debian 目錄移至新的源代碼內。這可以通過在新解壓的源代碼目錄裏運行 tar xvzf /path/to/foo_oldversion.debian.tar.gz 完成。[80]當然,你需要做幾個很顯然的雜事:

  • 創建一份上游原始碼的副本,命名爲 foo_newversion.orig.tar.gz

  • 使用 dch -v newversion-1 更新 Debian changelog 檔案。

    • 添加一個條目,內容爲 New upstream release

    • 簡明地介紹 在新上游版本中 上游修復和關閉的 Bug (添加 Closes: #bug_number) 。

    • 簡明地介紹維護者對 本個新上游版本 做出的修改,修復和關閉的 Bug (添加 Closes: #bug_number)。

  • 運行 while dquilt push; do dquilt refresh; done 以應用全部補丁並使它們 邊界清晰

如果補丁沒有乾淨地被應用,檢査原因(線索在 .rej 檔案裏)。

  • 如果你的補丁已經被上游接受,

    • 使用 dquilt delete 刪除它。

  • 如果你的補丁與上遊程式碼中的變更有衝突:

    • 使用 dquilt push -f 應用舊補丁,未應用的部分會被保存爲 baz.rej

    • 手工編輯 baz 文件來在新的代碼中實現 baz.rej 中應有的效果。

    • 使用 dquilt refresh 更新補丁。

  • 正常繼續,執行 while dquilt push; do dquilt refresh; done

這個過程可以通過使用 uupdate(1) 來更自動化地完成:

$ apt-get source foo
...
dpkg-source: info: extracting foo in foo-oldversion
dpkg-source: info: unpacking foo_oldversion.orig.tar.gz
dpkg-source: info: applying foo_oldversion-1.debian.tar.gz
$ ls -F
foo-oldversion/
foo_oldversion-1.debian.tar.gz
foo_oldversion-1.dsc
foo_oldversion.orig.tar.gz
$ wget http://example.org/foo/foo-newversion.tar.gz
$ cd foo-oldversion
$ uupdate -v newversion ../foo-newversion.tar.gz
$ cd ../foo-newversion
$ while dquilt push; do dquilt refresh; done
$ dch
... document changes made

如果你按照 節 5.22, “watch 的敘述設置了 debian/watch 檔案,你可以跳過這個 wget 命令,轉而在 foo-oldversion 目錄中運行 uscan(1),且無需再執行 uupdate 命令。它會 自動 査找新的原始碼、下載並運行 uupdate 命令。[81]

重複 節 6.1, “完整的(重)構建”章 7, 檢査套件中的錯誤章 9, 上傳套件 中的操作,即可發佈此更新的套件。

更新打包風格不是更新軟件包的必須步驟,但是這樣可以使你的軟件包得到對現代的 debhelper 系統和 3.0 源代碼包格式完整的兼容性。[82]

  • 如果你需要重新添加已刪除的模板文件,可以在同一個 debian 軟件包源代碼樹中運行 dh_make,並添加 --addmissing 選項。然後對模板進行相應的編輯。

  • 如果軟件包的 debian/rules 文件沒有更新爲使用 debhelper v7+ 的 dh 語法,則更新它使用 dh。在需要的時候更新 debian/control 文件。

  • 如果你希望將使用 cdbsMakefile 包含機制創建的 rules 文件更新爲 dh 語法,參看下文並理解各 DEB_* 配置變量。

  • 如果你有一個不帶有 foo.diff.gz 文件的 1.0 格式的源代碼包,你可以通過創建 debian/source/format 文件並在其中添加 3.0 (native) 來將其更新爲新的 3.0 (native) 源代碼包格式。debian 目錄中的其他文件可以直接複製過來。

  • 如果你有一個帶有 foo.diff.gz 文件的 1.0 格式的源代碼包,你可以通過創建 debian/source/format 文件並在其中添加 3.0 (quilt) 來將其更新爲新的 3.0 (quilt) 源代碼包格式。debian 目錄中的其他文件可以直接複製過來。如果需要,把 filterdiff -z -x '*/debian/*' foo.diff.gz > big.diff 生成的 big.diff 文件導入到 quilt 系統。[83]

  • 如果它使用了其他的補丁系統,例如 dpatchdbscdbs,使用 -p0-p1-p2 級別,使用 http://bugs.debian.org/581186deb3 命令將其轉換到 quilt 系統。

  • 如果它使用 dh 命令的 --with quilt 選項,或 dh_quilt_patchdh_quilt_unpatch 命令,刪除它們並使其使用新的 3.0 (native) 源代碼包格式。

你應當查看 DEP - Debian Enhancement Proposals 並採納 ACCEPTED 建議。

當然你還需要按照 節 8.3, “新上游版本” 完成其他的步驟。

如果上游文檔採用了老式編碼,那麼將其轉換爲 UTF-8 不失爲一良方。

  • iconv(1) 來轉換普通文本文件的編碼。

    iconv -f latin1 -t utf8 foo_in.txt > foo_out.txt
    
  • 使用 w3m(1) 來把 HTML 文件轉換爲 UTF-8 普通文本文件。 當你這樣做的時候,請確認在 UTF-8 locale 下執行。

    LC_ALL=en_US.UTF-8 w3m -o display_charset=UTF-8 \
            -cols 70 -dump -no-graph -T text/html \
            < foo_in.html > foo_out.txt
    

以下是對更新軟件包的幾點提示:



[78] 要獲得需要的日期格式,使用 LANG=C date -R

[79] 如果你用 dch -r 命令來使它成爲最後一筆更改, 請確保用編輯器顯式地保存 changelog 文件。

[80] 如果套件 foo 是使用舊的 1.0 格式的,可以在新解壓的原始碼目錄裏運行 zcat /path/to/foo_oldversion.diff.gz|patch -p1 來完成。

[81] 如果 uscan 命令下載並更新了原始碼,但沒有運行 uupdate 命令,你應該修正 debian/watch 檔案,使 URL 末尾後帶有 debian uupdate

[82] 如果你的 sponsor 或其他維護者一定反對更新已有的打包風格,則不值得去爲此煩惱或爭論,總是有更重要的事要做。

[83] 你可能使用 splitdiff 命令將 big.diff 分割爲多個增量補丁。