@dice_zuさんに教えてもらったことメモ。
TL;DR
golang.org/x/tools
のまだマージされていないコードをローカルで動かしたくなった- gerritに直接作成されたパッチはGitHubにミラーされていない
- Change Listトップページの「DOWNLOAD」ボタンをクリックするとパッチを取得するいくつかの方法が提案される
git fetch https://go.googlesource.com/go refs/changes/59/249759/2 && git checkout -b change-249759 FETCH_HEAD
git fetch https://go.googlesource.com/go refs/changes/59/249759/2 && git checkout FETCH_HEAD
- etc…
gerrit上のコードパッチをローカルで実行したい
社内勉強会としてGoのコードリーティングを隔週で行なっている。
昨年のアドベントカレンダーに同勉強会のことを書いたことがきっかけで@dice_zuさんや@po3rinさんにもゲストとして参加していただいている。
今週の勉強会では2021/01/30現在まだマージされていないgolang.org/x/tools
の次のChange List(CL)1のコードを読むことになった。
- tools/go/analysis: add a new VET checker “DeadMutation”
ここで、SSAの動きがコードを読むだけでは理解できなかったのでローカルでコードをいじりながらテストコードを実行してみたくなった。
GerritのCLをローカルに取得する
Goプロダクトのコードはすべてgo.googlesource.com/上で開発が行われている2。
GitHubならばghコマンドを使ってgh pr checkout ${PR_NUMBER}
とするだけだろう。
しかし、上記のCLはgerritに直接作成されたもので、GitHubのミラーリポジトリ上にPRとして存在しなかった。
gerrit上にしかないパッチの取得方法がわからなかったので@dice_zuさんに教えてもらった。
googlesource.com上にあるリポジトリをcloneする
まず大前提として該当リポジトリをgit clone
しておく。
GitHubにあるgolang/toolsリポジトリはミラーリポジトリなので、googlesource.com上にあるリポジトリをcloneする。
# https://go-review.googlesource.com/admin/repos/tools
$ git clone "https://go.googlesource.com/tools"
パッチを取得するgitコマンドを表示する
あとは該当CLのパッチを取得するためのgitコマンドを生成すればよい。
CLのトップページのdescriptionなどの右下にある「DOWNLOAD」ボタンをクリックする。
そうするといくつかのパッチを取得するgitコマンドが表示される。
とくにこだわりがなかれば一番上のbranchを取得するコマンドを実行すればよいだろう。
$ git fetch https://go.googlesource.com/tools refs/changes/34/287034/5 \
&& git checkout -b change-287034 FETCH_HEAD
これでローカルにCLの変更を取得することができた。
$ git log --oneline -n 3
4ec2bca5 (HEAD -> change-287034) tools/go/analysis: add a new VET checker "DeadMutation"
514964b7 gopls/internal/hooks: improve license file test
68bf78a6 internal/lsp/cmd: improve help output of gopls subcommands
$ go test ./go/analysis/passes/deadmutation
ok golang.org/x/tools/go/analysis/passes/deadmutation 0.072s
終わりに
今回このCLをコードリーディングの題材にしたのは@dice_zuさんの提案だった。
私はマージされたコミットすら追えていないので、レビュー中のコードもしっかりウォッチされている@dice_zuさん流石という感じだった。