Index: subversion/bindings/swig/svn_ra.i =================================================================== --- subversion/bindings/swig/svn_ra.i (revision 19983) +++ subversion/bindings/swig/svn_ra.i (working copy) @@ -134,7 +134,7 @@ #endif #ifdef SWIGPYTHON -%typemap(in) (svn_ra_callbacks2_t *callbacks, +%typemap(in) (const svn_ra_callbacks2_t *callbacks, void *callback_baton) { svn_swig_py_setup_ra_callbacks(&$1, &$2, $input, _global_pool); } Index: subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c =================================================================== --- subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c (revision 19983) +++ subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c (working copy) @@ -2182,12 +2182,227 @@ return err; } +/* svn_ra_callbacks_t */ +static svn_error_t * +ra_callbacks_open_tmp_file(apr_file_t **fp, + void *callback_baton, + apr_pool_t *pool) +{ + PyObject *callbacks = (PyObject *)callback_baton; + PyObject *result; + svn_error_t *err = SVN_NO_ERROR; + + svn_swig_py_acquire_py_lock(); + + if ((result = PyObject_CallMethod(callbacks, + "open_tmp_file", + (char *)"O&", + make_ob_pool, pool)) == NULL) + { + err = callback_exception_error(); + } + else if (result == Py_None) + { + *fp = NULL; + } + else + { + *fp = svn_swig_py_make_file(result, pool); + if (*fp == NULL) + { + err = callback_exception_error(); + } + } + + Py_DECREF(result); + svn_swig_py_release_py_lock(); + return err; +} + +static svn_error_t * +ra_callbacks_get_wc_prop(void *callback_baton, + const char *relpath, + const char *name, + const svn_string_t **value, + apr_pool_t *pool) +{ + PyObject *callbacks = (PyObject *)callback_baton; + PyObject *result; + svn_error_t *err = SVN_NO_ERROR; + + svn_swig_py_acquire_py_lock(); + + if ((result = PyObject_CallMethod(callbacks, + "get_wc_prop", + (char *)"ssO&", + relpath, name, + make_ob_pool, pool)) == NULL) + { + err = callback_exception_error(); + } + else if (result == Py_None) + { + *value = NULL; + } + else + { + *value = make_svn_string_from_ob(result, pool); + if (*value == NULL) + { + err = callback_exception_error(); + } + } + + Py_DECREF(result); + svn_swig_py_release_py_lock(); + + return err; +} + +static svn_error_t * +ra_callbacks_set_wc_prop(void *callback_baton, + const char *path, + const char *name, + const svn_string_t *value, + apr_pool_t *pool) +{ + PyObject *callbacks = (PyObject *)callback_baton; + PyObject *result; + PyObject *py_value; + svn_error_t *err = SVN_NO_ERROR; + + svn_swig_py_acquire_py_lock(); + + py_value = PyString_FromStringAndSize((void *)value->data, value->len); + + if ((result = PyObject_CallMethod(callbacks, + "set_wc_prop", + (char *)"ssOO&", + path, name, + py_value, + make_ob_pool, pool)) == NULL) + { + err = callback_exception_error(); + } + else if (result != Py_None) + { + err = callback_bad_return_error("Not None"); + } + + Py_DECREF(result); + Py_DECREF(py_value); + svn_swig_py_release_py_lock(); + + return err; +} + +static svn_error_t * +ra_callbacks_push_wc_prop(void *callback_baton, + const char *path, + const char *name, + const svn_string_t *value, + apr_pool_t *pool) +{ + PyObject *callbacks = (PyObject *)callback_baton; + PyObject *result; + PyObject *py_value; + svn_error_t *err = SVN_NO_ERROR; + + svn_swig_py_acquire_py_lock(); + + py_value = PyString_FromStringAndSize((void *)value->data, value->len); + + if ((result = PyObject_CallMethod(callbacks, + "push_wc_prop", + (char *)"ssOO&", + path, name, + py_value, + make_ob_pool, pool)) == NULL) + { + err = callback_exception_error(); + } + else if (result != Py_None) + { + err = callback_bad_return_error("Not None"); + } + + Py_DECREF(py_value); + Py_DECREF(result); + svn_swig_py_release_py_lock(); + + return err; +} + +static svn_error_t * +ra_callbacks_invalidate_wc_props(void *callback_baton, + const char *path, + const char *name, + apr_pool_t *pool) +{ + PyObject *callbacks = (PyObject *)callback_baton; + PyObject *result; + svn_error_t *err = SVN_NO_ERROR; + + svn_swig_py_acquire_py_lock(); + + if ((result = PyObject_CallMethod(callbacks, + "push_wc_prop", + (char *)"ssO&", + path, name, + make_ob_pool, pool)) == NULL) + { + err = callback_exception_error(); + } + else if (result != Py_None) + { + err = callback_bad_return_error("Not None"); + } + + Py_DECREF(result); + svn_swig_py_release_py_lock(); + + return err; +} + + +static void +ra_callbacks_progress_func(apr_off_t progress, + apr_off_t total, + void *callback_baton, + apr_pool_t *pool) +{ + PyObject *callbacks = (PyObject *)callback_baton; + PyObject *result; + svn_error_t *err = SVN_NO_ERROR; + + svn_swig_py_acquire_py_lock(); + + if ((result = PyObject_CallMethod(callbacks, + "progress", + (char *)"iiO&", + progress, total, + make_ob_pool, pool)) == NULL) + { + err = callback_exception_error(); + svn_swig_py_svn_exception(err); + } + else if (result != Py_None) + { + err = callback_bad_return_error("Not None"); + svn_swig_py_svn_exception(err); + } + + Py_DECREF(result); + svn_swig_py_release_py_lock(); +} + void svn_swig_py_setup_ra_callbacks(svn_ra_callbacks2_t **callbacks, void **baton, PyObject *py_callbacks, apr_pool_t *pool) { + PyObject *py_auth_baton; svn_error_t *err = svn_ra_create_callbacks(callbacks, pool); if (err) @@ -2196,6 +2411,28 @@ return; } + (*callbacks)->open_tmp_file = ra_callbacks_open_tmp_file; + + py_auth_baton = PyObject_GetAttrString(py_callbacks, "auth_baton"); + + if (svn_swig_ConvertPtrString(py_auth_baton, + (void **)&((*callbacks)->auth_baton), + "svn_auth_baton_t *")) + { + err = type_conversion_error("svn_auth_baton_t *"); + svn_swig_py_svn_exception(err); + Py_DECREF(py_auth_baton); + return; + } + + Py_XDECREF(py_auth_baton); + + (*callbacks)->get_wc_prop = ra_callbacks_get_wc_prop; + (*callbacks)->set_wc_prop = ra_callbacks_set_wc_prop; + (*callbacks)->push_wc_prop = ra_callbacks_push_wc_prop; + (*callbacks)->invalidate_wc_props = ra_callbacks_invalidate_wc_props; + (*callbacks)->progress_func = ra_callbacks_progress_func; + (*callbacks)->progress_baton = (void *)py_callbacks; *baton = py_callbacks; }