git-gsub v0.0.6をリリースした

リポジトリ内のファイルを一括置換するGitのサブコマンドgit-gsubの新しいバージョンをリリースしました。

なかなか便利になったと思うのでお試しください。

新機能

ファイル名の変更も一緒にできるようになった

クラス名を変えたい時はgit gsub Foo Barとファイル内の文字列を置換した後、ファイル名をgit mvなりで別途変更する必要がありました。これは非常に面倒。なので、--renameオプションを渡すとファイル名も変更するようにしました。

内部的には

for f in $(git ls-files  | grep Git::Gsub)
  do mkdir -p $(dirname $(echo $f | sed 's/Git::Gsub/Svn::Tr/g'))
  git mv $f $(echo $f | sed 's/Git::Gsub/Svn::Tr/g') 2>/dev/null
done

というようなスクリプトを実行しています。

実験的な機能としてSnake/Camel/Kebab caseに変換した文字列も置換するようにした

例えばRailsプロジェクトだと OrderDetail ってモデルがあると、 order_detail という変数があり、 order-detailというDOMのクラス名があったりします。これをそれぞれ置換するのは面倒なので、--snake--camel--kebabというオプションでそれらも一括で置換するようしました。

--renameオプションで行う置換にも適用されます。これによってRailsプロジェクトのモデル名変更がコマンド一発でほぼ完了するようになりました。

ただこれ、ActiveSupport::Inflectorを使っていて、これが下記のようなRubyっぽい変換をします。これは他の言語では迷惑なはず。 「実験的」としているのはこのためです。なんとかしたい。

'ActiveModel::Errors'.underscore # => "active_model/errors"

変更点

sedで行っていたファイル内の文字列置換をPerlに書き換えました。これでgsedが入っていないと使えないって不具合もなくなったはず。もともとsedの文字列置換機能はPerl由来である、など教えてくれた @knu に感謝です。

その他所感

  • 自分が使いたくて作っているので、内部実装はかなり雑
  • 雰囲気でPerlワンライナーを書いているので若干不安
  • テストが読みにくいのでなんとかしたい