Index: subversion/bindings/swig/svn_ra.i =================================================================== --- subversion/bindings/swig/svn_ra.i (revision 20114) +++ subversion/bindings/swig/svn_ra.i (working copy) @@ -166,6 +166,14 @@ } #endif +#ifdef SWIGPYTHON +%typemap(in) (svn_ra_file_rev_handler_t handler, void *handler_baton) +{ + $1 = svn_swig_py_ra_file_rev_handler_func; + $2 = (void *)$input; +} +#endif + /* ----------------------------------------------------------------------- */ %{ Index: subversion/bindings/swig/python/tests/ra.py =================================================================== --- subversion/bindings/swig/python/tests/ra.py (revision 20114) +++ subversion/bindings/swig/python/tests/ra.py (working copy) @@ -67,6 +67,13 @@ child = delta.editor_invoke_add_directory(editor, "bla", root, None, 0) delta.editor_invoke_close_edit(editor, edit_baton) + def test_get_file_revs(self): + def rev_handler(path, rev, rev_props, prop_diffs, pool): + self.assert_(rev == 2 or rev == 3) + self.assertEqual(path, "/trunk/README.txt") + + ra.get_file_revs(self.ra_ctx, "trunk/README.txt", 0, 10, rev_handler) + def test_update(self): class TestEditor(delta.Editor): pass Index: subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c =================================================================== --- subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c (revision 20114) +++ subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c (working copy) @@ -2231,4 +2231,56 @@ return err; } +svn_error_t *svn_swig_py_ra_file_rev_handler_func( + void *baton, + const char *path, + svn_revnum_t rev, + apr_hash_t *rev_props, + svn_txdelta_window_handler_t *delta_handler, + void **delta_baton, + apr_array_header_t *prop_diffs, + apr_pool_t *pool) +{ + PyObject *handler = baton; + PyObject *result, *py_rev_props, *py_prop_diffs; + svn_error_t *err = SVN_NO_ERROR; + + if ((handler == NULL) || (handler == Py_None)) + return SVN_NO_ERROR; + svn_swig_py_acquire_py_lock(); + + py_rev_props = svn_swig_py_prophash_to_dict(rev_props); + + py_prop_diffs = svn_swig_py_array_to_list(prop_diffs); + + if ((result = PyObject_CallFunction(handler, + (char *)"slOOO&", + path, rev, py_rev_props, prop_diffs, + make_ob_pool, pool)) == NULL) + { + err = callback_exception_error(); + } + else + { + if (result != Py_None) + err = callback_bad_return_error("Not None"); + + /* FIXME: Support returned TxDeltaWindow object and + * set delta_handler and delta_baton */ + *delta_handler = NULL; + *delta_baton = NULL; + + Py_XDECREF(result); + } + + Py_XDECREF(py_rev_props); + Py_XDECREF(py_prop_diffs); + + svn_swig_py_release_py_lock(); + + return err; +} + + + Index: subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h =================================================================== --- subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h (revision 20114) +++ subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h (working copy) @@ -324,6 +324,16 @@ void *baton, apr_pool_t *pool); +SVN_SWIG_SWIGUTIL_EXPORT +svn_error_t *svn_swig_py_ra_file_rev_handler_func( + void *baton, + const char *path, + svn_revnum_t rev, + apr_hash_t *rev_props, + svn_txdelta_window_handler_t *delta_handler, + void **delta_baton, + apr_array_header_t *prop_diffs, + apr_pool_t *pool); #ifdef __cplusplus }