summaryrefslogtreecommitdiff
path: root/lib/git/diff.py
diff options
context:
space:
mode:
authorMichael Trier <mtrier@gmail.com>2008-05-30 21:01:44 -0400
committerMichael Trier <mtrier@gmail.com>2008-05-30 21:01:44 -0400
commit233e3ffe0ef35dbabe49340ba567499690dcc166 (patch)
tree289bb04b3a806a20fe5b7b831a4643e2fcfd0190 /lib/git/diff.py
parent7b675bf555e89e708f1b8f79bd90796dd395837b (diff)
downloadgitpython-233e3ffe0ef35dbabe49340ba567499690dcc166.tar.gz
renamed git_python to git. Removed pop_key and replaced with dict.pop. Fixed up tests so they pass except for stderr test. Modified version information retrieval.
Diffstat (limited to 'lib/git/diff.py')
-rw-r--r--lib/git/diff.py79
1 files changed, 79 insertions, 0 deletions
diff --git a/lib/git/diff.py b/lib/git/diff.py
new file mode 100644
index 00000000..075b0f87
--- /dev/null
+++ b/lib/git/diff.py
@@ -0,0 +1,79 @@
+import re
+import commit
+
+class Diff(object):
+ """
+ A Diff contains diff information between two commits.
+ """
+
+ def __init__(self, repo, a_path, b_path, a_commit, b_commit, a_mode, b_mode, new_file, deleted_file, diff):
+ self.repo = repo
+ self.a_path = a_path
+ self.b_path = b_path
+
+ if not a_commit or re.search(r'^0{40}$', a_commit):
+ self.a_commit = None
+ else:
+ self.a_commit = commit.Commit(repo, **{'id': a_commit})
+ if not b_commit or re.search(r'^0{40}$', b_commit):
+ self.b_commit = None
+ else:
+ self.b_commit = commit.Commit(repo, **{'id': b_commit})
+
+ self.a_mode = a_mode
+ self.b_mode = b_mode
+ self.new_file = new_file
+ self.deleted_file = deleted_file
+ self.diff = diff
+
+ @classmethod
+ def list_from_string(cls, repo, text):
+ lines = text.splitlines()
+ a_mode = None
+ b_mode = None
+ diffs = []
+ while lines:
+ m = re.search(r'^diff --git a/(\S+) b/(\S+)$', lines.pop(0))
+ if m:
+ a_path, b_path = m.groups()
+ if re.search(r'^old mode', lines[0]):
+ m = re.search(r'^old mode (\d+)', lines.pop(0))
+ if m:
+ a_mode, = m.groups()
+ m = re.search(r'^new mode (\d+)', lines.pop(0))
+ if m:
+ b_mode, = m.groups()
+ if re.search(r'^diff --git', lines[0]):
+ diffs.append(Diff(repo, a_path, b_path, None, None, a_mode, b_mode, False, False, None))
+ continue
+
+ new_file = False
+ deleted_file = False
+
+ if re.search(r'^new file', lines[0]):
+ m = re.search(r'^new file mode (.+)', lines.pop(0))
+ if m:
+ b_mode, = m.groups()
+ a_mode = None
+ new_file = True
+ elif re.search(r'^deleted file', lines[0]):
+ m = re.search(r'^deleted file mode (.+)$', lines.pop(0))
+ if m:
+ a_mode, = m.groups()
+ b_mode = None
+ deleted_file = True
+
+ m = re.search(r'^index ([0-9A-Fa-f]+)\.\.([0-9A-Fa-f]+) ?(.+)?$', lines.pop(0))
+ if m:
+ a_commit, b_commit, b_mode = m.groups()
+ if b_mode:
+ b_mode = b_mode.strip()
+
+ diff_lines = []
+ while lines and not re.search(r'^diff', lines[0]):
+ diff_lines.append(lines.pop(0))
+
+ diff = "\n".join(diff_lines)
+ diffs.append(Diff(repo, a_path, b_path, a_commit, b_commit, a_mode, b_mode, new_file, deleted_file, diff))
+
+ return diffs