Fixing a bug in Ubuntu

4.1. Introduction

如果你已經照著前幾章把環境設定好了,那你差不多可以準備找bug了。

就如同你在上圖看到的,其實跟一般的流程一樣,找到問題,下載程式碼,解決他,測試,將你的修改完的程式碼推回Launchpad上,並且找有權限的人幫你檢視(review)和merge進去。底下就會根據每個步驟都來講解。

4.2. Finding the problem

有需多方式可以找到問題來解決,有可能是你自己遇到的bug report,又或者是你在其他地方注意到的問題。

有需要的話可以看一下在LaunchPad上的the bitesize bugs,從這個清單上你也許可以找到一些東西來作,如果以興趣的話也可以幫忙分類一下Ubuntu One Hundred Papercuts Team的bug triaged

4.3. Figuring out what to fix

假設你不知道哪個source package包含了有問題的code,但是你知道在你的系統裡有被影響到的程式路徑,你就可以發現哪個source package你需要去處理了。

舉例來說你在Bumprace找到一個bug,一個競賽遊戲,Bumprace程式可以使用指令 「/usr/bin/bumprace」去開啟,要找到包含這個應用程式的二進制的套件,請輸入底下指令:

$ apt-file find /usr/bin/bumprace

然後他就會顯示出:

bumprace: /usr/bin/bumprace

這邊要注意在「:」之前的是這個 binary package 的名字,通常source package和 binary package的名字會不一樣。如果是一個 source package用來建置很多不同個 binary package時更常發生。所以如果你要找到對某個binary package的source package,你可以輸入底下指令:

$ apt-cache showsrc bumprace | grep ^Package:
Package: bumprace
$ apt-cache showsrc tomboy | grep ^Package:
Package: tomboy

apt-cache是Ubuntu的標準安裝,所以不用額外安裝。

4.4. Getting the code

經過上一步,你已經知道是哪一個 source package了,所以這時候你就需要下載一份原始碼在你電腦裡,這樣你才可以debug。

在UDD裡面可以藉由 branching the source package 來將你要處理的相關套件給分支出去。Launchpad維護了在Ubuntu裡面的所有套件的分支。

在package『ubuntu-dev-tools』裡面有個工具叫做『pull-lp-source』,這個工具可以讓開發者抓取任何package的source code。舉例來說,如果你想要在xenial上抓取package-bumprace的source code的話,你就需要用底下的指令:

pull-lp-source bumprace xenial

如果你沒有特別指定哪個release的話,則將會自動的抓取dev版的package。

一旦在你的電腦裡已經有程式碼了,你就可以去研究bug在哪裡,並且修復他, 產生一個debdiff,並且附上你的debdiff到這個bug report上讓其他的開發者檢視。

然後以Bazaar分支的格式上傳你修復完的套件到Launchpad上。如果你覺得你已經滿意你的結果了,這時候你就可以submit a merge proposal ,這個動作會要求其他的Ubuntu開發者來檢視你的程式碼並且允許你進code。這時候恭喜你已經是一個Ubuntu的開發者了。

4.5. Work on a fix

市面上有許多書都事關於你要怎麼去找到bug,如何修復它,測試它等等。如果你真的是對寫程式不熟,你可以先找個簡單的來解決。盡量保持最小限度的改變,記得對你的修復加入說明。

記得在開始動工之前,確定沒有人已經處理完了,或者正在處理。可以從底下幾個來源檢查:

  • Upstream/Debian的bug tracker(Open和closed的bugs)。
  • Upstream 修訂的歷史(或者是新的發布)也許已經修復這個問題了。
  • Debian或其他Distro的bug或是packages。

你現在要建立一個裡面已經包含修復部份的patch。可以使用底下的命令:

$ edit-patch 99-new-patch

這將會複製套件到一個暫時的資料夾。然後你就可以開始修改檔案或是從upstream那邊去套用他的patch檔,舉例來說

$ patch -p1 < ../bugfix.patch

當你結束編輯後或者是你按了『control-d』,這個新的patch將會被加到debian/patches。

接下來下一步你應該要為了你的patch加一個header,其包含了meta 資訊,這樣其他的開發者才可以知道這個patch的目的,和這個patch是哪來的。你可以藉由編輯一個模板來反應這個patch是幹麻用的,如以下命令:

$ quilt header --dep3 -e

這個命令將會在你習慣的編輯器上面開啟一個模板,照著這個模板來確保你填入了所有的相關資訊。

4.6 Documenting the fix

