From 336f042e223fbbf853e7c5f6ffff5b05fcef9271 Mon Sep 17 00:00:00 2001 From: Jose Plana Date: Thu, 21 Nov 2013 01:05:36 +0100 Subject: [PATCH 1/9] Added methods to interact with the remote refspecs --- src/remote.c | 161 ++++++++++++++++++++++++++++++++++++++++++++ test/test_remote.py | 35 ++++++++-- 2 files changed, 191 insertions(+), 5 deletions(-) diff --git a/src/remote.c b/src/remote.c index 6b684ec..12c3913 100644 --- a/src/remote.c +++ b/src/remote.c @@ -33,6 +33,7 @@ #include "types.h" #include "remote.h" + extern PyObject *GitError; extern PyTypeObject RepositoryType; @@ -95,8 +96,164 @@ Remote_name__set__(Remote *self, PyObject* py_name) } +PyObject * get_pylist_from_git_strarray(git_strarray *strarray) +{ + int index; + PyObject *new_list; + + new_list = PyList_New(strarray->count); + for (index = 0; index < strarray->count; (index)++ ) { + PyList_SET_ITEM( + new_list, + index, + PyString_FromString(strarray->strings[index])); + } + return new_list; +} + + +PyDoc_STRVAR(Remote_fetch_refspecs__doc__, "Fetch refspecs"); + + +PyObject * +Remote_fetch_refspecs__get__(Remote *self) +{ + int err; + git_strarray refspecs; + PyObject *new_list; + + err = git_remote_get_fetch_refspecs(&refspecs, self->remote); + + if (err != 0) { + Error_set(err); + return NULL; + } + + new_list = get_pylist_from_git_strarray(&refspecs); + + git_strarray_free(&refspecs); + return new_list; +} + + +PyDoc_STRVAR(Remote_push_refspecs__doc__, "Push refspecs"); + + +PyObject * +Remote_push_refspecs__get__(Remote *self) +{ + int err; + git_strarray refspecs; + PyObject *new_list; + + err = git_remote_get_push_refspecs(&refspecs, self->remote); + + if (err != 0) { + Error_set(err); + return NULL; + } + + new_list = get_pylist_from_git_strarray(&refspecs); + git_strarray_free(&refspecs); + return new_list; +} + + +int +get_strarraygit_from_pylist(git_strarray *array, PyObject *pylist) +{ + long index, n; + PyObject *item; + + n = PyObject_Length(pylist); + if (n < 0) + return -1; + + // allocate new git_strarray + void *ptr = calloc(n, sizeof(char *)); + + if (!ptr) + return -1; + + array->strings = ptr; + array->count = n; + + for (index = 0; index < n; index++) { + item = PyList_GetItem(pylist, index); + array->strings[index] = py_str_to_c_str(item, NULL); + } + return 0; +} + + +PyDoc_STRVAR(Remote_set_fetch_refspecs__doc__, + "set_fetch_refspecs([str])\n" + "\n"); + + +PyObject * +Remote_set_fetch_refspecs(Remote *self, PyObject *args) +{ + int err; + PyObject *pyrefspecs; + git_strarray fetch_refspecs; + + if (! PyArg_Parse(args, "O", &pyrefspecs)) + return NULL; + + if (get_strarraygit_from_pylist(&fetch_refspecs , pyrefspecs) != 0) { + return NULL; + } + + err = git_remote_set_fetch_refspecs(self->remote, &fetch_refspecs); + + if (err != 0) { + Error_set(err); + return NULL; + } + + git_strarray_free(&fetch_refspecs); + + Py_RETURN_NONE; +} + + +PyDoc_STRVAR(Remote_set_push_refspecs__doc__, + "set_push_refspecs([str])\n" + "\n"); + + +PyObject * +Remote_set_push_refspecs(Remote *self, PyObject *args) +{ + + int err; + PyObject *pyrefspecs; + git_strarray push_refspecs; + + if (! PyArg_Parse(args, "O", &pyrefspecs)) + return NULL; + + if (get_strarraygit_from_pylist(&push_refspecs, pyrefspecs) != 0) { + return NULL; + } + + err = git_remote_set_push_refspecs(self->remote, &push_refspecs); + + if (err != 0) { + Error_set(err); + return NULL; + } + + git_strarray_free(&push_refspecs); + + Py_RETURN_NONE; +} + + PyDoc_STRVAR(Remote_url__doc__, "Url of the remote"); + PyObject * Remote_url__get__(Remote *self) { @@ -288,6 +445,8 @@ PyMethodDef Remote_methods[] = { METHOD(Remote, save, METH_NOARGS), METHOD(Remote, get_refspec, METH_O), METHOD(Remote, push, METH_VARARGS), + METHOD(Remote, set_fetch_refspecs, METH_O), + METHOD(Remote, set_push_refspecs, METH_O), {NULL} }; @@ -295,6 +454,8 @@ PyGetSetDef Remote_getseters[] = { GETSET(Remote, name), GETSET(Remote, url), GETTER(Remote, refspec_count), + GETTER(Remote, fetch_refspecs), + GETTER(Remote, push_refspecs), {NULL} }; diff --git a/test/test_remote.py b/test/test_remote.py index b6a9edc..85a95e1 100644 --- a/test/test_remote.py +++ b/test/test_remote.py @@ -83,11 +83,36 @@ class RepositoryTest(utils.RepoTestCase): self.assertEqual(refspec[0], REMOTE_FETCHSPEC_SRC) self.assertEqual(refspec[1], REMOTE_FETCHSPEC_DST) -# new_fetchspec = ('refs/foo/*', 'refs/remotes/foo/*') -# remote.fetchspec = new_fetchspec -# refspec = remote.get_refspec(0) -# self.assertEqual(new_fetchspec[0], refspec[0]) -# self.assertEqual(new_fetchspec[1], refspec[1]) + self.assertEqual(list, type(remote.fetch_refspecs)) + self.assertEqual(1, len(remote.fetch_refspecs)) + self.assertEqual('+refs/heads/*:refs/remotes/origin/*', + remote.fetch_refspecs[0]) + + self.assertEqual(list, type(remote.fetch_refspecs)) + self.assertEqual(0, len(remote.push_refspecs)) + + remote.set_fetch_refspecs(['+refs/*:refs/remotes/*']) + self.assertEqual('+refs/*:refs/remotes/*', + remote.fetch_refspecs[0]) + + remote.set_fetch_refspecs([ + '+refs/*:refs/remotes/*', + '+refs/test/*:refs/test/remotes/*' + ]) + self.assertEqual('+refs/*:refs/remotes/*', + remote.fetch_refspecs[0]) + self.assertEqual('+refs/test/*:refs/test/remotes/*', + remote.fetch_refspecs[1]) + + remote.set_push_refspecs([ + '+refs/*:refs/remotes/*', + '+refs/test/*:refs/test/remotes/*' + ]) + + self.assertEqual('+refs/*:refs/remotes/*', + remote.push_refspecs[0]) + self.assertEqual('+refs/test/*:refs/test/remotes/*', + remote.push_refspecs[1]) def test_remote_list(self): From ea8901f417ec29eb39524fecf23dda9760fd2148 Mon Sep 17 00:00:00 2001 From: Jose Plana Date: Mon, 25 Nov 2013 14:03:37 +0100 Subject: [PATCH 2/9] Fix PEP-7 --- src/remote.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/remote.c b/src/remote.c index 12c3913..c5cfb04 100644 --- a/src/remote.c +++ b/src/remote.c @@ -87,7 +87,7 @@ Remote_name__set__(Remote *self, PyObject* py_name) free(name); if (err == GIT_OK) - return 0; + return 0; Error_set(err); } @@ -167,13 +167,13 @@ get_strarraygit_from_pylist(git_strarray *array, PyObject *pylist) n = PyObject_Length(pylist); if (n < 0) - return -1; + return -1; // allocate new git_strarray void *ptr = calloc(n, sizeof(char *)); if (!ptr) - return -1; + return -1; array->strings = ptr; array->count = n; From 41bedc05f09e36eed11d9fe858b8db9fe5f7b129 Mon Sep 17 00:00:00 2001 From: Jose Plana Date: Mon, 25 Nov 2013 17:36:35 +0100 Subject: [PATCH 3/9] Use unicode for python v3 support --- src/remote.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/remote.c b/src/remote.c index c5cfb04..bf8a7a8 100644 --- a/src/remote.c +++ b/src/remote.c @@ -106,7 +106,7 @@ PyObject * get_pylist_from_git_strarray(git_strarray *strarray) PyList_SET_ITEM( new_list, index, - PyString_FromString(strarray->strings[index])); + to_unicode(strarray->strings[index], NULL, NULL)); } return new_list; } From 37ed244a40b284f15792bd33f33341cf8f5f8118 Mon Sep 17 00:00:00 2001 From: Jose Plana Date: Tue, 26 Nov 2013 00:12:33 +0100 Subject: [PATCH 4/9] Removed reduntant returns, fixs PEP7 --- src/remote.c | 33 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/src/remote.c b/src/remote.c index bf8a7a8..19274b1 100644 --- a/src/remote.c +++ b/src/remote.c @@ -124,10 +124,8 @@ Remote_fetch_refspecs__get__(Remote *self) err = git_remote_get_fetch_refspecs(&refspecs, self->remote); - if (err != 0) { - Error_set(err); - return NULL; - } + if (err != 0) + return Error_set(err); new_list = get_pylist_from_git_strarray(&refspecs); @@ -148,10 +146,8 @@ Remote_push_refspecs__get__(Remote *self) err = git_remote_get_push_refspecs(&refspecs, self->remote); - if (err != 0) { - Error_set(err); - return NULL; - } + if (err != 0) + return Error_set(err); new_list = get_pylist_from_git_strarray(&refspecs); git_strarray_free(&refspecs); @@ -169,7 +165,7 @@ get_strarraygit_from_pylist(git_strarray *array, PyObject *pylist) if (n < 0) return -1; - // allocate new git_strarray + /* allocate new git_strarray */ void *ptr = calloc(n, sizeof(char *)); if (!ptr) @@ -201,16 +197,13 @@ Remote_set_fetch_refspecs(Remote *self, PyObject *args) if (! PyArg_Parse(args, "O", &pyrefspecs)) return NULL; - if (get_strarraygit_from_pylist(&fetch_refspecs , pyrefspecs) != 0) { + if (get_strarraygit_from_pylist(&fetch_refspecs , pyrefspecs) != 0) return NULL; - } err = git_remote_set_fetch_refspecs(self->remote, &fetch_refspecs); - if (err != 0) { - Error_set(err); - return NULL; - } + if (err != 0) + return Error_set(err); git_strarray_free(&fetch_refspecs); @@ -234,16 +227,14 @@ Remote_set_push_refspecs(Remote *self, PyObject *args) if (! PyArg_Parse(args, "O", &pyrefspecs)) return NULL; - if (get_strarraygit_from_pylist(&push_refspecs, pyrefspecs) != 0) { + if (get_strarraygit_from_pylist(&push_refspecs, pyrefspecs) != 0) return NULL; - } err = git_remote_set_push_refspecs(self->remote, &push_refspecs); - if (err != 0) { - Error_set(err); - return NULL; - } + if (err != 0) + return Error_set(err); + git_strarray_free(&push_refspecs); From 03a6465927fea29e5911268bb6d736afc9e2ae41 Mon Sep 17 00:00:00 2001 From: Jose Plana Date: Tue, 26 Nov 2013 01:05:09 +0100 Subject: [PATCH 5/9] Fix documentation --- docs/remotes.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/remotes.rst b/docs/remotes.rst index 4b9692f..b8f9957 100644 --- a/docs/remotes.rst +++ b/docs/remotes.rst @@ -13,7 +13,11 @@ The Remote type .. autoattribute:: pygit2.Remote.name .. autoattribute:: pygit2.Remote.url .. autoattribute:: pygit2.Remote.refspec_count +.. autoattribute:: pygit2.Remote.fetch_refspec +.. autoattribute:: pygit2.Remote.push_refspec .. automethod:: pygit2.Remote.get_refspec +.. automethod:: pygit2.Remote.set_fetch_refspecs +.. automethod:: pygit2.Remote.set_push_refspecs .. automethod:: pygit2.Remote.fetch .. automethod:: pygit2.Remote.push .. automethod:: pygit2.Remote.save From f69eeae108322a4e46b88ad5913dbef0a89321f7 Mon Sep 17 00:00:00 2001 From: Jose Plana Date: Wed, 27 Nov 2013 19:26:24 +0100 Subject: [PATCH 6/9] Refactor getters to become methods --- src/remote.c | 12 ++++++------ test/test_remote.py | 20 ++++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/remote.c b/src/remote.c index bf8a7a8..b61eb2f 100644 --- a/src/remote.c +++ b/src/remote.c @@ -112,11 +112,11 @@ PyObject * get_pylist_from_git_strarray(git_strarray *strarray) } -PyDoc_STRVAR(Remote_fetch_refspecs__doc__, "Fetch refspecs"); +PyDoc_STRVAR(Remote_get_fetch_refspecs__doc__, "Fetch refspecs"); PyObject * -Remote_fetch_refspecs__get__(Remote *self) +Remote_get_fetch_refspecs(Remote *self) { int err; git_strarray refspecs; @@ -136,11 +136,11 @@ Remote_fetch_refspecs__get__(Remote *self) } -PyDoc_STRVAR(Remote_push_refspecs__doc__, "Push refspecs"); +PyDoc_STRVAR(Remote_get_push_refspecs__doc__, "Push refspecs"); PyObject * -Remote_push_refspecs__get__(Remote *self) +Remote_get_push_refspecs(Remote *self) { int err; git_strarray refspecs; @@ -445,7 +445,9 @@ PyMethodDef Remote_methods[] = { METHOD(Remote, save, METH_NOARGS), METHOD(Remote, get_refspec, METH_O), METHOD(Remote, push, METH_VARARGS), + METHOD(Remote, get_fetch_refspecs, METH_O), METHOD(Remote, set_fetch_refspecs, METH_O), + METHOD(Remote, get_push_refspecs, METH_O), METHOD(Remote, set_push_refspecs, METH_O), {NULL} }; @@ -454,8 +456,6 @@ PyGetSetDef Remote_getseters[] = { GETSET(Remote, name), GETSET(Remote, url), GETTER(Remote, refspec_count), - GETTER(Remote, fetch_refspecs), - GETTER(Remote, push_refspecs), {NULL} }; diff --git a/test/test_remote.py b/test/test_remote.py index 85a95e1..741cd50 100644 --- a/test/test_remote.py +++ b/test/test_remote.py @@ -83,26 +83,26 @@ class RepositoryTest(utils.RepoTestCase): self.assertEqual(refspec[0], REMOTE_FETCHSPEC_SRC) self.assertEqual(refspec[1], REMOTE_FETCHSPEC_DST) - self.assertEqual(list, type(remote.fetch_refspecs)) - self.assertEqual(1, len(remote.fetch_refspecs)) + self.assertEqual(list, type(remote.get_fetch_refspecs())) + self.assertEqual(1, len(remote.get_fetch_refspecs())) self.assertEqual('+refs/heads/*:refs/remotes/origin/*', - remote.fetch_refspecs[0]) + remote.get_fetch_refspecs()[0]) - self.assertEqual(list, type(remote.fetch_refspecs)) - self.assertEqual(0, len(remote.push_refspecs)) + self.assertEqual(list, type(remote.get_push_refspecs())) + self.assertEqual(0, len(remote.get_push_refspecs())) remote.set_fetch_refspecs(['+refs/*:refs/remotes/*']) self.assertEqual('+refs/*:refs/remotes/*', - remote.fetch_refspecs[0]) + remote.get_fetch_refspecs()[0]) remote.set_fetch_refspecs([ '+refs/*:refs/remotes/*', '+refs/test/*:refs/test/remotes/*' ]) self.assertEqual('+refs/*:refs/remotes/*', - remote.fetch_refspecs[0]) + remote.get_fetch_refspecs()[0]) self.assertEqual('+refs/test/*:refs/test/remotes/*', - remote.fetch_refspecs[1]) + remote.get_fetch_refspecs()[1]) remote.set_push_refspecs([ '+refs/*:refs/remotes/*', @@ -110,9 +110,9 @@ class RepositoryTest(utils.RepoTestCase): ]) self.assertEqual('+refs/*:refs/remotes/*', - remote.push_refspecs[0]) + remote.get_push_refspecs()[0]) self.assertEqual('+refs/test/*:refs/test/remotes/*', - remote.push_refspecs[1]) + remote.get_push_refspecs()[1]) def test_remote_list(self): From 369fa3087d32ba18e18021110cce77ee4f58a425 Mon Sep 17 00:00:00 2001 From: Jose Plana Date: Fri, 29 Nov 2013 19:19:54 +0100 Subject: [PATCH 7/9] Fix methods signature --- src/remote.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/remote.c b/src/remote.c index b61eb2f..fbfd1fc 100644 --- a/src/remote.c +++ b/src/remote.c @@ -445,9 +445,9 @@ PyMethodDef Remote_methods[] = { METHOD(Remote, save, METH_NOARGS), METHOD(Remote, get_refspec, METH_O), METHOD(Remote, push, METH_VARARGS), - METHOD(Remote, get_fetch_refspecs, METH_O), + METHOD(Remote, get_fetch_refspecs, METH_NOARGS), METHOD(Remote, set_fetch_refspecs, METH_O), - METHOD(Remote, get_push_refspecs, METH_O), + METHOD(Remote, get_push_refspecs, METH_NOARGS), METHOD(Remote, set_push_refspecs, METH_O), {NULL} }; From 05798fc5aa97202f077170e733896912b136ad90 Mon Sep 17 00:00:00 2001 From: Jose Plana Date: Mon, 2 Dec 2013 13:40:38 +0100 Subject: [PATCH 8/9] Fixed some error exceptions, docs --- docs/remotes.rst | 4 ++++ src/remote.c | 54 +++++++++++++++++++++++++----------------------- 2 files changed, 32 insertions(+), 26 deletions(-) diff --git a/docs/remotes.rst b/docs/remotes.rst index 4b9692f..12a1755 100644 --- a/docs/remotes.rst +++ b/docs/remotes.rst @@ -13,6 +13,10 @@ The Remote type .. autoattribute:: pygit2.Remote.name .. autoattribute:: pygit2.Remote.url .. autoattribute:: pygit2.Remote.refspec_count +.. automethod:: pygit2.Remote.get_push_refspec +.. automethod:: pygit2.Remote.get_pull_refspec +.. automethod:: pygit2.Remote.set_push_refspec +.. automethod:: pygit2.Remote.set_pull_refspec .. automethod:: pygit2.Remote.get_refspec .. automethod:: pygit2.Remote.fetch .. automethod:: pygit2.Remote.push diff --git a/src/remote.c b/src/remote.c index fbfd1fc..818bb14 100644 --- a/src/remote.c +++ b/src/remote.c @@ -102,6 +102,10 @@ PyObject * get_pylist_from_git_strarray(git_strarray *strarray) PyObject *new_list; new_list = PyList_New(strarray->count); + + if (new_list == NULL) + return Error_set(GITERR_NOMEMORY); + for (index = 0; index < strarray->count; (index)++ ) { PyList_SET_ITEM( new_list, @@ -124,10 +128,8 @@ Remote_get_fetch_refspecs(Remote *self) err = git_remote_get_fetch_refspecs(&refspecs, self->remote); - if (err != 0) { - Error_set(err); - return NULL; - } + if (err != GIT_OK) + return Error_set(err); new_list = get_pylist_from_git_strarray(&refspecs); @@ -148,12 +150,11 @@ Remote_get_push_refspecs(Remote *self) err = git_remote_get_push_refspecs(&refspecs, self->remote); - if (err != 0) { - Error_set(err); - return NULL; - } + if (err != GIT_OK) + return Error_set(err); new_list = get_pylist_from_git_strarray(&refspecs); + git_strarray_free(&refspecs); return new_list; } @@ -167,13 +168,13 @@ get_strarraygit_from_pylist(git_strarray *array, PyObject *pylist) n = PyObject_Length(pylist); if (n < 0) - return -1; + goto error; - // allocate new git_strarray + /* allocate new git_strarray */ void *ptr = calloc(n, sizeof(char *)); if (!ptr) - return -1; + goto error; array->strings = ptr; array->count = n; @@ -182,7 +183,12 @@ get_strarraygit_from_pylist(git_strarray *array, PyObject *pylist) item = PyList_GetItem(pylist, index); array->strings[index] = py_str_to_c_str(item, NULL); } - return 0; + + return GIT_OK; + + error: + Error_set(GITERR_NOMEMORY); + return -1; } @@ -199,21 +205,20 @@ Remote_set_fetch_refspecs(Remote *self, PyObject *args) git_strarray fetch_refspecs; if (! PyArg_Parse(args, "O", &pyrefspecs)) - return NULL; + return Error_set(GITERR_INVALID); - if (get_strarraygit_from_pylist(&fetch_refspecs , pyrefspecs) != 0) { + if (get_strarraygit_from_pylist(&fetch_refspecs , pyrefspecs) != GIT_OK) { return NULL; } err = git_remote_set_fetch_refspecs(self->remote, &fetch_refspecs); - if (err != 0) { - Error_set(err); - return NULL; - } - git_strarray_free(&fetch_refspecs); + if (err != GIT_OK) { + return Error_set(err); + } + Py_RETURN_NONE; } @@ -226,13 +231,12 @@ PyDoc_STRVAR(Remote_set_push_refspecs__doc__, PyObject * Remote_set_push_refspecs(Remote *self, PyObject *args) { - int err; PyObject *pyrefspecs; git_strarray push_refspecs; if (! PyArg_Parse(args, "O", &pyrefspecs)) - return NULL; + return Error_set(GITERR_INVALID); if (get_strarraygit_from_pylist(&push_refspecs, pyrefspecs) != 0) { return NULL; @@ -240,13 +244,11 @@ Remote_set_push_refspecs(Remote *self, PyObject *args) err = git_remote_set_push_refspecs(self->remote, &push_refspecs); - if (err != 0) { - Error_set(err); - return NULL; - } - git_strarray_free(&push_refspecs); + if (err != GIT_OK) + return Error_set(err); + Py_RETURN_NONE; } From 6050ae021dad0bc1af053b5fd1b6a431bf160df0 Mon Sep 17 00:00:00 2001 From: Jose Plana Date: Mon, 2 Dec 2013 16:17:51 +0100 Subject: [PATCH 9/9] Fix last minute typo --- src/remote.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/remote.c b/src/remote.c index 55539af..b3fb89e 100644 --- a/src/remote.c +++ b/src/remote.c @@ -207,7 +207,7 @@ Remote_set_fetch_refspecs(Remote *self, PyObject *args) if (! PyArg_Parse(args, "O", &pyrefspecs)) return Error_set(GITERR_INVALID); - if (get_strarraygit_from_pylist(&fetch_refspecs , pyrefspecs) != GIT_OK) { + if (get_strarraygit_from_pylist(&fetch_refspecs , pyrefspecs) != GIT_OK) return NULL; err = git_remote_set_fetch_refspecs(self->remote, &fetch_refspecs);