$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

Emacsで現在見ている行を変更したPRを開けるようにした

このコードどうしてこうなってるのかという経緯を知りたい時、git blameなどのコマンドを利用することが多い。しかし、git blameだとその行を変更したcommitが分かるだけであり、経緯が結局分からないということがよくある。

そういう時にその行を変更したPRを開けるようにしたいなーと思って、いろいろやったところ、Emacsで現在見ている行を変更したPRを開けるようになったのでメモ。

特定のコミットが含まれるPull Requestを開くには

前段階として、特定のコミットが含まれるPull Requestを開くということをやってみる。これは既にいろいろやっている人がいて

この中で 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を見れるようになったのは非常に便利。