diff options
author | Mark Nevill <mark@nevill.ch> | 2011-07-17 21:26:27 +0200 |
---|---|---|
committer | Sebastian Thiel <byronimo@gmail.com> | 2011-07-18 17:48:23 +0200 |
commit | 6e86f8a8a0638abe2c18ae0bb36cc992b0ababe5 (patch) | |
tree | d819d26a2493eb79c426fff91a448c1186702a40 /git | |
parent | a84856911d05e9877ef46713c1d20bc02482665f (diff) | |
download | gitpython-6e86f8a8a0638abe2c18ae0bb36cc992b0ababe5.tar.gz |
Fixed consecutive lines with same blame info not appearing in blame.
This fixes a bug when parsing blame -p output: Full commit info headers
only appear for the first line from a particular commit, but other lines
were ignored as the blame info dict was reset after each line.
This patch handles both multiple consecutive lines from a commit and
interleaved lines from multiple commits.
Added real test to verify blame works against the actual commit, not
only a mock of what was produced by blame in old git releases
Diffstat (limited to 'git')
-rw-r--r-- | git/db/cmd/base.py | 7 | ||||
-rw-r--r-- | git/test/db/base.py | 9 |
2 files changed, 14 insertions, 2 deletions
diff --git a/git/db/cmd/base.py b/git/db/cmd/base.py index 6a4a6544..5fa82dc7 100644 --- a/git/db/cmd/base.py +++ b/git/db/cmd/base.py @@ -701,6 +701,9 @@ class CmdHighLevelRepository(HighLevelRepository): if len(digits) == 3: info = {'id': firstpart} blames.append([None, []]) + elif info['id'] != firstpart: + info = {'id': firstpart} + blames.append([commits.get(firstpart), []]) # END blame data initialization else: m = self.re_author_committer_start.search(firstpart) @@ -747,8 +750,8 @@ class CmdHighLevelRepository(HighLevelRepository): m = self.re_tab_full_line.search(line) text, = m.groups() blames[-1][0] = c - blames[-1][1].append( text ) - info = None + blames[-1][1].append(text) + info = { 'id' : sha } # END if we collected commit info # END distinguish filename,summary,rest # END distinguish author|committer vs filename,summary,rest diff --git a/git/test/db/base.py b/git/test/db/base.py index 2f8f50e2..0f5eebe4 100644 --- a/git/test/db/base.py +++ b/git/test/db/base.py @@ -283,6 +283,15 @@ class RepoBase(TestDBBase): assert_true( isinstance( tlist[0], basestring ) ) assert_true( len( tlist ) < sum( len(t) for t in tlist ) ) # test for single-char bug + def test_blame_real(self): + c = 0 + for item in self.rorepo.head.commit.tree.traverse( + predicate=lambda i, d: i.type == 'blob' and i.path.endswith('.py')): + c += 1 + b = self.rorepo.blame(self.rorepo.head, item.path) + #END for each item to traverse + assert c + def test_untracked_files(self): base = self.rorepo.working_tree_dir files = ( join_path_native(base, "__test_myfile"), |