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」のメニューがでる。
このメニューをクリックすると、H2 接続の Web インタフェースが表示される。
JDBC URL
に指定する場所は、Dockerfile
(gitbucket-docker/Dockerfile at master · gitbucket/gitbucket-docker · GitHub) を見れば分かるとおり jdbc:h2:/root/.gitbucket/data
を指定すれば良い。
User Name
と Password
には 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
ファイルに付与したレビュー指摘
ファイルに付与したレビュー指摘は、実体として「特定 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