Esempio n. 1
0
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;
}
Esempio n. 2
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);
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
PyObject *
Error_set(int err)
{
    assert(err < 0);

    return Error_set_exc(Error_type(err));
}
Esempio n. 5
0
File: oid.c Progetto: cholin/pygit2
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;
}