Add child, location to SubversionException.
authorJelmer Vernooij <jelmer@samba.org>
Fri, 23 Jan 2009 22:43:08 +0000 (23:43 +0100)
committerJelmer Vernooij <jelmer@samba.org>
Fri, 23 Jan 2009 22:43:08 +0000 (23:43 +0100)
subvertpy/__init__.py
subvertpy/util.c

index b32c900845ff1914a2fcee7ceff5b2f1097c6fda..7c4ab7baae87974bcc3a7c757c55ebd6c35710ef 100644 (file)
@@ -64,6 +64,11 @@ ERR_RA_DAV_NOT_VCC = 20014
 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."""
index 0d296b8594b145aa4c807e6d626d7ab9d461851f..af3c7fb7824475a5a591cc625dbaaea037c69c6f 100644 (file)
@@ -54,14 +54,52 @@ apr_pool_t *Pool(apr_pool_t *parent)
        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) {
@@ -69,18 +107,9 @@ void PyErr_SetSubversionException(svn_error_t *error)
                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);