リポジトリをPythonから操作したりなど

メモ。Mercurialのバージョンは1.6。
PythonからMercurialリポジトリの状態を取得したりちょっと操作したり。軽くラッパーを書いて使ってみてる。

hgwrapper.py

import os

from mercurial import cmdutil
from mercurial import commands
from mercurial.hg import repository
from mercurial.ui import ui
from mercurial.match import match

class MercurialWrapper(object):
    def __init__(self, path, encoding='utf-8'):
        self.path = os.path.normpath(path)
        self.ui = ui()
        self.repository = repository(self.ui, self.path)
        self.encoding = encoding

    def get_modified(self):
        return self.repository.status()[0]

    def get_added(self):
        return self.repository.status()[1]

    def get_removed(self):
        return self.repository.status()[2]

    def get_deleted(self):
        return self.repository.status()[3]

    def get_unknown(self):
        return self.repository.status(unknown=True)[4]

    def add(self, files):
        self.repository[None].add(files)

    def commit(self, files, commit_message):
        self.repository.commit(
            text=commit_message.encode(self.encoding),
            match=match(self.repository.root, self.repository.root, None, include=files)
        )

    def revert(self, files, no_backup=True):
        opts = {
          'no_backup': no_backup,
          'date': '',
          'rev': '',
        }
        commands.revert(self.ui, self.repository, *[os.path.join(self.path, fn) for fn in files], **opts)

    def remove(self, files):
        self.repository[None].remove(files)

使う場合。

>>> from hgwrapper import MercurialWrapper
>>> repo = MercurialWrapper('/home/tokibito/_work/repo_test/')
>>> repo.get_modified()
['fuga.txt']
>>> repo.get_added()
['piyo.txt']
>>> repo.get_unknown()
['example/foo.txt']
>>> repo.get_removed()
['example/bar.txt']

ノードとコンテキストの使い方をまだ理解してない。