Python
Git

Pythonでgitの操作をラッピング

More than 3 years have passed since last update.

自分用メモ。

PythonでGitの動きを把握するには、subprocess モジュールの Popen を使う。


class GitError(BaseException): pass

def git(cmd, *args):
command = ("git", cmd) + args
proc = Popen(command, stdin=-1,stdout=-1,stderr=-1)
out, err = proc.communicate()

if len(err) == 0:
return out.strip()
else:
raise GitError(err.strip())

これを応用した、GitUtility というクラスを作ってみる。

from subprocess import Popen

class GitError(BaseException):
"""
This Error raises when git command runner has error.
"""

pass

class GitUtility(object):
"""
The GitUtility contains utility functions for operate git.
"""

def __init__(self):

return

def run(self, cmd, *args):
"""
This command is git command runner by subprocess.
Return output or raise GitError if runner has error.
"""

if isinstance(args[0], tuple):
# Avoid duplicate tuple
# ex. self.rev_parse("--show-toplevel")
# ->('git', 'rev-parse', ('--show-toplevel',))
command = ("git", cmd) + tuple([arg for arg in args[0]])
else:
command = ("git", cmd) + args

proc = Popen(command, stdin=-1,stdout=-1,stderr=-1)

out, err = proc.communicate()

if len(err) == 0:
return out.strip()

else:
raise GitError(err.strip())

def add(self, path):
"""
Run git add command
"""

self.run("add", path)

def commit(self, commit_msg):
"""
Run git commit
"""

return self.run("commit", "-m", commit_msg)

def rev_parse(self, *args):
"""
Run git rev-parse command
"""

return self.run("rev-parse", args)

def get_toplevel(self):
"""
Return git top level path using git rev-parse
"""

return self.rev_parse("--show-toplevel")

たとえば自動でコミットさせたいとか、rev-parse を使ったリポジトリのパスを取得したいとか、そういうことができる。

もっと応用すれば、ログのパースとか、あるコミット時点のファイルの中身を取得できたりもする。