diff --git a/src/index.c b/src/index.c index 3b8447c..c62e5f2 100644 --- a/src/index.c +++ b/src/index.c @@ -352,10 +352,10 @@ Index_read_tree(Index *self, PyObject *value) git_oid oid; git_tree *tree; int err; - Py_ssize_t len; + size_t len; - len = py_str_to_git_oid(value, &oid); - if (len < 0) + len = py_oid_to_git_oid(value, &oid); + if (len == 0) return NULL; err = git_tree_lookup_prefix(&tree, self->repo->repo, &oid, len); diff --git a/src/oid.c b/src/oid.c index d1751ce..f96fd1e 100644 --- a/src/oid.c +++ b/src/oid.c @@ -45,8 +45,8 @@ git_oid_to_python(const git_oid *oid) return (PyObject*)py_oid; } -Py_ssize_t -_oid_from_hex(PyObject *py_oid, git_oid *oid) +size_t +py_hex_to_git_oid (PyObject *py_oid, git_oid *oid) { PyObject *py_hex; int err; @@ -58,15 +58,15 @@ _oid_from_hex(PyObject *py_oid, git_oid *oid) if (PyBytes_Check(py_oid)) { err = PyBytes_AsStringAndSize(py_oid, &hex, &len); if (err) - return -1; + return 0; err = git_oid_fromstrn(oid, hex, len); if (err < 0) { PyErr_SetObject(Error_type(err), py_oid); - return -1; + return 0; } - return len; + return (size_t)len; } #endif @@ -74,31 +74,31 @@ _oid_from_hex(PyObject *py_oid, git_oid *oid) if (PyUnicode_Check(py_oid)) { py_hex = PyUnicode_AsASCIIString(py_oid); if (py_hex == NULL) - return -1; + return 0; err = PyBytes_AsStringAndSize(py_hex, &hex, &len); if (err) { Py_DECREF(py_hex); - return -1; + return 0; } err = git_oid_fromstrn(oid, hex, len); Py_DECREF(py_hex); if (err < 0) { PyErr_SetObject(Error_type(err), py_oid); - return -1; + return 0; } - return len; + return (size_t)len; } /* Type error */ PyErr_SetObject(PyExc_TypeError, py_oid); - return -1; + return 0; } -Py_ssize_t -py_str_to_git_oid(PyObject *py_oid, git_oid *oid) +size_t +py_oid_to_git_oid(PyObject *py_oid, git_oid *oid) { /* Oid */ if (PyObject_TypeCheck(py_oid, (PyTypeObject*)&OidType)) { @@ -107,41 +107,43 @@ py_str_to_git_oid(PyObject *py_oid, git_oid *oid) } /* Hex */ - return _oid_from_hex(py_oid, oid); + return py_hex_to_git_oid(py_oid, oid); } -Py_ssize_t -py_str_to_git_oid_expand(git_repository *repo, PyObject *py_str, git_oid *oid) +int +py_oid_to_git_oid_expand(git_repository *repo, PyObject *py_str, git_oid *oid) { int err; - Py_ssize_t len; - git_odb *odb; - git_odb_object *obj; + size_t len; + git_odb *odb = NULL; + git_odb_object *obj = NULL; - len = py_str_to_git_oid(py_str, oid); - - if (len == GIT_OID_HEXSZ || len < 0) - return len; - - err = git_repository_odb(&odb, repo); - if (err < 0) { - Error_set(err); + len = py_oid_to_git_oid(py_str, oid); + if (len == 0) return -1; - } + + if (len == GIT_OID_HEXSZ) + return 0; + + /* Short oid */ + err = git_repository_odb(&odb, repo); + if (err < 0) + goto error; err = git_odb_read_prefix(&obj, odb, oid, len); - if (err < 0) { - git_odb_free(odb); - Error_set(err); - return err; - } + if (err < 0) + goto error; git_oid_cpy(oid, git_odb_object_id(obj)); - git_odb_object_free(obj); git_odb_free(odb); - return 0; + +error: + git_odb_object_free(obj); + git_odb_free(odb); + Error_set(err); + return -1; } PyObject * @@ -197,8 +199,8 @@ Oid_init(Oid *self, PyObject *args, PyObject *kw) } /* Case 2: hex */ - len = _oid_from_hex(hex, &self->oid); - if (len < 0) + len = py_hex_to_git_oid(hex, &self->oid); + if (len == 0) return -1; return 0; diff --git a/src/oid.h b/src/oid.h index ca6567c..871f26a 100644 --- a/src/oid.h +++ b/src/oid.h @@ -32,9 +32,9 @@ #include #include -Py_ssize_t py_str_to_git_oid(PyObject *py_str, git_oid *oid); -Py_ssize_t py_str_to_git_oid_expand(git_repository *repo, PyObject *py_str, - git_oid *oid); +size_t py_oid_to_git_oid(PyObject *py_str, git_oid *oid); +int py_oid_to_git_oid_expand(git_repository *repo, PyObject *py_str, + git_oid *oid); PyObject* git_oid_to_python(const git_oid *oid); PyObject* git_oid_to_py_str(const git_oid *oid); diff --git a/src/reference.c b/src/reference.c index 17537e7..1e302c7 100644 --- a/src/reference.c +++ b/src/reference.c @@ -226,7 +226,6 @@ Reference_target__set__(Reference *self, PyObject *py_target) git_oid oid; char *c_name; int err; - Py_ssize_t len; git_reference *new_ref; git_repository *repo; @@ -235,11 +234,9 @@ Reference_target__set__(Reference *self, PyObject *py_target) /* Case 1: Direct */ if (GIT_REF_OID == git_reference_type(self->reference)) { repo = git_reference_owner(self->reference); - len = py_str_to_git_oid_expand(repo, py_target, &oid); - if (len < 0) { - err = (int)len; - goto error; - } + err = py_oid_to_git_oid_expand(repo, py_target, &oid); + if (err < 0) + return err; err = git_reference_set_target(&new_ref, self->reference, &oid); if (err < 0) diff --git a/src/repository.c b/src/repository.c index 3468ffc..0cc7c3b 100644 --- a/src/repository.c +++ b/src/repository.c @@ -254,12 +254,12 @@ PyObject * Repository_git_object_lookup_prefix(Repository *self, PyObject *key) { int err; - Py_ssize_t len; + size_t len; git_oid oid; git_object *obj; - len = py_str_to_git_oid(key, &oid); - if (len < 0) + len = py_oid_to_git_oid(key, &oid); + if (len == 0) return NULL; err = git_object_lookup_prefix(&obj, self->repo, &oid, len, GIT_OBJ_ANY); @@ -339,11 +339,11 @@ Repository_read(Repository *self, PyObject *py_hex) { git_oid oid; git_odb_object *obj; - Py_ssize_t len; + size_t len; PyObject* tuple; - len = py_str_to_git_oid(py_hex, &oid); - if (len < 0) + len = py_oid_to_git_oid(py_hex, &oid); + if (len == 0) return NULL; obj = Repository_read_raw(self->repo, &oid, len); @@ -522,11 +522,11 @@ Repository_merge_base(Repository *self, PyObject *args) if (!PyArg_ParseTuple(args, "OO", &value1, &value2)) return NULL; - err = py_str_to_git_oid_expand(self->repo, value1, &oid1); + err = py_oid_to_git_oid_expand(self->repo, value1, &oid1); if (err < 0) return NULL; - err = py_str_to_git_oid_expand(self->repo, value2, &oid2); + err = py_oid_to_git_oid_expand(self->repo, value2, &oid2); if (err < 0) return NULL; @@ -548,7 +548,6 @@ Repository_walk(Repository *self, PyObject *args) PyObject *value; unsigned int sort; int err; - Py_ssize_t len; git_oid oid; git_revwalk *walk; Walker *py_walker; @@ -565,10 +564,10 @@ Repository_walk(Repository *self, PyObject *args) /* Push */ if (value != Py_None) { - len = py_str_to_git_oid_expand(self->repo, value, &oid); - if (len < 0) { + err = py_oid_to_git_oid_expand(self->repo, value, &oid); + if (err < 0) { git_revwalk_free(walk); - return Error_set((int)len); + return NULL; } err = git_revwalk_push(walk, &oid); @@ -683,7 +682,7 @@ Repository_create_commit(Repository *self, PyObject *args) int parent_count; git_commit **parents = NULL; int err = 0, i = 0; - Py_ssize_t len; + size_t len; if (!PyArg_ParseTuple(args, "zO!O!OOO!|s", &update_ref, @@ -695,8 +694,8 @@ Repository_create_commit(Repository *self, PyObject *args) &encoding)) return NULL; - len = py_str_to_git_oid(py_oid, &oid); - if (len < 0) + len = py_oid_to_git_oid(py_oid, &oid); + if (len == 0) goto out; message = py_str_to_c_str(py_message, encoding); @@ -717,12 +716,14 @@ Repository_create_commit(Repository *self, PyObject *args) } for (; i < parent_count; i++) { py_parent = PyList_GET_ITEM(py_parents, i); - len = py_str_to_git_oid(py_parent, &oid); - if (len < 0) + len = py_oid_to_git_oid(py_parent, &oid); + if (len == 0) goto out; - if (git_commit_lookup_prefix(&parents[i], self->repo, &oid, - (unsigned int)len)) + err = git_commit_lookup_prefix(&parents[i], self->repo, &oid, len); + if (err < 0) { + Error_set(err); goto out; + } } err = git_commit_create(&oid, self->repo, update_ref, @@ -762,7 +763,7 @@ Repository_create_tag(Repository *self, PyObject *args) git_oid oid; git_object *target = NULL; int err, target_type; - Py_ssize_t len; + size_t len; if (!PyArg_ParseTuple(args, "sOiO!s", &tag_name, @@ -772,12 +773,12 @@ Repository_create_tag(Repository *self, PyObject *args) &message)) return NULL; - len = py_str_to_git_oid(py_oid, &oid); - if (len < 0) + len = py_oid_to_git_oid(py_oid, &oid); + if (len == 0) return NULL; - err = git_object_lookup_prefix(&target, self->repo, &oid, - (unsigned int)len, target_type); + err = git_object_lookup_prefix(&target, self->repo, &oid, len, + target_type); err = err < 0 ? err : git_tag_create(&oid, self->repo, tag_name, target, py_tagger->signature, message, 0); git_object_free(target); @@ -885,14 +886,13 @@ Repository_create_reference_direct(Repository *self, PyObject *args, char *c_name; git_oid oid; int err, force; - Py_ssize_t len; if (!PyArg_ParseTuple(args, "sOi", &c_name, &py_obj, &force)) return NULL; - len = py_str_to_git_oid_expand(self->repo, py_obj, &oid); - if (len < 0) - return Error_set((int)len); + err = py_oid_to_git_oid_expand(self->repo, py_obj, &oid); + if (err < 0) + return NULL; err = git_reference_create(&c_reference, self->repo, c_name, &oid, force); if (err < 0) @@ -1013,7 +1013,6 @@ Repository_TreeBuilder(Repository *self, PyObject *args) git_tree *tree = NULL; git_tree *must_free = NULL; int err; - Py_ssize_t len; if (!PyArg_ParseTuple(args, "|O", &py_src)) return NULL; @@ -1027,8 +1026,8 @@ Repository_TreeBuilder(Repository *self, PyObject *args) } tree = py_tree->tree; } else { - len = py_str_to_git_oid_expand(self->repo, py_src, &oid); - if (len < 0) + err = py_oid_to_git_oid_expand(self->repo, py_src, &oid); + if (err < 0) return NULL; err = git_tree_lookup(&tree, self->repo, &oid); diff --git a/src/treebuilder.c b/src/treebuilder.c index 8f52596..1724f14 100644 --- a/src/treebuilder.c +++ b/src/treebuilder.c @@ -53,7 +53,7 @@ PyObject * TreeBuilder_insert(TreeBuilder *self, PyObject *args) { PyObject *py_oid; - Py_ssize_t len; + size_t len; int err, attr; git_oid oid; const char *fname; @@ -61,8 +61,8 @@ TreeBuilder_insert(TreeBuilder *self, PyObject *args) if (!PyArg_ParseTuple(args, "sOi", &fname, &py_oid, &attr)) return NULL; - len = py_str_to_git_oid(py_oid, &oid); - if (len < 0) + len = py_oid_to_git_oid(py_oid, &oid); + if (len == 0) return NULL; err = git_treebuilder_insert(NULL, self->bld, fname, &oid, attr); diff --git a/src/walker.c b/src/walker.c index 1952fbe..a02b2f4 100644 --- a/src/walker.c +++ b/src/walker.c @@ -53,12 +53,11 @@ PyObject * Walker_hide(Walker *self, PyObject *py_hex) { int err; - Py_ssize_t len; git_oid oid; - len = py_str_to_git_oid_expand(self->repo->repo, py_hex, &oid); - if (len < 0) - return Error_set((int)len); + err = py_oid_to_git_oid_expand(self->repo->repo, py_hex, &oid); + if (err < 0) + return NULL; err = git_revwalk_hide(self->walk, &oid); if (err < 0) @@ -77,12 +76,11 @@ PyObject * Walker_push(Walker *self, PyObject *py_hex) { int err; - Py_ssize_t len; git_oid oid; - len = py_str_to_git_oid_expand(self->repo->repo, py_hex, &oid); - if (len < 0) - return Error_set((int)len); + err = py_oid_to_git_oid_expand(self->repo->repo, py_hex, &oid); + if (err < 0) + return NULL; err = git_revwalk_push(self->walk, &oid); if (err < 0)