TimestampExtension for Mercurial

大体ファイルのタイムスタンプなんて無意味である。って 分かっちゃいるけどDOS出身の身としてはどうしても気になってしまう。 この前 ~/src/emacs-lisp ディレクトリをhg管理に 移行したら、全部チェックアウトしてその日の日付になっちゃった。 いや、だからタイムスタンプなんて無意味だし……。

でもでも、こういうファイルがあったりして

-rw-r--r--  1 yuuji  wheel    1736 Dec 10  1991 chbind.el

やー、時代はデマちゃん(Demacs)の頃で、そうそう91年の12月といえば PC-9801 NOTE SX にDemacsを入れて野鳥の機能をバリバリ増やしていた時期だなあ… で、chbind.el は、デフォルトのEmacsキー割り当てと 自分流のVz風割り当てを往復する関数を作って、いざ人に触らせるときも すぐ切り替えられるように……って作ってみたけど全く使う 場面がやってこなかった恵まれないEmacs-Lispファイルなのだ。

なんてな郷愁に浸るためにはやはりタイムスタンプを保存してほしいのだ。 無意味で悪かったな、開き直り。

で、 MercurialExtension で複数のチェンジセットを1つにまとめるのはないかなっ て探しているときに偶然 TimestampExtension を発見。あこりゃ素敵。

ちなみにチェンジセットをまとめるのとか、コリャ使えそうと思ったのを 抜粋しておくとこんな感じ。

purge標準添付: リポジトリ未登録ファイル/ディレクトリを 一括削除する。NetBSDの/usr/srcをhg管理してたりするときに make buildしたりした残骸を消すときに make clean するより 確実で速い。hg purge してから cvs up するよろし。
convert標準添付: Mercurial以外のリポジトリを 変換する。
color標準添付: 色付け。
graphlog標準添付: ブランチの流れを図示する。 ちとこれなしでは厳しいってくらい常用。
mq標準添付: パッチキューの処理。 ローカルパッチ作成がむっちゃ楽になった。 おかげでCanna for GNU Emacs23が短時間で作れた。
transplant標準添付: パッチの「つまみ食い」と 表現されてるが、微妙に違う2つのリポジトリを並行管理するとき には必須。別ブランチのどこからどこまでのパッチを 当てたかどうか人間は考えなくていい! メモ参照。
collapse複数のチェンジセットを1個にまとめる。 新しいブランチで、古いブランチの履歴を圧縮しちゃおうという 目的で探していたが、数個のチェンジセット圧縮でしか 使えないようで残念。どうも再帰を使ってるみたいで、 Pythonの再帰レベルをオーバーしちゃうようだ。

Pythonのライブラリロードパス

で、TimestampExtension をもらって来たらファイルが複数あった。

hg clone http://bitbucket.org/face/timestamp
cd timestamp
ls
autosync.py         makewritable.py     timestamp.pyc
casestop.py         timestamp.py

あれま。複数のファイルで構成されているものを、site-packages/hgext/ みたいななんでもかんでも用ディレクトリに突っ込むのは嫌じゃ! site-packages/hgext/timestamp/ をmkdirしてそこにいれたいのだ。 っていう簡単なことをやるのにちと苦労した。Pythonのロードパス? を 設定する方法を知らん。どうやら、site-packages/ ディレクトリに 適当な名前の拡張子 .pth のファイルを作ってそこに絶対パスか相対パスで ディレクトリを書いておけばいいらしいと分かった。

/usr/local/python/2.5/lib/python2.5/site-packages/mercurial.pth を作って以下のように書いた。

/usr/local/mercurial/lib/python2.5/site-packages
/usr/local/mercurial/lib/python2.5/site-packages/hgext/timestamp

そう、mercurial用モジュールをpython用ディレクトリとは違うところに インストールしているからこういう感じに書いているのだ。でもって、 hgext/timestamp 自体をパスに含めちゃうとロードするときの 参照名が変わるのでちと注意。 TimestampExtension のページには

[hooks]
update.timestamp = python:hgext.timestamp.hook

せえと書いてあるが、これを python:timestamp.hook に 変える必要があった。で ~/src/emacs-lisp/.hg/hgrc はこんな風。

[extensions]
timestamp=
[hooks]
update.timestamp = python:timestamp.hook

これで一件落着だが、そうか、*.pth というファイルを作っておけばいいのか。意外と管理しやすい。 これまで hg 本体を起動するときに mercurial モジュールを探せるようにこんなwrapperを作っていた。

#!/bin/sh
myname=`basename $0`
hg=/usr/local/mercurial
sp=${hg}/lib/python2.5/site-packages
PYTHONPATH=${sp}:$sp/hgext:/usr/local/subversion/lib/svn-python${PYTHONPATH:+:}$PYTHONPATH \
exec $hg/bin/$myname "$@"

*.pth に書いておいた方がスマートだな。ただ、python はあまりわからんので python 的ルールを忘れたときに自分で思い出せなくて ハマる可能性があるから wrapper もあながちヘボイとはいえないな。