mercurialのstyleを使用してlog出力をカスタマイズする

mercurialのdefaultのlog出力はあまりみやすくない.
styleオプションを使って出力形式を変えてみる.

mercurialのstyle

mercurialは標準でdefault changelog compactの3種類のstyleを積んでいる.

$ hg log --style default
changeset:   1:1fc5a09d576e
branch:      test
tag:         tip
user:        yuito 
date:        Fri Jun 10 11:05:15 2011 +0900
summary:     edit sample.txt

changeset:   0:4bfc25d77dab
user:        yuito 
date:        Fri Jun 10 11:04:23 2011 +0900
summary:     add files


$ hg log --style changelog
2011-06-10  yuito  

        * sample.txt:
        edit sample.txt
        [1fc5a09d576e] [tip] <test>

        * sample.txt, sample2.txt:
        add files
        [4bfc25d77dab]


$ hg log --style compact
1[tip]   1fc5a09d576e   2011-06-10 11:05 +0900   yuito
  edit sample.txt

0   4bfc25d77dab   2011-06-10 11:04 +0900   yuito
  add files

styleの自作

どれもあまりしっくりこないので、自分なりに作ってみた.

出力の形式は3種類書ける

  • changeset
  • changeset_quiet
  • changeset_verbose

changeset_quiet は --quietオプションを付けた場合のテンプレート
changeset_verboseは --verboseオプションを付けた場合のテンプレート

# こんな感じ
changeset = '{rev}{branches} ({date|age} by {author|person}){bookmarks}{tags}{desc|firstline|strip}\n'

波括弧("{" と "}")で囲まれたところがテンプレートキーワードになる.
テンプレートキーワードについてはChapter 11. Customizing the output of Mercurialを参考にしました.

テンプレートキーワードはカスタマイズできる.
たとえばタグの出力を変える場合は

start_tags = ' '
tag = '{tag}, '
last_tag = '{tag}'
end_tags = ' '

とすることができる.
start_でキーワードの先頭を指定できる
end_でキーワードの末尾を指定できる
last_でキーワードの項目が複数あった場合の最後のキーの出力を指定できる
start_などの後ろはテンプレートキーの複数形を指定する.

changeset = '{rev}{branches} ({date|age} by {author|person}){bookmarks}{tags}\n  {desc|firstline|strip}\n'

start_branches = ' '
branch = '{branch}'

start_tags = ' '
tag = '{tag}, '
last_tag = '{tag}'

上のをmap-cmdline.logとして保存して

$ hg log --style /path/to/map-cmdline.log
1 test (6 hours ago by yuito) tip
  edit sample.txt
0 (6 hours ago by yuito)
  add files

かなりスタイリッシュになった.

色とかつけたら最終的にこうなった.

changeset = '\033[0;33m{rev}\033[0m{branches} \033[1;30m({date|age} by {author|person}){bookmarks}\033[0m{tags}\033[0m\n {desc|firstline|strip}\n'

changeset_quiet = '\033[0;33m{rev}\033[0m \033[1;30m{author|person}\033[0m {desc|firstline|strip}\n'

changeset_verbose = 'changeset: \033[0;33m{rev}\033[0m:\033[0;33m{node|short}\033[0m{branches}{bookmarks}{tags}\nauthor:    {author}\ndate:      {date|rfc822date} ({date|age})\nsummary:   {desc|firstline|strip}\n\n{file_mods}{file_adds}{file_dels}\n\n'


start_file_adds = ''
file_add = '\033[0;32mA {file_add}\033[0m\n'
end_file_adds = ''

start_file_dels = ''
file_del = '\033[0;31mR {file_del}\033[0m\n'
end_file_dels = ''

start_file_mods = ''
file_mod = '\033[0;36mM {file_mod}\033[0m\n'
end_file_mods = ''

start_branches = ' '
branch = '\033[0;35m{branch}\033[0m'

start_bookmarks = ' '
bookmark = '\033[0;32m[{bookmark}]\033[0m '
last_bookmark = '\033[0;32m[{bookmark}]\033[0m'

start_tags = ' '
tag = '\033[0;33m{tag}\033[0m, '
last_tag = '\033[0;33m{tag}\033[0m'

f:id:yuitowest:20110610181316p:image