Index: subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c =================================================================== --- subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c (revision 19810) +++ subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c (working copy) @@ -552,6 +552,7 @@ DECLARE_SWIG_CONSTRUCTOR(auth_ssl_server_cert_info, svn_auth_ssl_server_cert_info_dup) DECLARE_SWIG_CONSTRUCTOR(info, svn_info_dup) +DECLARE_SWIG_CONSTRUCTOR(string, svn_string_dup) DECLARE_SWIG_CONSTRUCTOR(commit_info, svn_commit_info_dup) static PyObject *convert_log_changed_path(void *value, void *ctx, @@ -2144,12 +2145,219 @@ 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 + { + if (svn_swig_ConvertPtrString(result, (void **)fp, + "apr_file_t *") == -1) + { + err = type_conversion_error + ("apr_file_t *"); + 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 + { + if (svn_swig_ConvertPtrString(result, (void **)value, + "svn_value_t *") == -1) + { + err = type_conversion_error("svn_value_t *"); + 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; + svn_error_t *err = SVN_NO_ERROR; + + svn_swig_py_acquire_py_lock(); + + if ((result = PyObject_CallMethod(callbacks, + "set_wc_prop", + (char *)"ssO&O&", + path, name, + make_ob_string, 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); + } + + 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; + svn_error_t *err = SVN_NO_ERROR; + + svn_swig_py_acquire_py_lock(); + + if ((result = PyObject_CallMethod(callbacks, + "push_wc_prop", + (char *)"ssO&O&", + path, name, + make_ob_string, 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); + } + + 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"); + 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) @@ -2158,6 +2366,26 @@ 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 *") == -1) + { + err = type_conversion_error("svn_auth_baton_t *"); + svn_swig_py_svn_exception(err); + Py_DECREF(py_auth_baton); + return; + } + + (*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; }