プルリクで更新されたgemの一覧を出力する

Gemfile.lock のdiffから更新されたgemを探す方法を調べたのでメモ

動作確認に使ったプルリク

github.com

GitHub APIでプルリクの情報を取得する

$ gh api '/repos/rails/rails/pulls/48955' --jq '.base.sha, .head.sha'
1e824aa8e0655b4717cf612e31010bdd808f4fdf
2d61a206f445ccd52645c8d47ce97de39a39ea9d

GitHub APIで変更前後のGemfileを取得する

$ gh api '/repos/rails/rails/contents/Gemfile.lock?ref=1e824aa8e0655b4717cf612e31010bdd808f4fdf' --jq '.content' | base64 --decode > Gemfile.lock.before
$ gh api '/repos/rails/rails/contents/Gemfile.lock?ref=2d61a206f445ccd52645c8d47ce97de39a39ea9d' --jq '.content' | base64 --decode > Gemfile.lock.after

Gemfile.lock の差分を調べる

$ BUNDLE_GEMFILE=Gemfile.lock.before ruby -rbundler -e \
  'puts ["Gemfile.lock.after", "Gemfile.lock.before"].map { Bundler::LockfileParser.new(File.read(_1)).specs }.inject(:-)'
nio4r (2.5.9)
puma (6.3.0)

Gemfileがないディレクトリだと Could not locate Gemfile or .bundle/ directory のエラーが出たので、 BUNDLE_GEMFILE を指定することでエラーを回避している。