このコードどうしてこうなってるのかという経緯を知りたい時、git blameなどのコマンドを利用することが多い。しかし、git blameだとその行を変更したcommitが分かるだけであり、経緯が結局分からないということがよくある。
そういう時にその行を変更したPRを開けるようにしたいなーと思って、いろいろやったところ、Emacsで現在見ている行を変更したPRを開けるようになったのでメモ。
特定のコミットが含まれるPull Requestを開くには
前段階として、特定のコミットが含まれるPull Requestを開くということをやってみる。これは既にいろいろやっている人がいて
- Commit Hash から、該当 Pull Request を見つける方法 - Qiita
- How to find pull-request by a commit sha - Pitr.ch
- GitベースのコードリーディングTips - クックパッド開発者ブログ
この中で Commit Hash から、該当 Pull Request を見つける方法 - Qiita の
hub browse -- `git log --merges --oneline --reverse --ancestry-path $1...master | grep 'Merge pull request #' | head -n 1 | cut -f5 -d' ' | sed -e 's%#%pull/%'`
を使うと良さそうだった。しかし、これはgithubのdefault branchがmasterでないといけないという制約がある。そこで色々試行錯誤したところ、 github - git - how to get default branch? - Stack Overflow を参考にして、default branchを判定できるようにし、最終的にopen-pr-from-commitとして、以下のようにした。
open-pr-from-commit
#!/bin/bash default_branch=`git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@'` hub browse -- `git log --merges --oneline --reverse --ancestry-path $1...$default_branch | grep 'Merge pull request #' | head -n 1 | cut -f5 -d' ' | sed -e 's%#%pull/%'`
これで、open-pr-from-commit f2cf9cdcadb
などとすれば、そのcommitがなされたPull Requestに飛ぶことができるようになった。
tig blameから該当行が変更されたPull Requestを開く
tig から当該コミットがマージされた Pull Request 画面を開く - Qiita を参考にする。tigから先程のコマンドを実行するようにするだけ。.tigrcに以下のように記述する。
bind generic P @open-pr-from-commit %(commit)
これでtig blame中に該当行でPを押すとPull Requestに飛べる!こんな感じ。
Emacsでvc-annotate中に該当業が変更されたPull Requestを開く
tigもいいんだけど、普通コードリーディングをしている時は、tigではなくて自分のエディタで見ている。なのでここまで来たらEmacsでも開けるようにしましょうと考えた。
Emacsでgit blameっぽいものを見るにはvc-annotateというのを使う。参考は Emacs の vc-annotate - naoyaのはてなダイアリー
vc-annotate中にその行のrevisionを取るにはvc-annotate-extract-revision-at-line
が使えそうだったので、それを利用して以下のような関数を定義し、vc-annotate-mode-mapにキーバインドを設定する。
;; vc-annotateで現在の行がmergeされたPRを開く (defun vc-annotate-open-pr-at-line () (interactive) (let* ((rev-at-line (vc-annotate-extract-revision-at-line)) (rev (car rev-at-line))) (shell-command (concat "open-pr-from-commit " rev)))) (define-key vc-annotate-mode-map (kbd "P") 'vc-annotate-open-pr-at-line)
あとはこれでvc-annotate中にPを押すだけでPRに飛べる!
まとめ
今回は特定のコミットが含まれるPull Requestを開くコマンドを作りつつ、それを使うことでEmacsで現在見ている行を変更したPRを開けるようにした。シュッと関係するPRを見れるようになったのは非常に便利。
おまけ
Kazuho's Weblog: git blameでプルリクエストの番号を表示する もめっちゃ便利です。