6 debbugs internal

上川      
___________________________________________________________________________________________________________________________

6.1 はじめに

こ の 文 書 は Anthony Towns がフィンランドの debconf 5 で発表した内容を日本にて展開するための資料で す 。 Anthony Towns の作成した英語の資料を省略して抜粋しています。 また、 それ以降に変更した事項に つ い て 追 記 し て い ま す 。

Debian Bug Tracking System (BTS) は、 ほぼ Debian に特化したバグ報告の管理の た め の シ ス テ ム で す 。 他 の プ ロ ジ ェク ト で も 利 用 さ れ て い る こ と も あ り ま す が 、 Debian でバグがパッケージベースで厳格に分類できることなどの特性が反映されてい る た め 、 Debian プロジェクトのワークフローで使いやすいように作られています。 *21

規模としては、 55000 以上の現在アクティブなバグ報告、 231000 のアーカイブされたバグ報告を現在保持 し て い て 、 毎 週 1000 以上の新規のバグ報告が追加されています。 ウェブインタフェース は 追 加 さ れ た 報 告 を す ぐ に 反 映 し て お り 、 過 去 、 ダ ウ ン タ イ ム も ほ と ん ど 発 生 し て い ま せん。

Anthony Towns によると下記がバグトラッキングシステムの要件です。

6.2 データ形式

バグデータベースのスプールの形式は下記です。 リレーショナルデータベースなどは利用していません、 スプールディレクトリ以下にほとんどのデータが格納されています。

各バグについて、 ファイルはそれぞれ4個あります。 サマリーファイルはメタデータを保存します。 ロ グファイルは、 そのバグに対して流れたメールを全て保存します。

status ファイルは互換性のためだけに存在しています。 report ファイルは、 最初のバグ報告のメール で、 バグが close されるときに送信されるものです。

6.2.1 incoming

incoming に来たメールは処理中、 名前を変えます。

また、 ファイル名の二つ目の文字はどこのメールアドレスにメールが送信されてきたものなのかという こ と を 示 し ま す 。 フ ァイ ル 名 の の こ り は 、 バ グ 番 号 と 、 一 意 な ID です。 一意な ID を決定するのに現在は 時間とプロセス番号を利用しています。

6.2.2 Status Summary

status ファイルの中身は行ベースです。 無い行については空行とみなします。 このファイルは今後なくし ていこうとしています。

summary ファイルは RFC822 形式で、 拡張可能になっています。 現在 Format-Version: 2 3 の二つ の形式があります。 3 は、 ヘッダについては RFC1522(MIME) のデコードされた形式になってい ます。

6.2.3 log ファイル

あらゆるメールが log ファイルには追記されていきます。 また、 メタデータも追記されていきます。 残念 ながら、 メタデータは生の HTML で書かれており、 またバージョンによって記述の仕方が変わっており、 さらに悪いことに、 古いバグの中にあるテキストは更新されていないため、 機械的に処理することは難し くなっています。

また、 コントロール情報は、 行頭のエスケープコードにより切り替わります。 メールの中にエスケープ コードのような文字列が出て来たら、 それは文字コード 030(8 進数) の文字を追加してエスケープし ます。

詳細は Debbugs::Log を見てください。

6.2.4 Index ファイル

index ファイルは、 pkgreport.cgi がどのパッケージにどのバグがわりあてられているかを確認するための 情報です。

以前は、 by-package.idx by-severity.idx というのがあり、 高速化に貢献するはずだったのですが、 一 年以上長い間生成されていなかったうえに、 生成されていなかったことに誰も気づかなかったので必要な いんじゃないだろうか、 ということです。

データ形式としては下記のようになります。 パッケージ、 バグ番号、 時間、 ステータス、 メールアドレ ス、 severity の順に書いた行が全てのバグに対して作成されています。

 pbuilder 317998 1121196782 open [Junichi Uekawa <dancer@netfort.gr.jp>] normal

6.3 コード形式

debbugs は特に設計もされずに長い間パッチを累積してきました。 ただ、 明確にわかれている部分はあっ て、 メールを処理するコアのインタフェースのスクリプトと、 ウェブを表示するための CGI 部分とで分離 できます。

設定ファイルは全て/etc/debbugs にあります。

6.3.1 コアのスクリプト

メールを処理する部分があります。

