diff --git a/pygit2.c b/pygit2.c index 42e0dde..8ad9d99 100644 --- a/pygit2.c +++ b/pygit2.c @@ -1436,6 +1436,34 @@ Index_setitem(Index *self, PyObject *key, PyObject *value) { return 0; } +static PyObject * +Index_create_tree(Index *self) { + git_oid oid; + int err; + Tree *py_tree; + git_tree *tree; + + err = git_tree_create_fromindex(&oid, self->index); + if (err < 0) { + return Error_set(err); + } + + err = git_tree_lookup(&tree, self->repo->repo, &oid); + if (err < 0) { + return Error_set(err); + } + + py_tree = PyObject_New(Tree, &TreeType); + if (!py_tree) + return NULL; + + Py_INCREF(self->repo); + py_tree->repo = self->repo; + py_tree->tree = (git_tree*)tree; + + return (PyObject*)py_tree; +} + static PyMethodDef Index_methods[] = { {"add", (PyCFunction)Index_add, METH_VARARGS, "Add or update an index entry from a file in disk."}, @@ -1450,6 +1478,8 @@ static PyMethodDef Index_methods[] = { {"write", (PyCFunction)Index_write, METH_NOARGS, "Write an existing index object from memory back to disk using an" " atomic file lock."}, + {"create_tree", (PyCFunction)Index_create_tree, METH_NOARGS, + "Create a tree from the index entries"}, {NULL} }; diff --git a/test/test_index.py b/test/test_index.py index 38c8b17..b2db4e1 100644 --- a/test/test_index.py +++ b/test/test_index.py @@ -88,6 +88,13 @@ class IndexTest(utils.RepoTestCase): index.read() self.assertTrue('bye.txt' in index) + def test_create_tree(self): + sha = 'fd937514cb799514d4b81bb24c5fcfeb6472b245' + index = self.repo.index + index.read() + tree = index.create_tree() + self.assertEqual(sha, tree.sha) + if __name__ == '__main__': unittest.main()