diff --git a/src/error.c b/src/error.c index 1f2ce1e..aaa8f3c 100644 --- a/src/error.c +++ b/src/error.c @@ -126,3 +126,10 @@ Error_set_oid(int err, const git_oid *oid, size_t len) hex[len] = '\0'; return Error_set_str(err, hex); } + +PyObject * +Error_type_error(const char *format, PyObject *value) +{ + PyErr_Format(PyExc_TypeError, format, Py_TYPE(value)->tp_name); + return NULL; +} diff --git a/src/error.h b/src/error.h index 7651a45..6190d3e 100644 --- a/src/error.h +++ b/src/error.h @@ -37,5 +37,6 @@ PyObject* Error_set(int err); PyObject* Error_set_exc(PyObject* exception); PyObject* Error_set_str(int err, const char *str); PyObject* Error_set_oid(int err, const git_oid *oid, size_t len); +PyObject* Error_type_error(const char *format, PyObject *value); #endif diff --git a/src/options.c b/src/options.c index 3f100e1..696e352 100644 --- a/src/options.c +++ b/src/options.c @@ -66,7 +66,7 @@ option(PyObject *self, PyObject *args) return NULL; if (!PyLong_Check(py_option)) - goto on_non_integer; + return Error_type_error("option should be an integer, got %.200s", py_option); option = PyLong_AsLong(py_option); @@ -80,10 +80,9 @@ option(PyObject *self, PyObject *args) return NULL; if (!PyLong_Check(py_level)) - goto on_non_integer; + return Error_type_error("level should be an integer, got %.200s", py_level); return get_search_path(PyLong_AsLong(py_level)); - break; } case GIT_OPT_SET_SEARCH_PATH: @@ -101,7 +100,7 @@ option(PyObject *self, PyObject *args) return NULL; if (!PyLong_Check(py_level)) - goto on_non_integer; + return Error_type_error("level should be an integer, got %.200s", py_level); path = py_str_borrow_c_str(&tpath, py_path, NULL); if (!path) @@ -116,7 +115,6 @@ option(PyObject *self, PyObject *args) } Py_RETURN_NONE; - break; } case GIT_OPT_GET_MWINDOW_SIZE: @@ -130,8 +128,6 @@ option(PyObject *self, PyObject *args) } return PyLong_FromSize_t(size); - - break; } case GIT_OPT_SET_MWINDOW_SIZE: @@ -144,7 +140,7 @@ option(PyObject *self, PyObject *args) return NULL; if (!PyLong_Check(py_size)) - goto on_non_integer; + return Error_type_error("size should be an integer, got %.200s", py_size); size = PyLong_AsSize_t(py_size); error = git_libgit2_opts(GIT_OPT_SET_MWINDOW_SIZE, size); @@ -154,7 +150,6 @@ option(PyObject *self, PyObject *args) } Py_RETURN_NONE; - break; } case GIT_OPT_GET_MWINDOW_MAPPED_LIMIT: @@ -168,8 +163,6 @@ option(PyObject *self, PyObject *args) } return PyLong_FromSize_t(limit); - - break; } case GIT_OPT_SET_MWINDOW_MAPPED_LIMIT: @@ -182,7 +175,7 @@ option(PyObject *self, PyObject *args) return NULL; if (!PyLong_Check(py_limit)) - goto on_non_integer; + return Error_type_error("limit should be an integer, got %.200s", py_limit); limit = PyLong_AsSize_t(py_limit); error = git_libgit2_opts(GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, limit); @@ -192,7 +185,6 @@ option(PyObject *self, PyObject *args) } Py_RETURN_NONE; - break; } case GIT_OPT_SET_CACHE_OBJECT_LIMIT: @@ -210,7 +202,7 @@ option(PyObject *self, PyObject *args) return NULL; if (!PyLong_Check(py_limit)) - goto on_non_integer; + return Error_type_error("limit should be an integer, got %.200s", py_limit); object_type = PyLong_AsLong(py_object_type); limit = PyLong_AsSize_t(py_limit); @@ -222,30 +214,28 @@ option(PyObject *self, PyObject *args) } Py_RETURN_NONE; - break; } case GIT_OPT_SET_CACHE_MAX_SIZE: { - size_t max_size; - PyObject *py_max_size; + size_t max_size; + PyObject *py_max_size; - py_max_size = PyTuple_GetItem(args, 1); - if (!py_max_size) - return NULL; + py_max_size = PyTuple_GetItem(args, 1); + if (!py_max_size) + return NULL; - if (!PyLong_Check(py_max_size)) - goto on_non_integer; + if (!PyLong_Check(py_max_size)) + return Error_type_error("max_size should be an integer, got %.200s", py_max_size); - max_size = PyLong_AsSize_t(py_max_size); - error = git_libgit2_opts(GIT_OPT_SET_CACHE_MAX_SIZE, max_size); - if (error < 0) { - Error_set(error); - return NULL; - } + max_size = PyLong_AsSize_t(py_max_size); + error = git_libgit2_opts(GIT_OPT_SET_CACHE_MAX_SIZE, max_size); + if (error < 0) { + Error_set(error); + return NULL; + } - Py_RETURN_NONE; - break; + Py_RETURN_NONE; } case GIT_OPT_ENABLE_CACHING: @@ -256,7 +246,7 @@ option(PyObject *self, PyObject *args) py_flag = PyTuple_GetItem(args, 1); if (!PyLong_Check(py_flag)) - goto on_non_integer; + return Error_type_error("flag should be an integer, got %.200s", py_flag); flag = PyLong_AsSize_t(py_flag); error = git_libgit2_opts(GIT_OPT_ENABLE_CACHING, flag); @@ -266,7 +256,6 @@ option(PyObject *self, PyObject *args) } Py_RETURN_NONE; - break; } case GIT_OPT_GET_CACHED_MEMORY: @@ -284,16 +273,10 @@ option(PyObject *self, PyObject *args) PyTuple_SetItem(tup, 1, PyLong_FromLong(allowed)); return tup; - - break; } } PyErr_SetString(PyExc_ValueError, "unknown/unsupported option value"); return NULL; - -on_non_integer: - PyErr_SetString(PyExc_TypeError, "option is not an integer"); - return NULL; } diff --git a/src/utils.c b/src/utils.c index 4580a4c..2d60a2f 100644 --- a/src/utils.c +++ b/src/utils.c @@ -83,9 +83,7 @@ py_str_borrow_c_str(PyObject **tvalue, PyObject *value, const char *encoding) } /* Type error */ - PyErr_Format(PyExc_TypeError, "unexpected %.200s", - Py_TYPE(value)->tp_name); - return NULL; + return Error_type_error("unexpected %.200s", value); } /**