GitHub上にあるリポジトリに対してAPIを通じてgit grepライクに走査できるツール gh-grep (gh grep) を作った

git grep 便利ですよね。

私は git grepgit gsub は本当によく使います。

ところで git grep はローカルリポジトリがないと実行できません。

ローカルにリポジトリがなければ git clone して、 git grep すればいいのですが、もう少し簡単にgrepするために gh-grep を作りました。

github.com

gh-grep

gh-grepGitHub APIを使ってGitHub上のリポジトリに対してgrepをするツールです。

特徴は、全てGitHub APIを通じて実行するためローカルに git clone することなくgrepできることです。

また、APIを使っている特徴を活用して複数リポジトリに対してgrepすることなども可能になっています。

あと実行が遅いです。ひたすらGitHub APIを叩いているので...*1

インストール

gh-grep というコマンドとしてHomebrewなどでのインストールも可能ですが、

$ brew install k1LoW/tap/gh-grep

GitHub CLI extensionとしてもインストールできるようにしています。この場合は gh grep というサブコマンドになります。

$ gh extension install k1LoW/gh-grep

使い方

git grep に近いですが、 --owner だけは必須オプションになっています。

例えば、自分のリポジトリのプロジェクトルートにおいてあるDockerfileのベースイメージを検索したい時、

$ gh grep ^FROM --include=Dockerfile --owner k1LoW
k1LoW/centve:Dockerfile:FROM centos:7
k1LoW/docker-alpine-pandoc-ja:Dockerfile:FROM frolvlad/alpine-glibc
k1LoW/docker-sshd:Dockerfile:FROM docker.io/alpine:3.9
k1LoW/gh-grep:Dockerfile:FROM debian:buster-slim
k1LoW/ghdag:Dockerfile:FROM debian:buster-slim
k1LoW/ghdag-action:Dockerfile:FROM ghcr.io/k1low/ghdag:v0.16.0
k1LoW/ghput:Dockerfile:FROM alpine:3.13
k1LoW/ghput-release-action:Dockerfile:FROM ghcr.io/k1low/ghput:v0.12.0
k1LoW/github-script-ruby:Dockerfile:FROM ghcr.io/k1low/github-script-ruby-base:v1.1.0
[...]

という感じで書けます。

「使っているActionをリストアップする」などは、以下のように書けます。

$ gh grep uses: --include=.github/workflows/* --owner k1LoW | sed -e 's/.*uses:\s*//g' | sort | uniq -c
   9 ./
   1 EndBug/add-and-commit@v7
   2 actions/checkout@master
  10 actions/checkout@v1
  50 actions/checkout@v2
  18 actions/setup-go@v1
  21 actions/setup-go@v2
   4 aquasecurity/trivy-action@master
[...]

--owner オプションは Organization(org) に対してもそのまま使えますので、「orgで使っているActionをリストアップする」ということも実施可能です。

また、gh-grep ならではのオプションとして --url というのがあり、grepでマッチした行のURLを出力してくれます。

「まだioutilを使っているところを探してWebUIで確認したい」というときなどは

$ gh grep 'ioutil\.' --include=**/*.go --owner k1LoW --repo ghput --url
https://github.com/k1LoW/ghput/blob/main/gh/gh.go#L300
https://github.com/k1LoW/ghput/blob/main/gh/gh.go#L313
$ gh grep 'ioutil\.' --include=**/*.go --owner k1LoW --repo ghput --url | xargs open

という感じで、macOSならパイプで open コマンドに値を渡すことでそれぞれブラウザで開いてくれます。

今後

git grep を参考に、欲しいと思ったオプションを追加していこうと思います。UTF-8以外の文字コードにも対応したいです。

あと、APIに優しくできる機能は追加したいです。

カジュアルにリポジトリgrepしたくなったとき、是非使ってみてください。

*1:並行処理できるようにすればもう少し早くなるとは思いますが、APIエンドポイントに対して優しくないので高速化だけを目的としたチューニングは今のところしない予定です。