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)をつかっている。
スクリプト:
~/.hgstyleの例:
ただ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'