size_t py_hex_to_git_oid (PyObject *py_oid, git_oid *oid) { PyObject *py_hex; int err; char *hex; Py_ssize_t len; #if PY_MAJOR_VERSION == 2 /* Bytes (only supported in Python 2) */ if (PyBytes_Check(py_oid)) { err = PyBytes_AsStringAndSize(py_oid, &hex, &len); if (err) return 0; err = git_oid_fromstrn(oid, hex, len); if (err < 0) { PyErr_SetObject(Error_type(err), py_oid); return 0; } return (size_t)len; } #endif /* Unicode */ if (PyUnicode_Check(py_oid)) { py_hex = PyUnicode_AsASCIIString(py_oid); if (py_hex == NULL) return 0; err = PyBytes_AsStringAndSize(py_hex, &hex, &len); if (err) { Py_DECREF(py_hex); return 0; } err = git_oid_fromstrn(oid, hex, len); Py_DECREF(py_hex); if (err < 0) { PyErr_SetObject(Error_type(err), py_oid); return 0; } return (size_t)len; } /* Type error */ PyErr_SetObject(PyExc_TypeError, py_oid); return 0; }
PyObject* Error_set_str(int err, const char *str) { const git_error* error; if (err == GIT_ENOTFOUND) { /* KeyError expects the arg to be the missing key. */ PyErr_SetString(PyExc_KeyError, str); return NULL; } error = giterr_last(); if (error == NULL) /* Expected error - no error msg set */ return PyErr_Format(Error_type(err), "%s", str); return PyErr_Format(Error_type(err), "%s: %s", str, error->message); }
PyObject* Error_set(int err) { assert(err < 0); if(err != GIT_ERROR) { //expected failure PyErr_SetNone(Error_type(err)); } else { //critical failure const git_error* error = giterr_last(); char* message = (error == NULL) ? "(No error information given)" : error->message; PyErr_SetString(Error_type(err), message); } return NULL; }
PyObject * Error_set(int err) { assert(err < 0); return Error_set_exc(Error_type(err)); }
int py_str_to_git_oid(PyObject *py_str, git_oid *oid) { PyObject *py_hex; char *hex_or_bin; int err; Py_ssize_t len; /* Case 1: raw sha */ if (PyString_Check(py_str)) { hex_or_bin = PyString_AsString(py_str); if (hex_or_bin == NULL) return -1; git_oid_fromraw(oid, (const unsigned char*)hex_or_bin); return GIT_OID_HEXSZ; } /* Case 2: hex sha */ if (PyUnicode_Check(py_str)) { py_hex = PyUnicode_AsASCIIString(py_str); if (py_hex == NULL) return -1; err = PyString_AsStringAndSize(py_hex, &hex_or_bin, &len); if (err) { Py_DECREF(py_hex); return -1; } err = git_oid_fromstrn(oid, hex_or_bin, len); Py_DECREF(py_hex); if (err < 0) { PyErr_SetObject(Error_type(err), py_str); return -1; } return len; } /* Type error */ PyErr_Format(PyExc_TypeError, "Git object id must be byte or a text string, not: %.200s", Py_TYPE(py_str)->tp_name); return -1; }