[[[
* subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c
(ra_callbacks_open_tmp_file): Allow Python open_tmp_file callback to be
None, as the C callback can be NULL.
(ra_callbacks_get_wc_prop, ra_callbacks_invalidate_wc_props,
ra_callbacks_set_wc_prop, ra_callbacks_push_wc_prop): New callback
wrappers, also allowing the Python callback to be None.
(ra_callbacks_push_or_set_wc_prop): New helper, the common implementation
of ra_callbacks_set_wc_prop and ra_callbacks_push_wc_prop.
(svn_swig_py_setup_ra_callbacks): Install wc_prop callbacks.
]]]
Index: subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c
===================================================================
--- subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c (revision 24935)
+++ subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c (working copy)
@@ -2601,23 +2601,31 @@ ra_callbacks_open_tmp_file(apr_file_t **
apr_pool_t *pool)
{
PyObject *callbacks = (PyObject *)callback_baton;
- PyObject *result;
+ PyObject *py_callback, *result;
svn_error_t *err = SVN_NO_ERROR;
+ *fp = NULL;
+
svn_swig_py_acquire_py_lock();
- if ((result = PyObject_CallMethod(callbacks,
- "open_tmp_file",
- (char *)"O&",
- make_ob_pool, pool)) == NULL)
+ py_callback = PyObject_GetAttrString(callbacks, (char *)"open_tmp_file");
+ if (py_callback == NULL)
{
err = callback_exception_error();
+ goto finished;
}
- else if (result == Py_None)
+ else if (py_callback == Py_None)
+ {
+ goto finished;
+ }
+
+ if ((result = PyObject_CallFunction(py_callback,
+ (char *)"O&",
+ make_ob_pool, pool)) == NULL)
{
- *fp = NULL;
+ err = callback_exception_error();
}
- else
+ else if (result != Py_None)
{
*fp = svn_swig_py_make_file(result, pool);
if (*fp == NULL)
@@ -2627,6 +2635,171 @@ ra_callbacks_open_tmp_file(apr_file_t **
}
Py_XDECREF(result);
+finished:
+ Py_XDECREF(py_callback);
+ svn_swig_py_release_py_lock();
+ return err;
+}
+
+/* svn_ra_callbacks_t */
+static svn_error_t *
+ra_callbacks_get_wc_prop(void *baton,
+ const char *path,
+ const char *name,
+ const svn_string_t **value,
+ apr_pool_t *pool)
+{
+ PyObject *callbacks = (PyObject *)baton;
+ PyObject *py_callback, *result;
+ svn_error_t *err = SVN_NO_ERROR;
+
+ *value = NULL;
+
+ svn_swig_py_acquire_py_lock();
+
+ py_callback = PyObject_GetAttrString(callbacks, (char *)"get_wc_prop");
+ if (py_callback == NULL)
+ {
+ err = callback_exception_error();
+ goto finished;
+ }
+ else if (py_callback == Py_None)
+ {
+ goto finished;
+ }
+
+ if ((result = PyObject_CallFunction(py_callback,
+ (char *)"ssO&", path, name,
+ make_ob_pool, pool)) == NULL)
+ {
+ err = callback_exception_error();
+ }
+ else if (result != Py_None)
+ {
+ char *buf;
+ int len;
+ if (PyString_AsStringAndSize(result, &buf, &len) == -1)
+ {
+ err = callback_exception_error();
+ }
+ else
+ {
+ *value = svn_string_ncreate(buf, len, pool);
+ }
+ }
+
+ Py_XDECREF(result);
+finished:
+ Py_XDECREF(py_callback);
+ svn_swig_py_release_py_lock();
+ return err;
+}
+
+/* svn_ra_callbacks_t */
+static svn_error_t *
+ra_callbacks_push_or_set_wc_prop(const char *callback,
+ void *baton,
+ const char *path,
+ const char *name,
+ const svn_string_t *value,
+ apr_pool_t *pool)
+{
+ PyObject *callbacks = (PyObject *)baton;
+ PyObject *py_callback, *py_value, *result;
+ svn_error_t *err = SVN_NO_ERROR;
+
+ svn_swig_py_acquire_py_lock();
+
+ py_callback = PyObject_GetAttrString(callbacks, (char *)callback);
+ if (py_callback == NULL)
+ {
+ err = callback_exception_error();
+ goto finished;
+ }
+ else if (py_callback == Py_None)
+ {
+ goto finished;
+ }
+
+ if ((py_value = PyString_FromStringAndSize(value->data, value->len)) == NULL)
+ {
+ err = callback_exception_error();
+ goto finished;
+ }
+
+ if ((result = PyObject_CallFunction(py_callback,
+ (char *)"ssOO&", path, name, py_value,
+ make_ob_pool, pool)) == NULL)
+ {
+ err = callback_exception_error();
+ }
+
+ Py_XDECREF(result);
+finished:
+ Py_XDECREF(py_callback);
+ svn_swig_py_release_py_lock();
+ return err;
+}
+
+/* svn_ra_callbacks_t */
+static svn_error_t *
+ra_callbacks_set_wc_prop(void *baton,
+ const char *path,
+ const char *name,
+ const svn_string_t *value,
+ apr_pool_t *pool)
+{
+ return ra_callbacks_push_or_set_wc_prop("set_wc_prop", baton, path,
+ name, value, pool);
+}
+
+/* svn_ra_callbacks_t */
+static svn_error_t *
+ra_callbacks_push_wc_prop(void *baton,
+ const char *path,
+ const char *name,
+ const svn_string_t *value,
+ apr_pool_t *pool)
+{
+ return ra_callbacks_push_or_set_wc_prop("push_wc_prop", baton, path,
+ name, value, pool);
+}
+
+/* svn_ra_callbacks_t */
+static svn_error_t *
+ra_callbacks_invalidate_wc_props(void *baton,
+ const char *path,
+ const char *name,
+ apr_pool_t *pool)
+{
+ PyObject *callbacks = (PyObject *)baton;
+ PyObject *py_callback, *result;
+ svn_error_t *err = SVN_NO_ERROR;
+
+ svn_swig_py_acquire_py_lock();
+
+ py_callback = PyObject_GetAttrString(callbacks,
+ (char *)"invalidate_wc_prop");
+ if (py_callback == NULL)
+ {
+ err = callback_exception_error();
+ goto finished;
+ }
+ else if (py_callback == Py_None)
+ {
+ goto finished;
+ }
+
+ if ((result = PyObject_CallFunction(py_callback,
+ (char *)"ssO&", path, name,
+ make_ob_pool, pool)) == NULL)
+ {
+ err = callback_exception_error();
+ }
+
+ Py_XDECREF(result);
+finished:
+ Py_XDECREF(py_callback);
svn_swig_py_release_py_lock();
return err;
}
@@ -2648,7 +2821,7 @@ svn_swig_py_setup_ra_callbacks(svn_ra_ca
(*callbacks)->open_tmp_file = ra_callbacks_open_tmp_file;
- py_auth_baton = PyObject_GetAttrString(py_callbacks, "auth_baton");
+ py_auth_baton = PyObject_GetAttrString(py_callbacks, (char *)"auth_baton");
if (svn_swig_ConvertPtrString(py_auth_baton,
(void **)&((*callbacks)->auth_baton),
@@ -2662,6 +2835,11 @@ svn_swig_py_setup_ra_callbacks(svn_ra_ca
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;
+
*baton = py_callbacks;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Fri May 4 20:59:30 2007