Skip to main content

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の開発するのは楽しい。