summaryrefslogtreecommitdiff
path: root/lib/git_python/commit.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/git_python/commit.py')
-rw-r--r--lib/git_python/commit.py235
1 files changed, 0 insertions, 235 deletions
diff --git a/lib/git_python/commit.py b/lib/git_python/commit.py
deleted file mode 100644
index 701f6c04..00000000
--- a/lib/git_python/commit.py
+++ /dev/null
@@ -1,235 +0,0 @@
-import re
-import time
-
-from actor import Actor
-from lazy import LazyMixin
-import tree
-import diff
-import stats
-
-class Commit(LazyMixin):
- def __init__(self, repo, **kwargs):
- """
- Instantiate a new Commit
-
- ``id``
- is the id of the commit
-
- ``parents``
- is a list of commit ids (will be converted into Commit instances)
-
- ``tree``
- is the correspdonding tree id (will be converted into a Tree object)
-
- ``author``
- is the author string
-
- ``authored_date``
- is the authored DateTime
-
- ``committer``
- is the committer string
-
- ``committed_date``
- is the committed DateTime
-
- ``message``
- is the first line of the commit message
-
- Returns
- GitPython.Commit
- """
- LazyMixin.__init__(self)
-
- self.repo = repo
- self.id = None
- self.tree = None
- self.author = None
- self.authored_date = None
- self.committer = None
- self.committed_date = None
- self.message = None
- self.parents = None
-
- for k, v in kwargs.items():
- setattr(self, k, v)
-
- if self.id:
- if 'parents' in kwargs:
- self.parents = map(lambda p: Commit(repo, **{'id': p}), kwargs['parents'])
- if 'tree' in kwargs:
- self.tree = tree.Tree(repo, **{'id': kwargs['tree']})
-
- def __bake__(self):
- temp = Commit.find_all(self.repo, self.id, **{'max_count': 1})[0]
- self.parents = temp.parents
- self.tree = temp.tree
- self.author = temp.author
- self.authored_date = temp.authored_date
- self.committer = temp.committer
- self.committed_date = temp.committed_date
- self.message = temp.message
-
- @property
- def id_abbrev(self):
- return self.id[0:7]
-
- @classmethod
- def count(cls, repo, ref):
- """
- Count the number of commits reachable from this ref
-
- ``repo``
- is the Repo
-
- ``ref``
- is the ref from which to begin (SHA1 or name)
-
- Returns
- int
- """
- return len(repo.git.rev_list(ref).strip().splitlines())
-
- @classmethod
- def find_all(cls, repo, ref, **kwargs):
- """
- Find all commits matching the given criteria.
- ``repo``
- is the Repo
-
- ``ref``
- is the ref from which to begin (SHA1 or name)
-
- ``options``
- is a Hash of optional arguments to git where
- ``max_count`` is the maximum number of commits to fetch
- ``skip`` is the number of commits to skip
-
- Returns
- GitPython.Commit[]
- """
- options = {'pretty': 'raw'}
- options.update(kwargs)
-
- output = repo.git.rev_list(ref, **options)
- return cls.list_from_string(repo, output)
-
- @classmethod
- def list_from_string(cls, repo, text):
- """
- Parse out commit information into a list of Commit objects
-
- ``repo``
- is the Repo
-
- ``text``
- is the text output from the git command (raw format)
-
- Returns
- GitPython.Commit[]
- """
- lines = [l for l in text.splitlines() if l.strip()]
-
- commits = []
-
- while lines:
- id = lines.pop(0).split()[-1]
- tree = lines.pop(0).split()[-1]
-
- parents = []
- while lines and re.search(r'^parent', lines[0]):
- parents.append(lines.pop(0).split()[-1])
- author, authored_date = cls.actor(lines.pop(0))
- committer, committed_date = cls.actor(lines.pop(0))
-
- messages = []
- while lines and re.search(r'^ {4}', lines[0]):
- messages.append(lines.pop(0).strip())
-
- message = messages and messages[0] or ''
-
- commits.append(Commit(repo, id=id, parents=parents, tree=tree, author=author, authored_date=authored_date,
- committer=committer, committed_date=committed_date, message=message))
-
- return commits
-
- @classmethod
- def diff(cls, repo, a, b = None, paths = []):
- """
- Show diffs between two trees:
-
- ``repo``
- is the Repo
-
- ``a``
- is a named commit
-
- ``b``
- is an optional named commit. Passing a list assumes you
- wish to omit the second named commit and limit the diff to the
- given paths.
-
- ``paths``
- is a list of paths to limit the diff.
-
- Returns
- GitPython.Diff[]
- """
- if isinstance(b, list):
- paths = b
- b = None
-
- if paths:
- paths.insert(0, "--")
-
- if b:
- paths.insert(0, b)
- paths.insert(0, a)
- text = repo.git.diff(*paths, **{'full_index': True})
- return diff.Diff.list_from_string(repo, text)
-
- @property
- def diffs(self):
- if not self.parents:
- d = self.repo.git.show(self.id, **{'full_index': True, 'pretty': 'raw'})
- if re.search(r'diff --git a', d):
- if not re.search(r'^diff --git a', d):
- p = re.compile(r'.+?(diff --git a)', re.MULTILINE | re.DOTALL)
- d = p.sub(r'diff --git a', d, 1)
- else:
- d = ''
- return diff.Diff.list_from_string(self.repo, d)
- else:
- return self.diff(self.repo, self.parents[0].id, self.id)
-
- @property
- def stats(self):
- if not self.parents:
- text = self.repo.git.diff(self.id, **{'numstat': True})
- text2 = ""
- for line in text.splitlines():
- (insertions, deletions, filename) = line.split("\t")
- text2 += "%s\t%s\t%s\n" % (deletions, insertions, filename)
- text = text2
- else:
- text = self.repo.git.diff(self.parents[0].id, self.id, **{'numstat': True})
- return stats.Stats.list_from_string(self.repo, text)
-
- def __str__(self):
- """ Convert commit to string which is SHA1 """
- return self.id
-
- def __repr__(self):
- return '<GitPython.Commit "%s">' % self.id
-
- @classmethod
- def actor(cls, line):
- """
- Parse out the actor (author or committer) info
-
- Returns
- [str (actor name and email), time (acted at time)]
- """
- m = re.search(r'^.+? (.*) (\d+) .*$', line)
- actor, epoch = m.groups()
- return [Actor.from_string(actor), time.gmtime(int(epoch))]