Merge remote branch 'cholin/new-error-handling'

This commit is contained in:
J. David Ibáñez
2012-05-19 17:10:29 +02:00

View File

@@ -165,46 +165,62 @@ static PyTypeObject SignatureType;
static PyObject *GitError; static PyObject *GitError;
static PyObject * static PyObject *
Error_type(int err) Error_type(int type)
{ {
switch (err) { // Expected
switch (type) {
/** Input does not exist in the scope searched. */
case GIT_ENOTFOUND: case GIT_ENOTFOUND:
return PyExc_KeyError; return PyExc_KeyError;
case GIT_EOSERR:
return PyExc_OSError; /** A reference with this name already exists */
case GIT_ENOTOID: case GIT_EEXISTS:
return PyExc_ValueError; return PyExc_ValueError;
case GIT_ENOMEM:
return PyExc_MemoryError; /** The given short oid is ambiguous */
case GIT_EREVWALKOVER: case GIT_EAMBIGUOUS:
return PyExc_ValueError;
/** The buffer is too short to satisfy the request */
case GIT_EBUFS:
return PyExc_ValueError;
/** Skip and passthrough the given ODB backend */
case GIT_PASSTHROUGH:
return GitError;
/** No entries left in ref walker */
case GIT_REVWALKOVER:
return PyExc_StopIteration; return PyExc_StopIteration;
}
// Critical
const git_error* error = giterr_last();
switch (error->klass) {
case GITERR_NOMEMORY:
return PyExc_MemoryError;
case GITERR_OS:
return PyExc_OSError;
case GITERR_INVALID:
return PyExc_ValueError;
default: default:
return GitError; return GitError;
} }
} }
/*
* Python doesn't like it when the error string is NULL. Not giving
* back an error string could be a bug in the library
*/
static const char *
git_last_error(void)
{
const char *ret;
ret = git_lasterror();
return ret != NULL ? ret : "(No error information given)";
}
static PyObject * static PyObject *
Error_set(int err) Error_set(int err)
{ {
assert(err < 0); assert(err < 0);
if (err == GIT_EOSERR) if(err != GIT_ERROR) { //expected failure
return PyErr_SetFromErrno(GitError); PyErr_SetNone(Error_type(err));
} else { //critical failure
const git_error* error = giterr_last();
PyErr_SetString(Error_type(err), error->message);
}
PyErr_SetString(Error_type(err), git_last_error());
return NULL; return NULL;
} }
@@ -217,7 +233,8 @@ Error_set_str(int err, const char *str)
return NULL; return NULL;
} }
return PyErr_Format(Error_type(err), "%s: %s", str, git_last_error()); const git_error* error = giterr_last();
return PyErr_Format(Error_type(err), "%s: %s", str, error->message);
} }
static PyObject * static PyObject *
@@ -857,7 +874,7 @@ Repository_listall_references(Repository *self, PyObject *args)
return NULL; return NULL;
/* 2- Get the C result */ /* 2- Get the C result */
err = git_reference_listall(&c_result, self->repo, list_flags); err = git_reference_list(&c_result, self->repo, list_flags);
if (err < 0) if (err < 0)
return Error_set(err); return Error_set(err);
@@ -976,7 +993,7 @@ read_status_cb(const char *path, unsigned int status_flags, void *payload)
flags = PyInt_FromLong((long) status_flags); flags = PyInt_FromLong((long) status_flags);
PyDict_SetItemString(payload, path, flags); PyDict_SetItemString(payload, path, flags);
return GIT_SUCCESS; return GIT_OK;
} }
static PyObject * static PyObject *
@@ -1028,7 +1045,8 @@ Repository_TreeBuilder(Repository *self, PyObject *args)
if (PyObject_TypeCheck(py_src, &TreeType)) { if (PyObject_TypeCheck(py_src, &TreeType)) {
Tree *py_tree = (Tree *)py_src; Tree *py_tree = (Tree *)py_src;
if (py_tree->repo->repo != self->repo) { if (py_tree->repo->repo != self->repo) {
return Error_set(GIT_EINVALIDARGS); //return Error_set(GIT_EINVALIDARGS);
return Error_set(GIT_ERROR);
} }
tree = py_tree->tree; tree = py_tree->tree;
} else { } else {
@@ -2140,7 +2158,7 @@ Index_read(Index *self)
int err; int err;
err = git_index_read(self->index); err = git_index_read(self->index);
if (err < GIT_SUCCESS) if (err < GIT_OK)
return Error_set(err); return Error_set(err);
Py_RETURN_NONE; Py_RETURN_NONE;
@@ -2152,7 +2170,7 @@ Index_write(Index *self)
int err; int err;
err = git_index_write(self->index); err = git_index_write(self->index);
if (err < GIT_SUCCESS) if (err < GIT_OK)
return Error_set(err); return Error_set(err);
Py_RETURN_NONE; Py_RETURN_NONE;
@@ -2890,7 +2908,7 @@ Reference_get_hex(Reference *self)
static PyObject * static PyObject *
Reference_get_type(Reference *self) Reference_get_type(Reference *self)
{ {
git_rtype c_type; git_ref_t c_type;
CHECK_REFERENCE(self); CHECK_REFERENCE(self);
c_type = git_reference_type(self->reference); c_type = git_reference_type(self->reference);