對於你的程式碼,足夠的註解和說明是非常重要的一件事,這樣其他開發者去看你的程式碼才不會搞不懂你當初的用意是什麼。每個Debian和Ubuntu的package source都包含了debian/changelog,每個上傳的套件都會被持續追蹤。

上傳最簡單的執行方式是:

$ dch -i

這將會增加一個「changelog entry」的模板,然後啟動一個文字編輯器後,你就可以在上面編輯,舉例來說像是:

specialpackage (1.2-3ubuntu4) trusty; urgency=low

  * debian/control: updated description to include frobnicator (LP: #123456)

 -- Emma Adams <[email protected]>  Sat, 17 Jul 2010 02:53:39 +0200

dch應該已經填好第一行和最後一行了,第一行包含了套件名稱,版本名稱,要到哪個Ubuntu的版本,還有優先權。最後一行也是總是包含了名字,email和改變時間的timestamp(RFC 5322 格式)。

接下來中間的部份就是本體,最重要的部份是:

  • 在哪裡被完成的。
  • 這個改變是什麼。
  • 這個改變是在哪裡被討論到的。

上面的例子大部分都是取自LaunchPad bug (LP: #123456)。

Bug reports, mailing list thread或是規格通常都是很好的資訊來提供合理程式碼改變的資訊。而如果你在Launchpad bugs使用LP: #< number>標示,這個bug將會在上傳到Ubuntu上以後就被close掉。

4.7. Testing the fix

要用你改的code去建制一個測試套件,請跑以下命令:

$ bzr builddeb -- -S -us -uc $ pbuilder-dist ../_.dsc

$ debuild -S -d -us -uc
$ pbuilder-dist <release> build ../<package>_<version>.dsc

這將會從分支的內容去建立一個source package, -us -uc 將會省略簽核(singed)source package的步驟,-d的話將會省略省建制的相依性,而pbuilder-dist將會從你選擇的版本的source那邊去建立套件。

在這個案例底下,請使用底下的指令來看一下這個package的資訊:

$ dpkg -I ~/pbuilder/*_result/bumprace_*.deb
**Note**

如果debubild有顯示錯誤訊息“Version number suggests Ubuntu changes, but Maintainer: does not have Ubuntu address”的話,則請執行package - 『ubuntu-dev-tools』裡面的『update-maintainer』命令,然後它就會自動的修復了。會有這個錯誤主要是因為在Ubuntu裡面,所有的『Ubuntu Developers』都會負責所有的Ubuntu packages,但是在Debian底下,每個package都會有相關的maintainers。

**Note**

一旦建制完成了,從『~/pbuilder/< release>result/ (using sudo dpkg -i< package>< version>.deb)』去安裝這個套件,去測試是否已經被修復了。

4.8 Submitting the fix and getting it included

如果想要changelog entry被寫入儲存,請用指令:

$ debuild -S -d

這次將會有簽署(signed)的動作,然後就準備將你的diff給傳送到上去。

在大多數的案例之下,Debian可能也會想要有這個patch,所以你必須傳送這個patch到Debian上去,只要簡單的執行:

$ submittodebian

這將會有數個步驟來確保這個bug已經到正確的階段了,記得要在再次審視一下這個diff,確保它並沒有包含之前胡亂上的change。

如果一切都很順利的話,數分鐘後你就會收到Debian的bug tracking system的信。

下面還有,待補充

4.9 Committing the fix

如果想要changelog entry被寫入儲存,請用指令:

~~debcommit~~

然後這次的改變就會隨著你的 changelog entry(被當成commit message)被commit上去。 如果要將它push到Launchpad上的某個branch,你必須要用以下的語法:

~~ lp:~/ubuntu///~~

舉例來說:

~~ lp:~emmaadams/ubuntu/trusty/specialpackage/fix-for-123456~~

而如果直接run:

~~ bzr push lp:~emmaadams/ubuntu/trusty/specialpackage/fix-for-123456 bzr lp-propose~~

就一切都完成了,第一個指令將會push到Launchpad,而第二個指令就會在你的瀏覽器上開啟Launchpad上的remote branch頁面。然後找到 「(+) Propose for merging」連結,按下去以後你就會發起一個「merge request」。

更多的細節請參考「 seeking sponsorship 」,如果你的問題是在「stable release」或者是一些跟「security」有關係,則可以參考一下「 Security and stable release updates 」。


Ref:
http://packaging.ubuntu.com/html/fixing-a-bug.html

results matching ""

    No results matching ""