理系学生日記

おまえはいつまで学生気分なのか

GitbucketのDBからレビュー指摘を抽出する

GitBucket 上で Pull Req とかやりとりしているんだけど、いろいろと評価をするために、これらのレビュー情報を定量化する必要に駆られました。 こういうのを手で数えたりしていると日が暮れるし、何が生産性だ腹を切って死ねということになる。GitBucket でも当然のように DB 管理をしているので、それを取り出せれば良いでしょう。

環境を構築しよう

とりあえず試すためには GitBucket を構築して実際の DB の中身を見れば良い。こういう環境を一から構築していると日が暮れてしまって貴重な休日を浪費する。GitBucket には docker image があるので、docker で構築すれば良いでしょう。

$ docker-machine start default
$ eval $(docker-machine env)
$ docker run -d -p 8080:8080 -p 29418:29418 -v $(pwd)/data:/gitbucket takezoe/gitbucket

上のようなコマンドを実行すると、http://$(docker-machine ip):8080 にアクセスするとブラウザで gitbucket が立ち上がるし、カレントディレクトリ直下の data ディレクトリに gitbucket の DB (h2 database) である data.mv.db が出来上がる。

% ls data
data.h2.db  data.mv.db  data.trace.db  repositories  test.mv.db  tmp  version

h2 database に接続しよう

Gitbucket は Administrator の権限が付与されたユーザでログインすると、下記の画面のように「H2 Console」のメニューがでる。

f:id:kiririmode:20160501114138p:plain

このメニューをクリックすると、H2 接続の Web インタフェースが表示される。

f:id:kiririmode:20160501114358p:plain

JDBC URL に指定する場所は、Dockerfile (gitbucket-docker/Dockerfile at master · gitbucket/gitbucket-docker · GitHub) を見れば分かるとおり jdbc:h2:/root/.gitbucket/data を指定すれば良い。 User NamePassword には sa と入れておけばいいです。この sa って何を意味しているんだろ。

そしたらレビュー指摘を抽出してみましょう

運用上、レビュー指摘は Pull Request に対して行われているんだけど、Pull Request に表示されるファイルに対するコメントとしての指摘と、Pull Request 自体に対する指摘 (ISSUE の Conversation としての指摘) で、コメントを格納されるテーブルが異なっている。

Pull Req 自体に対するレビュー指摘

Pull Req に対する指摘は ISSUE_COMMENT テーブルに対して格納される。 Pull Request を軸にして抽出するなら以下のようなかんじかな。

select pr.request_user_name, pr.request_repository_name, i.title, comment.commented_user_name, comment.content, comment.registered_date
from pull_request pr
  inner join issue i on  (pr.repository_name = i.repository_name and pr.issue_id = i.issue_id)
  inner join issue_comment comment on (comment.repository_name = pr.repository_name and comment.issue_id = pr.issue_id)
where comment.action = 'comment'
order by pr.request_user_name, pr.request_repository_name, comment.registered_date

f:id:kiririmode:20160501115801p:plain

ファイルに付与したレビュー指摘

ファイルに付与したレビュー指摘は、実体として「特定 commit の特定ファイルに対するコメント」として COMMIT_COMMENT テーブルに格納される。 これを利用すると、以下のような SQL で抽出できそう。

select cm.user_name, cm.repository_name, cm.commented_user_name, cm.content, cm.registered_date
from commit_comment cm
  inner join issue iss on  (cm.user_name = iss.user_name
                       and  cm.repository_name = iss.repository_name
                       and  cm.issue_id = iss.issue_id)
order by cm.user_name, cm.repository_name, registered_date

f:id:kiririmode:20160501120105p:plain