From 49a9f84461fa907da786e91e1a8c29d38cdb70eb Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Sun, 17 Jul 2016 10:04:16 +0200 Subject: chore(version-up): v2.0.7 --- git/ext/gitdb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'git') diff --git a/git/ext/gitdb b/git/ext/gitdb index d1996e04..2389b752 160000 --- a/git/ext/gitdb +++ b/git/ext/gitdb @@ -1 +1 @@ -Subproject commit d1996e04dbf4841b853b60c1365f0f5fd28d170c +Subproject commit 2389b75280efb1a63e6ea578eae7f897fd4beb1b -- cgit v1.2.1 From 2ff3a3e72b1ff79e75777ccdddc86f8540ce833d Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Sun, 17 Jul 2016 10:31:53 +0200 Subject: fix(blame): lazily fetch full commit message That way, we will not only get the summary line contained in the blame, but fetch the full message. This is more costly than the previous implementation allowed it to be, but being less surprising/correct certainly is the preferred behaviour here. Fixes #485 --- git/repo/base.py | 6 ++---- git/test/test_repo.py | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) (limited to 'git') diff --git a/git/repo/base.py b/git/repo/base.py index 282dfc15..61864060 100644 --- a/git/repo/base.py +++ b/git/repo/base.py @@ -714,8 +714,7 @@ class Repo(object): authored_date=int(props[b'author-time']), committer=Actor(safe_decode(props[b'committer']), safe_decode(props[b'committer-mail'].lstrip(b'<').rstrip(b'>'))), - committed_date=int(props[b'committer-time']), - message=safe_decode(props[b'summary'])) + committed_date=int(props[b'committer-time'])) commits[hexsha] = c else: # Discard the next line (it's a filename end tag) @@ -815,8 +814,7 @@ class Repo(object): authored_date=info['author_date'], committer=Actor._from_string( info['committer'] + ' ' + info['committer_email']), - committed_date=info['committer_date'], - message=info['summary']) + committed_date=info['committer_date']) commits[sha] = c # END if commit objects needs initial creation if not is_binary: diff --git a/git/test/test_repo.py b/git/test/test_repo.py index fc8125fa..87887bad 100644 --- a/git/test/test_repo.py +++ b/git/test/test_repo.py @@ -307,7 +307,7 @@ class TestRepo(TestBase): assert_equal('Tom Preston-Werner', c.committer.name) assert_equal('tom@mojombo.com', c.committer.email) assert_equal(1191997100, c.committed_date) - assert_equal('initial grit setup', c.message) + self.assertRaisesRegexp(ValueError, "634396b2f541a9f2d58b00be1a07f0c358b999b3 missing", lambda: c.message) # test the 'lines per commit' entries tlist = b[0][1] -- cgit v1.2.1 From cee0cec2d4a27bbc7af10b91a1ad39d735558798 Mon Sep 17 00:00:00 2001 From: Bert Wesarg Date: Tue, 19 Jul 2016 08:38:02 +0200 Subject: Add missing newline when writing a symbolic ref. --- git/refs/symbolic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'git') diff --git a/git/refs/symbolic.py b/git/refs/symbolic.py index ae67a7ee..d00ef617 100644 --- a/git/refs/symbolic.py +++ b/git/refs/symbolic.py @@ -313,7 +313,7 @@ class SymbolicReference(object): lfd = LockedFD(fpath) fd = lfd.open(write=True, stream=True) - fd.write(write_value.encode('ascii')) + fd.write(write_value.encode('ascii') + '\n') lfd.commit() # Adjust the reflog -- cgit v1.2.1 From b827f8162f61285754202bec8494192bc229f75a Mon Sep 17 00:00:00 2001 From: Bert Wesarg Date: Tue, 19 Jul 2016 09:17:51 +0200 Subject: Use binary string constant for concatenation. --- git/refs/symbolic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'git') diff --git a/git/refs/symbolic.py b/git/refs/symbolic.py index d00ef617..ec2944c6 100644 --- a/git/refs/symbolic.py +++ b/git/refs/symbolic.py @@ -313,7 +313,7 @@ class SymbolicReference(object): lfd = LockedFD(fpath) fd = lfd.open(write=True, stream=True) - fd.write(write_value.encode('ascii') + '\n') + fd.write(write_value.encode('ascii') + b'\n') lfd.commit() # Adjust the reflog -- cgit v1.2.1 From 4006c4347788a078051dffd6b197bb0f19d50b86 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Sat, 23 Jul 2016 16:38:59 +0200 Subject: fix(diff): use explicit change-type if possible That way, we do not have to figure the change type out by examining the diff object. It's implemented in a way that should yield more desireable results as we keep the change-type that git is providing us with. Fixes #493 --- git/diff.py | 14 +++++++++----- git/test/fixtures/diff_abbrev-40_full-index_M_raw_no-color | 1 + git/test/test_diff.py | 9 +++++++++ 3 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 git/test/fixtures/diff_abbrev-40_full-index_M_raw_no-color (limited to 'git') diff --git a/git/diff.py b/git/diff.py index 06193920..fb8faaf6 100644 --- a/git/diff.py +++ b/git/diff.py @@ -183,7 +183,9 @@ class DiffIndex(list): raise ValueError("Invalid change type: %s" % change_type) for diff in self: - if change_type == "A" and diff.new_file: + if diff.change_type == change_type: + yield diff + elif change_type == "A" and diff.new_file: yield diff elif change_type == "D" and diff.deleted_file: yield diff @@ -247,11 +249,12 @@ class Diff(object): NULL_BIN_SHA = b"\0" * 20 __slots__ = ("a_blob", "b_blob", "a_mode", "b_mode", "a_rawpath", "b_rawpath", - "new_file", "deleted_file", "raw_rename_from", "raw_rename_to", "diff") + "new_file", "deleted_file", "raw_rename_from", "raw_rename_to", + "diff", "change_type") def __init__(self, repo, a_rawpath, b_rawpath, a_blob_id, b_blob_id, a_mode, b_mode, new_file, deleted_file, raw_rename_from, - raw_rename_to, diff): + raw_rename_to, diff, change_type): self.a_mode = a_mode self.b_mode = b_mode @@ -286,6 +289,7 @@ class Diff(object): self.raw_rename_to = raw_rename_to or None self.diff = diff + self.change_type = change_type def __eq__(self, other): for name in self.__slots__: @@ -435,7 +439,7 @@ class Diff(object): new_file, deleted_file, rename_from, rename_to, - None)) + None, None)) previous_header = header # end for each header we parse @@ -483,7 +487,7 @@ class Diff(object): # END add/remove handling diff = Diff(repo, a_path, b_path, a_blob_id, b_blob_id, old_mode, new_mode, - new_file, deleted_file, rename_from, rename_to, '') + new_file, deleted_file, rename_from, rename_to, '', change_type) index.append(diff) # END for each line diff --git a/git/test/fixtures/diff_abbrev-40_full-index_M_raw_no-color b/git/test/fixtures/diff_abbrev-40_full-index_M_raw_no-color new file mode 100644 index 00000000..dad85c68 --- /dev/null +++ b/git/test/fixtures/diff_abbrev-40_full-index_M_raw_no-color @@ -0,0 +1 @@ +:100644 100644 739bc65220ad90e9ebfa2d6af1723b97555569a4 0000000000000000000000000000000000000000 M README.md diff --git a/git/test/test_diff.py b/git/test/test_diff.py index ba0d2d13..9fdb26a2 100644 --- a/git/test/test_diff.py +++ b/git/test/test_diff.py @@ -104,6 +104,15 @@ class TestDiff(TestBase): assert diff.rename_to == 'that' assert len(list(diffs.iter_change_type('R'))) == 1 + def test_diff_of_modified_files_not_added_to_the_index(self): + output = StringProcessAdapter(fixture('diff_abbrev-40_full-index_M_raw_no-color')) + diffs = Diff._index_from_raw_format(self.rorepo, output.stdout) + + assert len(diffs) == 1, 'one modification' + assert len(list(diffs.iter_change_type('M'))) == 1, 'one modification' + assert diffs[0].change_type == 'M' + assert diffs[0].b_blob is None + def test_binary_diff(self): for method, file_name in ((Diff._index_from_patch_format, 'diff_patch_binary'), (Diff._index_from_raw_format, 'diff_raw_binary')): -- cgit v1.2.1