receive rebuild 以外は cron から起動しています。 15 分に一回しか動作しません。

6.3.2 CGI スクリプト

CGI 関連は、 errorlib 関数を活用している部分もありますが、 ほぼ独立しています。

pkgreport.cgi はユーザが直接ウェブでたたくため、 特に速度が重要視される部分なので、 触る場合には 注意してください。

6.3.3 ハックするには

debbugs のソースは CVS にあります。 また、 Debian Developer であれば、 ミラーが merkel.debian.org /org/bugs.debian.org 以下にあります。

6.4 そして何がおきたか

Anthony Towns の発表でどういう結果がもたらされたか見てみましょう。

6.4.1 バージョントラッキング

バグがどのバージョンで発見され、 どのバージョンで修正されたのかというのをトラッキングできるよう になりました。 従来は発見されたバージョンだけが Version ヘッダで分かるようになったのですが、 それ 以外の情報も保持するようになりました。 http://lists.debian.org/debian-devel-announce/2005/07/msg00010.html

バグ番号を保持して操作するための BTS のコマンドは下記です。

close  バグ番号  バージョン
reassign  バグ番号  パッケージ  バージョン
found  バグ番号  バージョン

また、 katie が変更され、 バグを close するメッセージには、 下記のヘッダが付くように な り ま し た 。 そ れ を BTS が処理して close されたバージョンを把握できるようになりま した。

 Source-Version:  バグ番号

CGI に対して、 version を指定すると、 そのバージョンでの状態がでてきます。 329344*22 は、 0.4 では open だったが、 0.5 では close になったというのが http://bugs.debian.org/cgi-bin/pkgreport.cgi?pkg=cowdancer&version=0.4 http://bugs.debian.org/cgi-bin/pkgreport.cgi?pkg=cowdancer&version=0.5 二つのページを比 較するとわかります。

/org/bugs.debian.org/spool/db-h/44/329344.summary を見ると、 メタデータとして保存されている のがわかります。

Format-Version: 2
Found-In: cowdancer/0.4
Done: Junichi Uekawa <dancer@debian.org>
Subject: cowdancer: cow-shell does not start, gives error
Date: 1127295198
Submitter: Francesco Potorti‘ <Potorti@isti.cnr.it>
Fixed-In: cowdancer/0.5
Package: cowdancer
Message-Id: <E1EI0YD-0003lE-00@pot.isti.cnr.it>
Severity: grave
6.4.2 ユーザタグ
http://lists.debian.org/debian-devel-announce/2005/09/msg00002.html

request@bugs.debian.org に対して下記のようなメールをおくればタグが追加できます。

    user aj@azure.humbug.org.au
    usertag 18733 + good-reasons-to-run-for-dpl
    usertag 18733 + still-cant-believe-it-finally-got-fixed
    usertag 62529 + your-days-are-numbered

見る際には、 users=でユーザを指定するとタグが見えるようになります。 http://bugs.debian.org/cgi-bin/pkgreport.cgi?pkg=dlisp;users=dancer@debian.org

また、 tag でタグを指定して、 users=でユーザを指定するとそのユーザで作成したタグを全て検索する ことができます。 http://bugs.debian.org/cgi-bin/pkgreport.cgi?tag=ignore-for-now;users=dancer@debian.org

6.4.3 バグ購読

バグ番号に対してメーリングリストのようにして利用することができるようになりました。 http://lists.debian.org/debian-devel-announce/2005/07/msg00014.html

バグ番号-subscribe@bugs.debian.orgにメールを出すと登録するようにメールがかえって来るので、 そ れ に 返 信 す る と 、 バ グ 番 号 に 登 録 さ れ ま す 。

6.4.4 バグブロッカー

どのバグがどのバグによって邪魔されているのかというのをトラッキングするための機能が追加されま した。

block  保留中のバグ番号 by  原因のバグ番号
unblock  保留中のバグ番号 by  原因のバグ番号
6.4.5 mindays maxdays

mindays, maxdays オプションが追加されました。 バグ報告の報告されてからの日数で表示させるかさせ ないかを選択できるオプションです。 http://bugs.debian.org/cgi-bin/pkgreport.cgi?maint=dancer@debian.org&maxdays=90 http://bugs.debian.org/cgi-bin/pkgreport.cgi?maint=dancer@debian.org&mindays=90 とし て入力できます。

6.4.6 バグ検索システム

