GitHub CLI (gh
) には hub compare
相当のコマンドがない。要望はあるけど動きはなさそう。自分も欲しいと思って何度か gh
のサブコマンドを探しては見つからず、時間を無駄にしていた。気が向いたので拡張機能を作ってみた。
gh-compare
という名前にしなかったのは、将来 gh
本体に取り込まれる際は gh browse
のサブコマンドにするべきだろうなと思ったから。あと、手元で比較する(diff)のとは違ってブラウザで開くところがポイントなんだよ、というのが伝わりやすい名前のほうが適切だとも思ったから。エイリアスをセットして gh compare ARG
と呼び出せるようにすると hub compare
と使用感が同じでとても使いやすい。
単純に A...B
みたいなコマンドライン引数から https://github.com/OWNER/REPO/compare/A...B
という URL を作ってブラウザで開くだけだが、肝心のブラウザで開く部分をクロスプラットフォームに作るのは厄介そうだったので Go 拡張として作った。なぜなら go-gh の browser
モジュールがその辺りの面倒を見てくれるから。
最初は直接 cli/cli
に Pull Request を送るつもりで cli/cli
のソースコードを読んでいた((pr create
の処理の中で compare URL を作ってる箇所があることも発見した))けど、GitHub 社員が新しいコマンドを追加するときは指定のコントリビューション方法があるようで、まず拡張を作れとあるのでそれに従った。ただ、これは GitHub の新機能用のコマンドを業務で追加するケース(codespace
とか)のことを指しているような気もするので、さくっと PR したほうが早かったのかもしれない。
Go で拡張機能を作るの初めてだったので多少戸惑った。コードをリポジトリにプッシュしても、リリースを作ってコンパイル済みのバイナリを追加しないと extension is not installable: missing executable
というエラーで gh extension install
できない。cli/gh-extension-precompile というアクションがあってこれを使うとコンパイルからリリースへの追加までを GitHub Actions でできる。サンプルのコードを release.yml
として追加しようとしたらコミットエラーが出て少し悩んだが、go extension create --precompile=go
で雛形を作った時点で release.yml
も作られていたので同じファイル名ではコミットできなかった、というオチだった。