diff --git a/docs/repository.rst b/docs/repository.rst index 08ab3dd..e04ca2d 100644 --- a/docs/repository.rst +++ b/docs/repository.rst @@ -41,3 +41,4 @@ To open an existing repository:: .. autoattribute:: pygit2.Repository.is_empty .. automethod:: pygit2.Repository.read .. automethod:: pygit2.Repository.write +.. automethod:: pygit2.Repository.merge_base diff --git a/src/repository.c b/src/repository.c index 39ec15a..c5acb8d 100644 --- a/src/repository.c +++ b/src/repository.c @@ -497,6 +497,38 @@ Repository_config__get__(Repository *self) return self->config; } +PyDoc_STRVAR(Repository_merge_base__doc__, + "merge_base(oid, oid) -> commit\n" + "\n" + "Find as good common ancestors as possible for a merge."); + +PyObject * +Repository_merge_base(Repository *self, PyObject *args) +{ + PyObject *value1; + PyObject *value2; + git_oid oid; + git_oid oid1; + git_oid oid2; + int err; + + if (!PyArg_ParseTuple(args, "OO", &value1, &value2)) + return NULL; + + err = py_str_to_git_oid_expand(self->repo, value1, &oid1); + if (err < 0) + return NULL; + + err = py_str_to_git_oid_expand(self->repo, value2, &oid2); + if (err < 0) + return NULL; + + err = git_merge_base(&oid, self->repo, &oid1, &oid2); + if (err < 0) + return Error_set(err); + + return git_oid_to_python(&oid); +} PyDoc_STRVAR(Repository_walk__doc__, "walk(oid, sort_mode) -> iterator\n" @@ -1212,6 +1244,7 @@ PyMethodDef Repository_methods[] = { METHOD(Repository, create_tag, METH_VARARGS), METHOD(Repository, TreeBuilder, METH_VARARGS), METHOD(Repository, walk, METH_VARARGS), + METHOD(Repository, merge_base, METH_VARARGS), METHOD(Repository, read, METH_O), METHOD(Repository, write, METH_VARARGS), METHOD(Repository, create_reference_direct, METH_VARARGS), diff --git a/test/test_repository.py b/test/test_repository.py index f16888c..93c4cc7 100644 --- a/test/test_repository.py +++ b/test/test_repository.py @@ -231,6 +231,10 @@ class RepositoryTest_II(utils.RepoTestCase): self.repo.checkout(pygit2.GIT_CHECKOUT_FORCE, head=True) self.assertTrue('bye.txt' not in self.repo.status()) + def test_merge_base(self): + commit = self.repo.merge_base('5ebeeebb320790caf276b9fc8b24546d63316533', '4ec4389a8068641da2d6578db0419484972284c8') + self.assertEqual(commit.hex, 'acecd5ea2924a4b900e7e149496e1f4b57976e51') + class NewRepositoryTest(utils.NoRepoTestCase):