Mercurial管理下のファイルを検索する grepfile extension

'hg grep'は履歴を検索してしまうし、'hg locate "set:grep('hogehoge')"'はマッチした行を表示してくれないので、この二つのコマンドの間の子を作って見ました。

設定

[extensions]
grepfile = [path to]/grepfile.py

使い方

こんな感じで管理下のファイルを検索できます。

% hg grepfile -n ctx.walk
mercurial/cmdutil.py:1777:        for abs in ctx.walk(m):
mercurial/commands.py:283:    for abs in ctx.walk(m):
mercurial/commands.py:1085:    for abs in ctx.walk(m):
mercurial/commands.py:2172:    for abs in ctx.walk(m):
mercurial/fileset.py:460:        subset = ctx.walk(ctx.match([]))
mercurial/subrepo.py:590:        return ctx.walk(match)
% hg grepfile -r 10000 -i -n ctx.WALK
mercurial/commands.py:117:    for abs in ctx.walk(m):
mercurial/commands.py:573:    for abs in ctx.walk(m):
mercurial/commands.py:1052:    for abs in ctx.walk(m):

ヘルプはこんな感じ。オプションのメッセージは'hg grep'と'hg locate'のものを流用しているので、いい感じに日本語がでます。

% hg help grepfile
hg grepfile [OPTION]... PATTERN [FILE_PATTERN]...

search for a pattern in specified files

    Search files for a regular expression.

オプション:

 -a --text                 全ファイルをテキストファイルと仮定
 -i --ignore-case          大文字小文字を無視して検索
 -n --line-number          合致した行番号を表示
 -r --rev リビジョン       当該リビジョン時点のファイル一覧から検索
 -I --include パターン [+] パターンに合致したファイルを処理対象に追加
 -X --exclude パターン [+] パターンに合致したファイルを処理対象から除外
    --mq                   パッチ管理リポジトリへの操作

[+] 印付きのオプションは複数回指定可能です

"hg -v help grepfile" で詳細な情報が表示されます

ちなみに

aliasでこの機能を実現すると、だいたいこんな感じ。

[alias]
grepfile = ! $HG locate --print0 | xargs --null grep $@