Rustでgit stashを検索できるツールを書いた
仕事でよくgit stashを使うのですが「あれ?あのstashどれだっけ?」が頻発します。git stash show stash@{n}
を複数回行えば見つかるのですが、結構面倒くさいです。ということでstashを検索してくれるCLIツールを書きました。
Rust the bookを読みながらRustで書いています。今年はRust通して静的型付け言語やっていきたい。
github.com
https://crates.io/crates/harvest
crates.ioとHomebrewに公開してるので、Rustつかってない人でもbrewからインストールすることができます。
- cargo
cargo install harvest
- Homebrew
brew tap QWYNG/harvest
brew install harvest
使い方
harvest <pattern>
で今のブランチとstashの間のdiffからpatternを検索してヒットしたstashを以下の形式で標準出力します。
harvest fn stash@{0}: WIP on master: beb5221 rm tests module src/bm.rs | 2 ++ 1 file changed, 2 insertions(+) stash@{1}: WIP on master: beb5221 rm tests module src/lib.rs | 1 + 1 file changed, 1 insertion(+)
patternといってますが正規表現とかは渡せません。
なぜ検索結果の出力なのに検索した文字列が実際に書かれている箇所を抜き出さないかというと、僕がこっちのほうが見やすいと思ったからです。
単純にgit diff stash@{n}の中身を全探索してるだけなので、例えばharvest +
と実行すると全部のstashが出てきます。
文字列検索はせっかくなので自分でBMH法を実装してみました。(多分Rustのネイティブ関数のcontains
のほうが大分速い)
今後やりたいこと
- 真面目にパフォーマンスチューニング
- brewへの公開の自動化
- std::process::Outputのモックがよくわからなくてやってない統合テスト
- 単に
git stash show@{n}
を全部行うだけのoption
感想
やっぱりバイナリにして色々配布できるのは便利。あとIDEでRustの開発するのは楽しい。