My External Storage

Jan 31, 2021 - 3 minute read - Comments - go

[Go] まだレビュー中のgerrit上のコードパッチをローカルに取得する

@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のコードを読むことになった。

ここで、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さん流石という感じだった。

参考


  1. GitHubのPull Request相当 ↩︎

  2. GitHub上にあるリポジトリはミラーリポジトリ ↩︎

関連記事