Google master.debian.org にとって DoS になるような検索の仕方をしていたので、 現在 BTS google の検索対象にははいっていないので検索サービスが必要だろう、 という話題が出ていま した。

鵜飼さんが全文検索エンジンサービス (FABRE) を実装しましたが、 まだ本格的に使われるような状態 にはまだいたっていないようです。 結構このサービスは負荷が高いのが問題になると思われます。 http://fabre.debian.net/

6.4.7 debian-bugs.el はまだ動くのか

reportbug vi ユーザを中心としたインタフェースになっていますが、 Emacs を利用している人でも、 debian-bugs.el を利用して debian BTS を操作することができます。

たとえば、 debian-changelog-mode を使っている場合であれば、 changelog のエントリーを自動生成す るようになっています。 メニューから Bugs close を選択するか、 debian-changelog-close-bug でバグ番号 を選択する (タブ補完がききます) と、 下記のようなエントリーが作成できます。

dsh (0.25.6-2) unstable; urgency=low

  * Bug fix: "How to control dsh timeout time?", thanks to Junichi Uekawa
    (Closes: #281012).
  * Bug fix: "allow exclusion of host from list of hosts.", thanks to
    Junichi Uekawa (Closes: #289766).
  * Bug fix: "dsh: -c -i hangs if no input under current design", thanks
    to Charles Fry (Closes: #241531).

この機能は 207852*23 で上川の出したパッチが発端で実装されましたが、 気づいたら正規表現が巨大になってい ます。

ひ さ し ぶ り に ソ ー ス コ ー ド を み た ら 、 現 在 の 実 装 は 、 正 規 表 現 を つ か い ま く って HTML を解析 しているため、 何かイレギュラーなことがあった場合には、 動作しなくなります。 該当す る関数は emacs-goodies-el:/elisp/debian-el/debian-bug.el(debian-bug-build-bug-menu) です。

BTS のフォーマットが変わったので、 何かうごかなくなっていないかと心配していましたが、 特にうご かないということはないようです。

みてみると submitter のメールアドレスがうまく解析できなかった場合には’thanks to XXXX (closes: XXXX)’ が追加されないという仕様になっています。 たまにこれが発生するので、 再現する条件をさがし てバグを直したいですね。

      (with-temp-buffer
        (message "Fetching bug list...")
(call-process "wget" nil ’(t t) nil "--quiet" "-O" "-"
      (concat
                       "http://bugs.debian.org/cgi-bin/pkgreport.cgi?src="
                       package))
        (message "Fetching bug list...done")
(goto-char (point-min))
        (while
            (re-search-forward
             "\\(<H2.*</a>\\(.+\\)</H2>\\)\\|\\(<li><a
href=\"\\(bugreport.cgi\\?bug=\\([0-9]+\\)\\)\">\\(#[0-9]+: \\(.+\\)\\)</a>\\)"
             nil t)
          (let ((type (match-string 2))
              ;;(URL (match-string 4))
                (bugnumber (match-string 5))
                (description (match-string 6))
                (shortdescription (match-string 7)))
            (cond
             (type
              (setq bugs-are-open-flag (not (string-match "resolved" type)))
              (save-excursion
                (set-buffer debian-bug-tmp-buffer)
                (insert "\"-\"\n\"" type "\"\n")))
             (t
              (setq bug-alist (cons (list bugnumber description) bug-alist))
              (when bugs-are-open-flag
                (when (and (re-search-forward
                            "Reported by: <a class=\"submitter\"
href=\"pkgreport.cgi\\?submitter=[^;]+;arch=source\">"
                            nil t)
                           (or (looking-at "&quot;\\(.*\\)&quot; &lt;")
                               (looking-at "\\(.*\\) &lt;")))
                  (setq shortdescription
                        (concat "Bug fix: \"" shortdescription
                                "\", thanks to "
                                (debian-bug-rfc2047-decode-string
                                 (match-string 1))
                                " (Closes: #" bugnumber ").")))
                (setq bug-open-alist
                      (cons
                       (list bugnumber shortdescription)
 bug-open-alist)))

実際に changelog に追加する部分は emacs-goodies-el:elisp/dpkg-dev-el/debian-changelog-mode.el(debian-changelog-close-bug) にあります。

東 京 エ リ ア Debian 勉強会 2005 _________________________________________________________

PIC