2008年10月27日月曜日

GitPython

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
GitPythonをとってきてコードを観察中。よい意味で普通なpythonコード。SQLObjectみたいに変態じゃない。

ざらっと見た感じではcommand lineで打つコマンドや引数をpython objectにしたかんじ。
tagやHEADオブジェクトがある模様。commitへのsha1アクセスはdictかな?
validなpropertyになれないだろうから。

git.HEADとかできるらしい。

class TestHead(object):
def setup(self):
self.repo = Repo(GIT_REPO)

@patch(Git, '_call_process')
def test_repr(self, git):
git.return_value = fixture('for_each_ref')

head = self.repo.heads[0]

assert_equal('' % head.name, repr(head))

assert_true(git.called)
assert_equal(git.call_args, (('for_each_ref', 'refs/heads'), {'sort': 'committerdate', 'format': '%(refname)%(objectname)'}))


今回用がありそうなのはこの辺かな?

def test_archive_tar(self):
self.repo.archive_tar

def test_archive_tar_gz(self):
self.repo.archive_tar_gz


class Repoには、archive_tarメソッドとarchive_tar_gzメソッドがある。

def archive_tar(self, treeish = 'master', prefix = None):
"""
Archive the given treeish

``treeish``
is the treeish name/id (default 'master')

``prefix``
is the optional prefix

Examples::

>>> repo.archive_tar


>>> repo.archive_tar('a87ff14')


>>> repo.archive_tar('master', 'myproject/')


Returns
str (containing tar archive)
"""
options = {}
if prefix:
options['prefix'] = prefix
return self.git.archive(treeish, **options)


class Gitにこんなメソッドがある。

def __getattr__(self, name):
if name[:1] == '_':
raise AttributeError(name)
return lambda *args, **kwargs: self._call_process(name, *args, **kwargs)

これは参考になりますね。__getattr__でlambdaをつかった無名関数を返す。
関数が第一級objectであることとは何ぞや?ということですな。

そして_call_process

_kwargs = {}
for kwarg in execute_kwargs:
try:
_kwargs[kwarg] = kwargs.pop(kwarg)
except KeyError:
pass

# Prepare the argument list
opt_args = self.transform_kwargs(**kwargs)
ext_args = map(str, args)
args = opt_args + ext_args

call = ["git", dashify(method)]
call.extend(args)

return self.execute(call, **_kwargs)

ん~~エレガント。

0 件のコメント: