index: replace has_conflicts by conflicts returning None
This commit is contained in:
@@ -99,7 +99,7 @@ Changelog
|
||||
- New ``Repository.state_cleanup()``
|
||||
`#386 <https://github.com/libgit2/pygit2/pull/386>`_
|
||||
|
||||
- New ``Index.has_conflicts`` and ``Index.conflicts`` #345
|
||||
- New ```Index.conflicts``
|
||||
`#345 <https://github.com/libgit2/pygit2/issues/345>`_
|
||||
`#389 <https://github.com/libgit2/pygit2/pull/389>`_
|
||||
|
||||
|
@@ -203,12 +203,6 @@ class Index(object):
|
||||
|
||||
check_error(err, True)
|
||||
|
||||
@property
|
||||
def has_conflicts(self):
|
||||
"""Whether this Index contains conflict information
|
||||
"""
|
||||
return C.git_index_has_conflicts(self._index) != 0
|
||||
|
||||
def diff_to_workdir(self, flags=0, context_lines=3, interhunk_lines=0):
|
||||
"""diff_to_workdir(flags=0, context_lines=3, interhunk_lines=0) -> Diff
|
||||
|
||||
@@ -290,11 +284,20 @@ class Index(object):
|
||||
|
||||
return Diff.from_c(bytes(ffi.buffer(cdiff)[:]), self._repo)
|
||||
|
||||
|
||||
#
|
||||
# Conflicts
|
||||
#
|
||||
_conflicts = None
|
||||
|
||||
@property
|
||||
def conflicts(self):
|
||||
"""A collection of conflict information
|
||||
|
||||
This presents a mapping interface with the paths as keys. You
|
||||
If there are no conflicts None is returned. Otherwise return an object
|
||||
that represents the conflicts in the index.
|
||||
|
||||
This object presents a mapping interface with the paths as keys. You
|
||||
can use the ``del`` operator to remove a conflict form the Index.
|
||||
|
||||
Each conflict is made up of three elements. Access or iteration
|
||||
@@ -306,7 +309,11 @@ class Index(object):
|
||||
These elements may be None depending on which sides exist for
|
||||
the particular conflict.
|
||||
"""
|
||||
if not hasattr(self, '_conflicts'):
|
||||
if not C.git_index_has_conflicts(self._index):
|
||||
self._conflicts = None
|
||||
return None
|
||||
|
||||
if self._conflicts is None:
|
||||
self._conflicts = ConflictCollection(self)
|
||||
|
||||
return self._conflicts
|
||||
|
@@ -81,7 +81,7 @@ class MergeTestBasic(utils.RepoTestCaseForMerging):
|
||||
self.assertFalse(analysis & GIT_MERGE_ANALYSIS_FASTFORWARD)
|
||||
|
||||
self.repo.merge(branch_id)
|
||||
self.assertTrue(self.repo.index.has_conflicts)
|
||||
self.assertTrue(self.repo.index.conflicts is not None)
|
||||
status = pygit2.GIT_STATUS_WT_NEW | pygit2.GIT_STATUS_INDEX_DELETED
|
||||
# Asking twice to assure the reference counting is correct
|
||||
self.assertEqual({'.gitignore': status}, self.repo.status())
|
||||
@@ -114,7 +114,7 @@ class MergeTestWithConflicts(utils.RepoTestCaseForMerging):
|
||||
self.assertFalse(analysis & GIT_MERGE_ANALYSIS_FASTFORWARD)
|
||||
|
||||
self.repo.merge(branch_id)
|
||||
self.assertTrue(self.repo.index.has_conflicts)
|
||||
self.assertTrue(self.repo.index.conflicts is not None)
|
||||
self.assertRaises(KeyError, self.repo.index.conflicts.__getitem__, 'some-file')
|
||||
ancestor, ours, theirs = self.repo.index.conflicts['.gitignore']
|
||||
self.assertEqual(None, ancestor)
|
||||
@@ -126,13 +126,18 @@ class MergeTestWithConflicts(utils.RepoTestCaseForMerging):
|
||||
# Checking the index works as expected
|
||||
self.repo.index.add('.gitignore')
|
||||
self.repo.index.write()
|
||||
self.assertRaises(KeyError, self.repo.index.conflicts.__getitem__, '.gitignore')
|
||||
self.assertTrue(self.repo.index.conflicts is None)
|
||||
|
||||
def test_merge_remove_conflicts(self):
|
||||
other_branch_tip = '1b2bae55ac95a4be3f8983b86cd579226d0eb247'
|
||||
self.repo.merge(other_branch_tip)
|
||||
idx = self.repo.index
|
||||
self.assertTrue(idx.has_conflicts)
|
||||
self.assertRaises(KeyError, idx.conflicts.__delitem__, 'some-file')
|
||||
conflicts = idx.conflicts
|
||||
self.assertTrue(conflicts is not None)
|
||||
try:
|
||||
conflicts['.gitignore']
|
||||
except KeyError:
|
||||
self.fail("conflicts['.gitignore'] raised KeyError unexpectedly")
|
||||
del idx.conflicts['.gitignore']
|
||||
self.assertFalse(idx.has_conflicts)
|
||||
self.assertRaises(KeyError, conflicts.__getitem__, '.gitignore')
|
||||
self.assertTrue(idx.conflicts is None)
|
||||
|
Reference in New Issue
Block a user