diff --git a/src/repository.c b/src/repository.c index d4bebdf..538e0ce 100644 --- a/src/repository.c +++ b/src/repository.c @@ -45,6 +45,7 @@ extern PyTypeObject IndexType; extern PyTypeObject WalkerType; extern PyTypeObject SignatureType; extern PyTypeObject ObjectType; +extern PyTypeObject CommitType; extern PyTypeObject TreeType; extern PyTypeObject TreeBuilderType; extern PyTypeObject ConfigType; @@ -842,6 +843,39 @@ Repository_create_tag(Repository *self, PyObject *args) } +PyDoc_STRVAR(Repository_create_branch__doc__, + "create_branch(name, commit, force=False) -> bytes\n" + "\n" + "Create a new branch \"name\" which points to a commit.\n" + "\n" + "Arguments:\n" + "\n" + "force\n" + " If True branches will be overridden, otherwise (the default) an\n" + " exception is raised.\n" + "\n" + "Examples::\n" + "\n" + " repo.create_branch('foo', repo.head.hex, force=False)"); + +PyObject* Repository_create_branch(Repository *self, PyObject *args) +{ + Commit *py_commit; + git_reference *c_reference; + char *c_name; + int err, force = 0; + + if (!PyArg_ParseTuple(args, "sO!|i", &c_name, &CommitType, &py_commit, &force)) + return NULL; + + err = git_branch_create(&c_reference, self->repo, c_name, py_commit->commit, force); + if (err < 0) + return Error_set(err); + + return wrap_branch(c_reference, self); +} + + PyDoc_STRVAR(Repository_listall_references__doc__, "listall_references([flags]) -> (str, ...)\n" "\n" @@ -1422,6 +1456,7 @@ PyMethodDef Repository_methods[] = { METHOD(Repository, git_object_lookup_prefix, METH_O), METHOD(Repository, lookup_branch, METH_VARARGS), METHOD(Repository, listall_branches, METH_VARARGS), + METHOD(Repository, create_branch, METH_VARARGS), {NULL} }; diff --git a/src/repository.h b/src/repository.h index b718f56..fd9c524 100644 --- a/src/repository.h +++ b/src/repository.h @@ -54,6 +54,7 @@ PyObject* Repository_create_blob(Repository *self, PyObject *args); PyObject* Repository_create_blob_fromfile(Repository *self, PyObject *args); PyObject* Repository_create_commit(Repository *self, PyObject *args); PyObject* Repository_create_tag(Repository *self, PyObject *args); +PyObject* Repository_create_branch(Repository *self, PyObject *args); PyObject* Repository_listall_references(Repository *self, PyObject *args); PyObject* Repository_listall_branches(Repository *self, PyObject *args); PyObject* Repository_lookup_reference(Repository *self, PyObject *py_name); diff --git a/test/test_branch.py b/test/test_branch.py index c6a5565..4cc21ca 100644 --- a/test/test_branch.py +++ b/test/test_branch.py @@ -52,6 +52,21 @@ class BranchesTestCase(utils.RepoTestCase): branches = sorted(self.repo.listall_branches()) self.assertEqual(branches, ['i18n', 'master']) + def test_create_branch(self): + commit = self.repo[LAST_COMMIT] + reference = self.repo.create_branch('version1', commit) + refs = self.repo.listall_branches() + self.assertTrue('version1' in refs) + reference = self.repo.lookup_branch('version1') + self.assertEqual(reference.target.hex, LAST_COMMIT) + + # try to create existing reference + self.assertRaises(ValueError, + lambda: self.repo.create_branch('version1', commit)) + + # try to create existing reference with force + reference = self.repo.create_branch('version1', commit, True) + self.assertEqual(reference.target.hex, LAST_COMMIT) class BranchesEmptyRepoTestCase(utils.EmptyRepoTestCase):