mercurialのファイルを(なぜか)タイムスタンプで履歴管理

履歴管理はファイル名に日付を付けるのが基本ですよね。

ということで、mercurialのチェンジセットに含まれているファイルを、日付を付けたファイル名で展開するスクリプトを作りました。レポジトリのディレクトリに移動し、このスクリプトを実行してください。

…ええ、ええ、言いたいことはよーく分かっています。でもですね、なにも言わないでください…

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# This script extracts changed files in changesets with timestamp suffix.
# 
# Yes, I know timestamp based history management is not the mercurial way.
# but, but, sigh...
#
# license: new BSD
# 

from mercurial import ui
from mercurial import hg

import datetime
import os

MAXAGE = 10  # 展開するチェンジセットの数
FORMAT = "%Y%m%d-%H%M%S"

u = ui.ui()
repo = hg.repository(u, '.')

tip = repo.changectx("tip")
tip_rev = tip.rev()

for i in range(tip_rev, tip_rev - MAXAGE, -1):
    ctx = repo.changectx(i)
    unix_timestamp = ctx.date()[0]
    tz = ctx.date()[1]  # currently not used
    d = datetime.datetime.fromtimestamp(unix_timestamp)

    for filename in ctx.files():
        fctx = ctx[filename]
        fname = os.path.join(repo.root,
                             "{0}-{1}".format(filename, d.strftime(FORMAT))
                             )
        try:
            f = open(fname, "w")
            f.write(fctx.data())
        finally:
            if f:
                f.close()