git grep
便利ですよね。
私は git grep
と git gsub
は本当によく使います。
ところで git grep
はローカルリポジトリがないと実行できません。
ローカルにリポジトリがなければ git clone
して、 git grep
すればいいのですが、もう少し簡単にgrepするために gh-grep を作りました。
gh-grep
gh-grepはGitHub 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に優しくできる機能は追加したいです。