class SubversionException(Exception):
"""A Subversion exception"""
+ def __init__(self, msg, num, child=None, location=None):
+ self.args = (msg, num)
+ self.child = child
+ self.location = location
+
def _check_mtime(m):
"""Check whether a C extension is out of date."""
return ret;
}
+PyTypeObject *PyErr_GetSubversionExceptionTypeObject(void)
+{
+ PyObject *coremod, *excobj;
+ coremod = PyImport_ImportModule("subvertpy");
+
+ if (coremod == NULL) {
+ return NULL;
+ }
+
+ excobj = PyObject_GetAttrString(coremod, "SubversionException");
+
+ if (excobj == NULL) {
+ PyErr_BadInternalCall();
+ return NULL;
+ }
+
+ return (PyTypeObject *)excobj;
+}
+
PyObject *PyErr_NewSubversionException(svn_error_t *error)
{
- return Py_BuildValue("(si)", error->message, error->apr_err);
+ PyObject *loc, *child;
+
+ if (error->file != NULL) {
+ loc = Py_BuildValue("(si)", error->file, error->line);
+ } else {
+ loc = Py_None;
+ Py_INCREF(loc);
+ }
+
+ if (error->child != NULL) {
+ PyTypeObject *cls = PyErr_GetSubversionExceptionTypeObject();
+ PyObject *args = PyErr_NewSubversionException(error->child);
+ child = cls->tp_new(cls, args, NULL);
+ if (cls->tp_init != NULL)
+ cls->tp_init(child, args, NULL);
+ Py_DECREF(args);
+ } else {
+ child = Py_None;
+ }
+
+ return Py_BuildValue("(siOO)", error->message, error->apr_err, child, loc);
}
void PyErr_SetSubversionException(svn_error_t *error)
{
- PyObject *coremod;
PyObject *excval, *excobj;
if (error->apr_err < 1000) {
return;
}
- coremod = PyImport_ImportModule("subvertpy");
-
- if (coremod == NULL) {
+ excobj = (PyObject *)PyErr_GetSubversionExceptionTypeObject();
+ if (excobj == NULL)
return;
- }
-
- excobj = PyObject_GetAttrString(coremod, "SubversionException");
-
- if (excobj == NULL) {
- PyErr_BadInternalCall();
- return;
- }
excval = PyErr_NewSubversionException(error);
PyErr_SetObject(excobj, excval);