diff options
-rw-r--r-- | CHANGES | 7 | ||||
-rw-r--r-- | lib/git/base.py | 18 | ||||
-rw-r--r-- | lib/git/commit.py | 12 | ||||
-rw-r--r-- | lib/git/diff.py | 4 | ||||
-rw-r--r-- | test/git/test_commit.py | 74 | ||||
-rw-r--r-- | test/git/test_repo.py | 2 | ||||
-rw-r--r-- | test/git/test_tree.py | 4 | ||||
-rw-r--r-- | test/testlib/asserts.py | 16 |
8 files changed, 94 insertions, 43 deletions
@@ -7,7 +7,12 @@ CHANGES ( Future Release ) General ------- -* See changes in Diff class as your client code needs adjustments to work with it +* file mode in Tree, Blob and Diff objects now is an int compatible to definintiions + in the stat module, allowing you to query whether individual user, group and other + read, write and execute bits are set. +* Adjusted class hierarchy to generally allow comparison and hash for Objects and Refs +* Improved Tag object which now is a Ref that may contain a tag object with additional + Information Diff ---- diff --git a/lib/git/base.py b/lib/git/base.py index b7976dab..4e5298e4 100644 --- a/lib/git/base.py +++ b/lib/git/base.py @@ -171,9 +171,27 @@ class IndexObject(Object): file.ext or folder/other.ext """ super(IndexObject, self).__init__(repo, id) + if isinstance(mode, basestring): + mode = self._mode_str_to_int(mode) self.mode = mode self.path = path + @classmethod + def _mode_str_to_int( cls, modestr ): + """ + ``modestr`` + string like 755 or 644 or 100644 - only the last 3 chars will be used + + Returns + String identifying a mode compatible to the mode methods ids of the + stat module regarding the rwx permissions for user, group and other + """ + mode = 0 + for iteration,char in enumerate(reversed(modestr[-3:])): + mode += int(char) << iteration*3 + # END for each char + return mode + @property def basename(self): """ diff --git a/lib/git/commit.py b/lib/git/commit.py index 9bf753e0..68415be5 100644 --- a/lib/git/commit.py +++ b/lib/git/commit.py @@ -39,11 +39,11 @@ class Commit(base.Object): ``id`` is the sha id of the commit - ``parents`` : list( Commit, ... ) - is a list of commit ids or actual Commits + ``parents`` : tuple( Commit, ... ) + is a tuple of commit ids or actual Commits ``tree`` : Tree - is the corresponding tree id + is the corresponding tree id or an actual Tree ``author`` : Actor is the author string ( will be implicitly converted into an Actor object ) @@ -179,11 +179,11 @@ class Commit(base.Object): # free line lines.pop(0) - messages = [] + message_lines = [] while lines and not lines[0].startswith('commit'): - messages.append(lines.pop(0).strip()) + message_lines.append(lines.pop(0).strip()) # END while there are message lines - message = '\n'.join(messages) + message = '\n'.join(message_lines[:-1]) # last line is empty commits.append(Commit(repo, id=id, parents=parents, tree=tree, author=author, authored_date=authored_date, committer=committer, committed_date=committed_date, message=message)) diff --git a/lib/git/diff.py b/lib/git/diff.py index 7200b7e3..943fb08a 100644 --- a/lib/git/diff.py +++ b/lib/git/diff.py @@ -62,6 +62,10 @@ class Diff(object): self.a_mode = a_mode self.b_mode = b_mode + if self.a_mode: + self.a_mode = blob.Blob._mode_str_to_int( self.a_mode ) + if self.b_mode: + self.b_mode = blob.Blob._mode_str_to_int( self.b_mode ) self.new_file = new_file self.deleted_file = deleted_file self.rename_from = rename_from diff --git a/test/git/test_commit.py b/test/git/test_commit.py index 79768c3f..ab1801ee 100644 --- a/test/git/test_commit.py +++ b/test/git/test_commit.py @@ -36,21 +36,25 @@ class TestCommit(object): diffs = Commit.diff(self.repo, 'master') assert_equal(15, len(diffs)) + + diff = diffs[0] + assert_equal('.gitignore', diff.a_blob.path) + assert_equal('.gitignore', diff.b_blob.path) + assert_equal('4ebc8aea50e0a67e000ba29a30809d0a7b9b2666', diff.a_blob.id) + assert_equal('2dd02534615434d88c51307beb0f0092f21fd103', diff.b_blob.id) + + assert_mode_644(diff.b_blob.mode) + + assert_equal(False, diff.new_file) + assert_equal(False, diff.deleted_file) + assert_equal("--- a/.gitignore\n+++ b/.gitignore\n@@ -1 +1,2 @@\n coverage\n+pkg", diff.diff) - assert_equal('.gitignore', diffs[0].a_blob.path) - assert_equal('.gitignore', diffs[0].b_blob.path) - assert_equal('4ebc8aea50e0a67e000ba29a30809d0a7b9b2666', diffs[0].a_blob.id) - assert_equal('2dd02534615434d88c51307beb0f0092f21fd103', diffs[0].b_blob.id) - assert_equal('100644', diffs[0].b_blob.mode) - assert_equal(False, diffs[0].new_file) - assert_equal(False, diffs[0].deleted_file) - assert_equal("--- a/.gitignore\n+++ b/.gitignore\n@@ -1 +1,2 @@\n coverage\n+pkg", diffs[0].diff) - - assert_equal('lib/grit/actor.rb', diffs[5].b_blob.path) - assert_equal(None, diffs[5].a_blob) - assert_equal('f733bce6b57c0e5e353206e692b0e3105c2527f4', diffs[5].b_blob.id) - assert_equal( None, diffs[5].a_mode ) - assert_equal(True, diffs[5].new_file) + diff = diffs[5] + assert_equal('lib/grit/actor.rb', diff.b_blob.path) + assert_equal(None, diff.a_blob) + assert_equal('f733bce6b57c0e5e353206e692b0e3105c2527f4', diff.b_blob.id) + assert_equal( None, diff.a_mode ) + assert_equal(True, diff.new_file) assert_true(git.called) assert_equal(git.call_args, (('diff', '-M', 'master'), {'full_index': True})) @@ -115,19 +119,21 @@ class TestCommit(object): assert_equal(15, len(diffs)) - assert_equal('.gitignore', diffs[0].a_blob.path) - assert_equal('.gitignore', diffs[0].b_blob.path) - assert_equal('4ebc8aea50e0a67e000ba29a30809d0a7b9b2666', diffs[0].a_blob.id) - assert_equal('2dd02534615434d88c51307beb0f0092f21fd103', diffs[0].b_blob.id) - assert_equal('100644', diffs[0].b_blob.mode) - assert_equal(False, diffs[0].new_file) - assert_equal(False, diffs[0].deleted_file) - assert_equal("--- a/.gitignore\n+++ b/.gitignore\n@@ -1 +1,2 @@\n coverage\n+pkg", diffs[0].diff) - - assert_equal('lib/grit/actor.rb', diffs[5].b_blob.path) - assert_equal(None, diffs[5].a_blob) - assert_equal('f733bce6b57c0e5e353206e692b0e3105c2527f4', diffs[5].b_blob.id) - assert_equal(True, diffs[5].new_file) + diff = diffs[0] + assert_equal('.gitignore', diff.a_blob.path) + assert_equal('.gitignore', diff.b_blob.path) + assert_equal('4ebc8aea50e0a67e000ba29a30809d0a7b9b2666', diff.a_blob.id) + assert_equal('2dd02534615434d88c51307beb0f0092f21fd103', diff.b_blob.id) + assert_mode_644(diff.b_blob.mode) + assert_equal(False, diff.new_file) + assert_equal(False, diff.deleted_file) + assert_equal("--- a/.gitignore\n+++ b/.gitignore\n@@ -1 +1,2 @@\n coverage\n+pkg", diff.diff) + + diff = diffs[5] + assert_equal('lib/grit/actor.rb', diff.b_blob.path) + assert_equal(None, diff.a_blob) + assert_equal('f733bce6b57c0e5e353206e692b0e3105c2527f4', diff.b_blob.id) + assert_equal(True, diff.new_file) assert_true(git.called) assert_equal(git.call_args, (('diff', '-M', @@ -141,8 +147,14 @@ class TestCommit(object): for diff in commit.diffs: assert isinstance(diff, Diff) assert isinstance(diff.a_blob, Blob) or isinstance(diff.b_blob, Blob) - assert isinstance(diff.a_mode, int) and isinstance(diff.b_mode, int) - assert diff.diff + + if diff.a_mode is not None: + assert isinstance(diff.a_mode, int) + if diff.b_mode is not None: + isinstance(diff.b_mode, int) + + assert diff.diff is not None # can be empty + if diff.renamed: assert diff.rename_from and diff.rename_to and diff.rename_from != diff.rename_to if diff.a_blob is None: @@ -171,8 +183,8 @@ class TestCommit(object): assert_equal(1, len(diffs)) assert_equal(None, diffs[0].a_blob) assert_equal(None, diffs[0].b_blob) - assert_equal('100644', diffs[0].a_mode) - assert_equal('100755', diffs[0].b_mode) + assert_mode_644(diffs[0].a_mode) + assert_mode_755(diffs[0].b_mode) def test_stats(self): commit = Commit(self.repo, id='33ebe7acec14b25c5f84f35a664803fcab2f7781') diff --git a/test/git/test_repo.py b/test/git/test_repo.py index d4316981..aec85506 100644 --- a/test/git/test_repo.py +++ b/test/git/test_repo.py @@ -58,7 +58,7 @@ class TestRepo(object): assert_equal("implement Grit#heads", c.message) c = commits[1] - assert_equal([], c.parents) + assert_equal((,), c.parents) c = commits[2] assert_equal(["6e64c55896aabb9a7d8e9f8f296f426d21a78c2c", "7f874954efb9ba35210445be456c74e037ba6af2"], map(lambda p: p.id, c.parents)) diff --git a/test/git/test_tree.py b/test/git/test_tree.py index 205fbf1a..50d34006 100644 --- a/test/git/test_tree.py +++ b/test/git/test_tree.py @@ -31,7 +31,7 @@ class TestTree(object): assert_equal(Tree, tree.__class__) assert_equal("650fa3f0c17f1edb4ae53d8dcca4ac59d86e6c44", tree.id) - assert_equal("040000", tree.mode) + assert_equal(0,tree.mode) # git tree objects always use this mode assert_equal("test", tree.path) def test_content_from_string_tree_should_return_blob(self): @@ -41,7 +41,7 @@ class TestTree(object): assert_equal(Blob, tree.__class__) assert_equal("aa94e396335d2957ca92606f909e53e7beaf3fbb", tree.id) - assert_equal("100644", tree.mode) + assert_mode_644(tree.mode) assert_equal("grit.rb", tree.path) def test_content_from_string_tree_should_return_commit(self): diff --git a/test/testlib/asserts.py b/test/testlib/asserts.py index 345f74ec..46fcf20e 100644 --- a/test/testlib/asserts.py +++ b/test/testlib/asserts.py @@ -8,10 +8,12 @@ import re import unittest from nose import tools from nose.tools import * +import stat __all__ = ['assert_instance_of', 'assert_not_instance_of', 'assert_none', 'assert_not_none', - 'assert_match', 'assert_not_match'] + tools.__all__ + 'assert_match', 'assert_not_match', 'assert_mode_644', + 'assert_mode_755'] + tools.__all__ def assert_instance_of(expected, actual, msg=None): """Verify that object is an instance of expected """ @@ -35,4 +37,14 @@ def assert_match(pattern, string, msg=None): def assert_not_match(pattern, string, msg=None): """verify that the pattern does not match the string""" - assert_none(re.search(pattern, string), msg)
\ No newline at end of file + assert_none(re.search(pattern, string), msg) + +def assert_mode_644(mode): + """Verify given mode is 644""" + assert (mode & stat.S_IROTH) and (mode & stat.S_IRGRP) + assert (mode & stat.S_IWUSR) and (mode & stat.S_IRUSR) and not (mode & stat.S_IXUSR) + +def assert_mode_755(mode): + """Verify given mode is 755""" + assert (mode & stat.S_IROTH) and (mode & stat.S_IRGRP) and (mode & stat.S_IXOTH) and (mode & stat.S_IXGRP) + assert (mode & stat.S_IWUSR) and (mode & stat.S_IRUSR) and (mode & stat.S_IXUSR)
\ No newline at end of file |