@kyanny's blog

My thoughts, my life. Views/opinions are my own.

gh-browse-compare

GitHub CLI (gh) には hub compare 相当のコマンドがない。要望はあるけど動きはなさそう。自分も欲しいと思って何度か gh のサブコマンドを探しては見つからず、時間を無駄にしていた。気が向いたので拡張機能を作ってみた。

github.com

gh-compare という名前にしなかったのは、将来 gh 本体に取り込まれる際は gh browse のサブコマンドにするべきだろうなと思ったから。あと、手元で比較する(diff)のとは違ってブラウザで開くところがポイントなんだよ、というのが伝わりやすい名前のほうが適切だとも思ったから。エイリアスをセットして gh compare ARG と呼び出せるようにすると hub compare と使用感が同じでとても使いやすい。

単純に A...B みたいなコマンドライン引数から https://github.com/OWNER/REPO/compare/A...B という URL を作ってブラウザで開くだけだが、肝心のブラウザで開く部分をクロスプラットフォームに作るのは厄介そうだったので Go 拡張として作った。なぜなら go-ghbrowser モジュールがその辺りの面倒を見てくれるから。

最初は直接 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 も作られていたので同じファイル名ではコミットできなかった、というオチだった。