implementing merge: merge.rst doc and implementing MergeResult as a simple type that maps git_merge_result to it
This commit is contained in:
@@ -2,4 +2,37 @@
|
|||||||
Merge
|
Merge
|
||||||
**********************************************************************
|
**********************************************************************
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
|
||||||
.. automethod:: pygit2.Repository.merge_base
|
.. automethod:: pygit2.Repository.merge_base
|
||||||
|
.. automethod:: pygit2.Repository.merge
|
||||||
|
|
||||||
|
The merge method
|
||||||
|
=================
|
||||||
|
|
||||||
|
The method does a merge over the current working copy.
|
||||||
|
It gets an Oid object as a parameter and returns a MergeResult object.
|
||||||
|
|
||||||
|
As its name says, it only does the merge, does not commit nor update the
|
||||||
|
branch reference in the case of a fastforward.
|
||||||
|
|
||||||
|
For the moment, the merge does not support options, it will perform the
|
||||||
|
merge with the default ones defined in GIT_MERGE_OPTS_INIT libgit2 constant.
|
||||||
|
|
||||||
|
Example::
|
||||||
|
|
||||||
|
>>> branch_head_hex = '5ebeeebb320790caf276b9fc8b24546d63316533'
|
||||||
|
>>> branch_oid = self.repo.get(branch_head_hex).oid
|
||||||
|
>>> merge_result = self.repo.merge(branch_oid)
|
||||||
|
|
||||||
|
The MergeResult object
|
||||||
|
======================
|
||||||
|
|
||||||
|
Represents the result of a merge and contains this fields:
|
||||||
|
|
||||||
|
- is_uptodate: bool, if there wasn't any merge because the repo was already
|
||||||
|
up to date
|
||||||
|
- is_fastforward: bool, whether the merge was fastforward or not
|
||||||
|
- fastforward_oid: Oid, in the case it was a fastforward, this is the
|
||||||
|
forwarded Oid.
|
||||||
|
- index: represents the repository index after the merge
|
||||||
|
@@ -39,26 +39,14 @@ extern PyTypeObject IndexType;
|
|||||||
PyObject *
|
PyObject *
|
||||||
git_merge_result_to_python(git_merge_result *merge_result, Repository *repo)
|
git_merge_result_to_python(git_merge_result *merge_result, Repository *repo)
|
||||||
{
|
{
|
||||||
git_oid fastforward_oid;
|
|
||||||
MergeResult *py_merge_result;
|
MergeResult *py_merge_result;
|
||||||
|
|
||||||
py_merge_result = PyObject_New(MergeResult, &MergeResultType);
|
py_merge_result = PyObject_New(MergeResult, &MergeResultType);
|
||||||
|
if (!py_merge_result)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
py_merge_result->is_uptodate = git_merge_result_is_uptodate(merge_result) == GIT_CVAR_TRUE;
|
py_merge_result->result = merge_result;
|
||||||
|
py_merge_result->repo = repo;
|
||||||
if (git_merge_result_is_fastforward(merge_result) == GIT_CVAR_TRUE)
|
|
||||||
{
|
|
||||||
py_merge_result->is_fastforward = GIT_CVAR_TRUE;
|
|
||||||
git_merge_result_fastforward_oid(&fastforward_oid, merge_result);
|
|
||||||
py_merge_result->fastforward_oid = git_oid_to_python((const git_oid *)&fastforward_oid);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
py_merge_result->is_fastforward = GIT_CVAR_FALSE;
|
|
||||||
py_merge_result->fastforward_oid = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
py_merge_result->status = Repository_status(repo);
|
|
||||||
|
|
||||||
return (PyObject*) py_merge_result;
|
return (PyObject*) py_merge_result;
|
||||||
}
|
}
|
||||||
@@ -68,7 +56,7 @@ PyDoc_STRVAR(MergeResult_is_uptodate__doc__, "Is up to date");
|
|||||||
PyObject *
|
PyObject *
|
||||||
MergeResult_is_uptodate__get__(MergeResult *self)
|
MergeResult_is_uptodate__get__(MergeResult *self)
|
||||||
{
|
{
|
||||||
if (self->is_uptodate)
|
if (git_merge_result_is_uptodate(self->result))
|
||||||
Py_RETURN_TRUE;
|
Py_RETURN_TRUE;
|
||||||
else
|
else
|
||||||
Py_RETURN_FALSE;
|
Py_RETURN_FALSE;
|
||||||
@@ -79,7 +67,7 @@ PyDoc_STRVAR(MergeResult_is_fastforward__doc__, "Is fastforward");
|
|||||||
PyObject *
|
PyObject *
|
||||||
MergeResult_is_fastforward__get__(MergeResult *self)
|
MergeResult_is_fastforward__get__(MergeResult *self)
|
||||||
{
|
{
|
||||||
if (self->is_fastforward)
|
if (git_merge_result_is_fastforward(self->result))
|
||||||
Py_RETURN_TRUE;
|
Py_RETURN_TRUE;
|
||||||
else
|
else
|
||||||
Py_RETURN_FALSE;
|
Py_RETURN_FALSE;
|
||||||
@@ -90,29 +78,43 @@ PyDoc_STRVAR(MergeResult_fastforward_oid__doc__, "Fastforward Oid");
|
|||||||
PyObject *
|
PyObject *
|
||||||
MergeResult_fastforward_oid__get__(MergeResult *self)
|
MergeResult_fastforward_oid__get__(MergeResult *self)
|
||||||
{
|
{
|
||||||
if (self->is_fastforward)
|
if (git_merge_result_is_fastforward(self->result)) {
|
||||||
{
|
git_oid fastforward_oid;
|
||||||
Py_INCREF(self->fastforward_oid);
|
git_merge_result_fastforward_oid(&fastforward_oid, self->result);
|
||||||
return self->fastforward_oid;
|
return git_oid_to_python((const git_oid *)&fastforward_oid);
|
||||||
}
|
}
|
||||||
else
|
else Py_RETURN_NONE;
|
||||||
Py_RETURN_NONE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PyDoc_STRVAR(MergeResult_status__doc__, "Merge repository status");
|
PyDoc_STRVAR(MergeResult_index__doc__, "Merge repository index");
|
||||||
|
|
||||||
PyObject *
|
PyObject *
|
||||||
MergeResult_status__get__(MergeResult *self)
|
MergeResult_index__get__(MergeResult *self)
|
||||||
{
|
{
|
||||||
Py_INCREF(self->status);
|
git_index *index;
|
||||||
return self->status;
|
Index *py_index;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = git_repository_index(&index, self->repo->repo);
|
||||||
|
if (err < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
py_index = PyObject_GC_New(Index, &IndexType);
|
||||||
|
if (!py_index) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
py_index->repo = self->repo;
|
||||||
|
py_index->index = index;
|
||||||
|
Py_INCREF(py_index);
|
||||||
|
return (PyObject*) py_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
PyGetSetDef MergeResult_getseters[] = {
|
PyGetSetDef MergeResult_getseters[] = {
|
||||||
GETTER(MergeResult, is_uptodate),
|
GETTER(MergeResult, is_uptodate),
|
||||||
GETTER(MergeResult, is_fastforward),
|
GETTER(MergeResult, is_fastforward),
|
||||||
GETTER(MergeResult, fastforward_oid),
|
GETTER(MergeResult, fastforward_oid),
|
||||||
GETTER(MergeResult, status),
|
GETTER(MergeResult, index),
|
||||||
{NULL},
|
{NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -621,7 +621,6 @@ Repository_merge(Repository *self, PyObject *py_oid)
|
|||||||
py_merge_result = git_merge_result_to_python(merge_result, self);
|
py_merge_result = git_merge_result_to_python(merge_result, self);
|
||||||
|
|
||||||
git_merge_head_free(oid_merge_head);
|
git_merge_head_free(oid_merge_head);
|
||||||
git_merge_result_free(merge_result);
|
|
||||||
|
|
||||||
return py_merge_result;
|
return py_merge_result;
|
||||||
|
|
||||||
|
@@ -314,7 +314,7 @@ class RepositoryTest_III(utils.RepoTestCaseForMerging):
|
|||||||
self.assertTrue(merge_result.is_uptodate)
|
self.assertTrue(merge_result.is_uptodate)
|
||||||
self.assertFalse(merge_result.is_fastforward)
|
self.assertFalse(merge_result.is_fastforward)
|
||||||
self.assertEquals(None, merge_result.fastforward_oid)
|
self.assertEquals(None, merge_result.fastforward_oid)
|
||||||
self.assertEquals({}, merge_result.status)
|
self.assertEquals({}, self.repo.status())
|
||||||
|
|
||||||
def test_merge_fastforward(self):
|
def test_merge_fastforward(self):
|
||||||
branch_head_hex = 'e97b4cfd5db0fb4ebabf4f203979ca4e5d1c7c87'
|
branch_head_hex = 'e97b4cfd5db0fb4ebabf4f203979ca4e5d1c7c87'
|
||||||
@@ -325,7 +325,7 @@ class RepositoryTest_III(utils.RepoTestCaseForMerging):
|
|||||||
# Asking twice to assure the reference counting is correct
|
# Asking twice to assure the reference counting is correct
|
||||||
self.assertEquals(branch_head_hex, merge_result.fastforward_oid.hex)
|
self.assertEquals(branch_head_hex, merge_result.fastforward_oid.hex)
|
||||||
self.assertEquals(branch_head_hex, merge_result.fastforward_oid.hex)
|
self.assertEquals(branch_head_hex, merge_result.fastforward_oid.hex)
|
||||||
self.assertEquals({}, merge_result.status)
|
self.assertEquals({}, self.repo.status())
|
||||||
|
|
||||||
def test_merge_no_fastforward_no_conflicts(self):
|
def test_merge_no_fastforward_no_conflicts(self):
|
||||||
branch_head_hex = '03490f16b15a09913edb3a067a3dc67fbb8d41f1'
|
branch_head_hex = '03490f16b15a09913edb3a067a3dc67fbb8d41f1'
|
||||||
@@ -333,10 +333,15 @@ class RepositoryTest_III(utils.RepoTestCaseForMerging):
|
|||||||
merge_result = self.repo.merge(branch_oid)
|
merge_result = self.repo.merge(branch_oid)
|
||||||
self.assertFalse(merge_result.is_uptodate)
|
self.assertFalse(merge_result.is_uptodate)
|
||||||
self.assertFalse(merge_result.is_fastforward)
|
self.assertFalse(merge_result.is_fastforward)
|
||||||
self.assertEquals(None, merge_result.fastforward_oid)
|
|
||||||
# Asking twice to assure the reference counting is correct
|
# Asking twice to assure the reference counting is correct
|
||||||
self.assertEquals({'bye.txt': 1}, merge_result.status)
|
self.assertEquals(None, merge_result.fastforward_oid)
|
||||||
self.assertEquals({'bye.txt': 1}, merge_result.status)
|
self.assertEquals(None, merge_result.fastforward_oid)
|
||||||
|
self.assertEquals({'bye.txt': 1}, self.repo.status())
|
||||||
|
self.assertEquals({'bye.txt': 1}, self.repo.status())
|
||||||
|
# Checking the index works as expected
|
||||||
|
merge_result.index.remove('bye.txt')
|
||||||
|
merge_result.index.write()
|
||||||
|
self.assertEquals({'bye.txt': 128}, self.repo.status())
|
||||||
|
|
||||||
def test_merge_no_fastforward_conflicts(self):
|
def test_merge_no_fastforward_conflicts(self):
|
||||||
branch_head_hex = '1b2bae55ac95a4be3f8983b86cd579226d0eb247'
|
branch_head_hex = '1b2bae55ac95a4be3f8983b86cd579226d0eb247'
|
||||||
@@ -344,10 +349,15 @@ class RepositoryTest_III(utils.RepoTestCaseForMerging):
|
|||||||
merge_result = self.repo.merge(branch_oid)
|
merge_result = self.repo.merge(branch_oid)
|
||||||
self.assertFalse(merge_result.is_uptodate)
|
self.assertFalse(merge_result.is_uptodate)
|
||||||
self.assertFalse(merge_result.is_fastforward)
|
self.assertFalse(merge_result.is_fastforward)
|
||||||
self.assertEquals(None, merge_result.fastforward_oid)
|
|
||||||
# Asking twice to assure the reference counting is correct
|
# Asking twice to assure the reference counting is correct
|
||||||
self.assertEquals({'.gitignore': 132}, merge_result.status)
|
self.assertEquals(None, merge_result.fastforward_oid)
|
||||||
self.assertEquals({'.gitignore': 132}, merge_result.status)
|
self.assertEquals(None, merge_result.fastforward_oid)
|
||||||
|
self.assertEquals({'.gitignore': 132}, self.repo.status())
|
||||||
|
self.assertEquals({'.gitignore': 132}, self.repo.status())
|
||||||
|
# Checking the index works as expected
|
||||||
|
merge_result.index.add('.gitignore')
|
||||||
|
merge_result.index.write()
|
||||||
|
self.assertEquals({'.gitignore': 2}, self.repo.status())
|
||||||
|
|
||||||
def test_merge_invalid_hex(self):
|
def test_merge_invalid_hex(self):
|
||||||
branch_head_hex = '12345678'
|
branch_head_hex = '12345678'
|
||||||
|
Reference in New Issue
Block a user