hgsubversionでFreeBSD svnをもってくるのつづき。

.hg/svn/rev_mapにhgとsvnのリビジョンの対応関係が記録されているので、これをもとに.hg/localtagsを生成すれば、-r オプションで svn のリビジョンを指定できるようになる。また hg log でタグとしてsvnのリビジョンがわかる。
ただFreeBSDのheadをとってくると2010-12-02の時点でリビジョンが157081もあり、これを全部localtagsに変換するとhgの動作が極端に遅くなるため、直近の10000個(15分の1)にすることで実用的な範囲に収めている。
さらに、localtagsを時系列と逆順にした方が速くなるっぽいので/usr/local/bin/gtac (in sysutils/coreutils)をつかっている。
スクリプト:

awk 'NF==2{print $2 " svn-r" $1}' .hg/svn/rev_map | tail -10000 | gtac >.hg/localtags
使用例:
% hg log -r svn-r216107
changeset:   157078:17db89e84c98
tag:         svn-r216107
user:        lstewart@ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f
date:        2010-12-02 02:32 +0000 (29 hours ago)
summary:     General cleanup of the NewReno CC module (no functional changes):

%


2010-12-06追加:
hgsubversion/hgsubversion/help/subversion.rst をみると、templateで {svnrev} がつかえるとか、リビジョン指定で -r 'svnrev(500)' とできるとか、便利になってた。
~/.hgrc or .hg/hgrc の例:

[ui]
style=~/.hgstyle

~/.hgstyleの例:
changeset = 'changeset:   {rev}:{node|short}\nsvnrevision: {svnrev}\n{branches}{
tags}{parents}user:        {author}\ndate:        {date|isodate} ({date|age})\ns
ummary:     {desc|firstline}\n\n'
changeset_quiet = '{rev}:{node|short}\n'
changeset_verbose = 'changeset:   {rev}:{node|short}\nsvnrevision: {svnrev}\n{br
anches}{tags}{parents}user:        {author}\ndate:        {date|isodate} ({date|
age})\n{files}{file_copies_switch}description:\n{desc|strip}\n\n\n'
changeset_debug = 'changeset:   {rev}:{node}\n{branches}{tags}{parents}{manifest
}user:        {author}\ndate:        {date|isodate} ({date|age})\n{file_mods}{fi
le_adds}{file_dels}{file_copies_switch}{extras}description:\n{desc|strip}\n\n\n'
start_files = 'files:      '
file = ' {file}'
end_files = '\n'
start_file_mods = 'files:      '
file_mod = ' {file_mod}'
end_file_mods = '\n'
start_file_adds = 'files+:     '
file_add = ' {file_add}'
end_file_adds = '\n'
start_file_dels = 'files-:     '
file_del = ' {file_del}'
end_file_dels = '\n'
start_file_copies = 'copies:     '
file_copy = ' {name} ({source})'
end_file_copies = '\n'
parent = 'parent:      {rev}:{node|formatnode}\n'
manifest = 'manifest:    {rev}:{node}\n'
branch = 'branch:      {branch}\n'
tag = 'tag:         {tag}\n'
extra = 'extra:       {key}={value|stringescape}\n'