hg.exe を Python インタプリタにする - Mercurial Advent Calendar 2013

2013 年 12 月 9 日 はてなブックマークへ追加 はてなブックマーク - hg.exe を Python インタプリタにする - Mercurial Advent Calendar 2013 Bookmark this on Delicious

Mercurial Advent Calendar 2013 の 9 日目です。

プログラムのビルドでちょっとしたテキスト処理をしたいことはよくあると思います。 例えば、ビルド日時やリビジョン番号、その日の天気や気分を埋め込みたいとか。
そんな時、 Unix であれば sed, awk, perl など道具はいくらでもありますが、 Windows が絡むと残念な気持ちになりますね。

さて、ここでもし仮に Mercurial でソースコードを管理しているのであれば、 hg.exe を使えるんじゃないでしょうか?

import sys
from mercurial import cmdutil, commands

commands.norepo += ' python'
cmdtable = {}
command = cmdutil.command(cmdtable)

@command('python',
    [('c', 'code', '', 'program passed in as string')],
    '[-c cmd | file] [arg] ...')
def python(ui, *pats, **opts):
    sys.argv = list(pats)
    ns = {'__name__': '__main__'}
    if opts['code']:
        sys.argv.insert(0, '-c')
        exec opts['code'] in ns
    elif pats:
        execfile(pats[0], ns)

このエクステンションは hg python コマンドを提供します。 インストールのために稟議は不要です。

使い方:

# file の SHA-1 ハッシュを生成
hg python -c "import hashlib, sys; print hashlib.sha1(sys.stdin.read()).hexdigest()" < file
# ファイルを選択
hg python -c "from PyQt4.QtGui import *; a = QApplication([]); print QFileDialog.getOpenFileName()"

Makefile には PYTHON = hg python --config extensions.python=path/to/python.py と定義しておけばいいでしょう。 GNU Make が使えるなら、すでに Unix ライクな環境が整ってるかもしれませんけど。

コメント

blog comments powered by Disqus