summaryrefslogtreecommitdiff
path: root/git/test/test_repo.py
diff options
context:
space:
mode:
authorVincent Driessen <me@nvie.com>2016-04-13 14:52:18 +0200
committerVincent Driessen <me@nvie.com>2016-04-13 16:44:17 +0200
commite5b8220a1a967abdf2bae2124e3e22a9eea3729f (patch)
tree4d10bd3b123dd8321d6024665e323c00fa86b011 /git/test/test_repo.py
parent9debf6b0aafb6f7781ea9d1383c86939a1aacde3 (diff)
downloadgitpython-e5b8220a1a967abdf2bae2124e3e22a9eea3729f.tar.gz
Add incremental blame support
This adds a sibling method to Repo's blame method: Repo.blame_incremental(rev, path, **kwargs) This can alternatively be called using: Repo.blame(rev, path, incremental=True) The main difference is that blame incremental is a bit more efficient and does not return the full file's contents, just the commits and the line number ranges. The parser is a bit more straight-forward and faster since the incremental output format is defined a little stricter.
Diffstat (limited to 'git/test/test_repo.py')
-rw-r--r--git/test/test_repo.py24
1 files changed, 24 insertions, 0 deletions
diff --git a/git/test/test_repo.py b/git/test/test_repo.py
index 177aa176..ab6c502f 100644
--- a/git/test/test_repo.py
+++ b/git/test/test_repo.py
@@ -50,6 +50,16 @@ from io import BytesIO
from nose import SkipTest
+def iter_flatten(lol):
+ for items in lol:
+ for item in items:
+ yield item
+
+
+def flatten(lol):
+ return list(iter_flatten(lol))
+
+
class TestRepo(TestBase):
@raises(InvalidGitRepositoryError)
@@ -324,6 +334,20 @@ class TestRepo(TestBase):
assert nml, "There should at least be one blame commit that contains multiple lines"
@patch.object(Git, '_call_process')
+ def test_blame_incremental(self, git):
+ git.return_value = fixture('blame_incremental')
+ blame_output = self.rorepo.blame_incremental('9debf6b0aafb6f7781ea9d1383c86939a1aacde3', 'AUTHORS')
+ blame_output = list(blame_output)
+ assert len(blame_output) == 5
+
+ # Check all outputted line numbers
+ ranges = flatten([line_numbers for _, line_numbers in blame_output])
+ assert ranges == flatten([range(2, 3), range(14, 15), range(1, 2), range(3, 14), range(15, 17)]), str(ranges)
+
+ commits = [c.hexsha[:7] for c, _ in blame_output]
+ assert commits == ['82b8902', '82b8902', 'c76852d', 'c76852d', 'c76852d'], str(commits)
+
+ @patch.object(Git, '_call_process')
def test_blame_complex_revision(self, git):
git.return_value = fixture('blame_complex_revision')
res = self.rorepo.blame("HEAD~10..HEAD", "README.md")