diff options
author | Sebastian Thiel <byronimo@gmail.com> | 2009-10-08 17:14:07 +0200 |
---|---|---|
committer | Sebastian Thiel <byronimo@gmail.com> | 2009-10-08 22:59:54 +0200 |
commit | 19533ffadbcc959f12bf51488cf66f0715bec4c1 (patch) | |
tree | bf93f8130fae8a2edf3f2e766e93e6266a381309 /lib/git/diff.py | |
parent | 600bd69a81e4858293e6bc791b95568f0a370ae3 (diff) | |
download | gitpython-19533ffadbcc959f12bf51488cf66f0715bec4c1.tar.gz |
Fixed Diff class which used Commits instead of Blobs - as Blobs contain the path ( in the 'name' member variable ), the a|b_path members of Diff have been removed. Tests were adjusted and run
Diff docs have been updated to provide a little more information on specifics cases
Diffstat (limited to 'lib/git/diff.py')
-rw-r--r-- | lib/git/diff.py | 55 |
1 files changed, 41 insertions, 14 deletions
diff --git a/lib/git/diff.py b/lib/git/diff.py index 0216e061..44f55602 100644 --- a/lib/git/diff.py +++ b/lib/git/diff.py @@ -5,28 +5,44 @@ # the BSD License: http://www.opensource.org/licenses/bsd-license.php import re -import commit +import blob class Diff(object): """ A Diff contains diff information between two commits. + + It contains two sides a and b of the diff, members are prefixed with + "a" and "b" respectively to inidcate that. + + Diffs keep information about the changed blob objects, the file mode, renames, + deletions and new files. + + There are a few cases where None has to be expected as member variable value: + + ``New File``:: + + a_mode is None + a_blob is None + + ``Deleted File``:: + + b_mode is None + b_blob is NOne """ - def __init__(self, repo, a_path, b_path, a_commit, b_commit, a_mode, + def __init__(self, repo, a_path, b_path, a_blob, b_blob, a_mode, b_mode, new_file, deleted_file, rename_from, rename_to, 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 + if not a_blob or re.search(r'^0{40}$', a_blob): + self.a_blob = 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 + self.a_blob = blob.Blob(repo, id=a_blob, mode=a_mode, name=a_path) + if not b_blob or re.search(r'^0{40}$', b_blob): + self.b_blob = None else: - self.b_commit = commit.Commit(repo, id=b_commit) + self.b_blob = blob.Blob(repo, id=b_blob, mode=b_mode, name=b_path) self.a_mode = a_mode self.b_mode = b_mode @@ -39,6 +55,17 @@ class Diff(object): @classmethod def list_from_string(cls, repo, text): + """ + Create a new diff object from the given text + ``repo`` + is the repository we are operating on - it is required + + ``text`` + result of 'git diff' between two commits or one commit and the index + + Returns + git.Diff[] + """ diffs = [] diff_header = re.compile(r""" @@ -51,8 +78,8 @@ class Diff(object): ^new[ ]mode[ ](?P<new_mode>\d+)(?:\n|$))? (?:^new[ ]file[ ]mode[ ](?P<new_file_mode>.+)(?:\n|$))? (?:^deleted[ ]file[ ]mode[ ](?P<deleted_file_mode>.+)(?:\n|$))? - (?:^index[ ](?P<a_commit>[0-9A-Fa-f]+) - \.\.(?P<b_commit>[0-9A-Fa-f]+)[ ]?(?P<b_mode>.+)?(?:\n|$))? + (?:^index[ ](?P<a_blob>[0-9A-Fa-f]+) + \.\.(?P<b_blob>[0-9A-Fa-f]+)[ ]?(?P<b_mode>.+)?(?:\n|$))? """, re.VERBOSE | re.MULTILINE).match for diff in ('\n' + text).split('\ndiff --git')[1:]: @@ -60,10 +87,10 @@ class Diff(object): a_path, b_path, similarity_index, rename_from, rename_to, \ old_mode, new_mode, new_file_mode, deleted_file_mode, \ - a_commit, b_commit, b_mode = header.groups() + a_blob, b_blob, b_mode = header.groups() new_file, deleted_file = bool(new_file_mode), bool(deleted_file_mode) - diffs.append(Diff(repo, a_path, b_path, a_commit, b_commit, + diffs.append(Diff(repo, a_path, b_path, a_blob, b_blob, old_mode or deleted_file_mode, new_mode or new_file_mode or b_mode, new_file, deleted_file, rename_from, rename_to, diff[header.end():])) |