Files
deb-python-pygit2/src/error.c

129 lines
3.5 KiB
C

/*
* Copyright 2010-2013 The pygit2 contributors
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2,
* as published by the Free Software Foundation.
*
* In addition to the permissions in the GNU General Public License,
* the authors give you unlimited permission to link the compiled
* version of this file into combinations with other programs,
* and to distribute those combinations without any restriction
* coming from the use of this file. (The General Public License
* restrictions do apply in other respects; for example, they cover
* modification of the file, and distribution when not linked into
* a combined executable.)
*
* This file is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "error.h"
PyObject *GitError;
PyObject *
Error_type(int type)
{
const git_error* error;
/* Expected */
switch (type) {
/* Input does not exist in the scope searched. */
case GIT_ENOTFOUND:
return PyExc_KeyError;
/* A reference with this name already exists */
case GIT_EEXISTS:
return PyExc_ValueError;
/* The given short oid is ambiguous */
case GIT_EAMBIGUOUS:
return PyExc_ValueError;
/* The buffer is too short to satisfy the request */
case GIT_EBUFS:
return PyExc_ValueError;
/* Invalid input spec */
case GIT_EINVALIDSPEC:
return PyExc_ValueError;
/* Skip and passthrough the given ODB backend */
case GIT_PASSTHROUGH:
return GitError;
/* No entries left in ref walker */
case GIT_ITEROVER:
return PyExc_StopIteration;
}
/* Critical */
error = giterr_last();
if (error != NULL) {
switch (error->klass) {
case GITERR_NOMEMORY:
return PyExc_MemoryError;
case GITERR_OS:
return PyExc_OSError;
case GITERR_INVALID:
return PyExc_ValueError;
}
}
return GitError;
}
PyObject *
Error_set(int err)
{
assert(err < 0);
return Error_set_exc(Error_type(err));
}
PyObject *
Error_set_exc(PyObject* exception)
{
const git_error* error = giterr_last();
char* message = (error == NULL) ?
"(No error information given)" : error->message;
PyErr_SetString(exception, message);
return NULL;
}
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_oid(int err, const git_oid *oid, size_t len)
{
char hex[GIT_OID_HEXSZ + 1];
git_oid_fmt(hex, oid);
hex[len] = '\0';
return Error_set_str(err, hex);
}