=== modified file 'subversion/bindings/swig/include/svn_containers.swg' --- subversion/bindings/swig/include/svn_containers.swg 2007-07-20 13:15:13 +0000 +++ subversion/bindings/swig/include/svn_containers.swg 2007-07-20 14:04:50 +0000 @@ -289,6 +289,13 @@ } #endif +#ifdef SWIGPYTHON +%typemap(in) apr_hash_t *path_revs +{ + $1 = svn_swig_py_path_revs_hash_from_dict($input, _global_pool); +} +#endif + /* ======================================================================= %typemap(argout) apr_array_header_t ** */ === modified file 'subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c' --- subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c 2007-07-20 13:15:13 +0000 +++ subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c 2007-07-20 14:21:51 +0000 @@ -979,6 +979,58 @@ return hash; } +apr_hash_t *svn_swig_py_path_revs_hash_from_dict(PyObject *dict, + apr_pool_t *pool) +{ + apr_hash_t *hash; + PyObject *keys; + int i, num_keys; + + if (dict == Py_None) + return NULL; + + if (!PyDict_Check(dict)) + { + PyErr_SetString(PyExc_TypeError, "not a dictionary"); + return NULL; + } + + hash = apr_hash_make(pool); + keys = PyDict_Keys(dict); + num_keys = PyList_Size(keys); + for (i = 0; i < num_keys; i++) + { + PyObject *key = PyList_GetItem(keys, i); + PyObject *value = PyDict_GetItem(dict, key); + const char *path = make_string_from_ob(key, pool); + svn_revnum_t *revnum; + + if (!(path)) + { + PyErr_SetString(PyExc_TypeError, + "dictionary keys aren't strings"); + Py_DECREF(keys); + return NULL; + } + + revnum = apr_palloc(pool, sizeof(svn_revnum_t)); + + if (PyInt_Check(value)) + *revnum = PyInt_AsLong(value); + else if (PyLong_Check(value)) + *revnum = PyLong_AsLong(value); + else + { + PyErr_SetString(PyExc_TypeError, "dictionary values aren't revnums"); + Py_DECREF(keys); + return NULL; + } + + apr_hash_set(hash, path, APR_HASH_KEY_STRING, revnum); + } + Py_DECREF(keys); + return hash; +} const apr_array_header_t *svn_swig_py_strings_to_array(PyObject *source, apr_pool_t *pool) @@ -2971,6 +3023,42 @@ return err; } +svn_error_t *svn_swig_py_ra_lock_callback( + void *baton, + const char *path, + svn_boolean_t do_lock, + const svn_lock_t *lock, + svn_error_t *ra_err, + apr_pool_t *pool) +{ + svn_error_t *err = SVN_NO_ERROR; + PyObject *py_callback = baton, *result; + + if (py_callback == NULL || py_callback == Py_None) + return SVN_NO_ERROR; + + svn_swig_py_acquire_py_lock(); + + if ((result = PyObject_CallFunction(py_callback, + (char *)"sbO&O&", + path, do_lock, + make_ob_lock, lock, + make_ob_pool, pool)) == NULL) + { + err = callback_exception_error(); + } + else if (result != Py_None) + { + err = callback_bad_return_error("Not None"); + } + + Py_XDECREF(result); + + svn_swig_py_release_py_lock(); + + return err; +} + static svn_error_t *reporter_set_path(void *report_baton, const char *path, svn_revnum_t revision, === modified file 'subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h' --- subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h 2007-07-20 13:15:13 +0000 +++ subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h 2007-07-20 14:21:06 +0000 @@ -220,6 +220,13 @@ apr_hash_t *svn_swig_py_prophash_from_dict(PyObject *dict, apr_pool_t *pool); +/* helper function to convert a Python dictionary mapping strings to + integers into an apr_hash_t mapping const char *'s to revnums, + allocated in POOL. */ +SVN_SWIG_SWIGUTIL_EXPORT +apr_hash_t *svn_swig_py_path_revs_hash_from_dict(PyObject *dict, + apr_pool_t *pool); + /* helper function to convert a Python sequence of strings into an 'apr_array_header_t *' of 'const char *' objects. Note that the objects must remain alive -- the values are not copied. This is @@ -425,6 +432,15 @@ apr_pool_t *pool); SVN_SWIG_SWIGUTIL_EXPORT +svn_error_t *svn_swig_py_ra_lock_callback( + void *baton, + const char *path, + svn_boolean_t do_lock, + const svn_lock_t *lock, + svn_error_t *ra_err, + apr_pool_t *pool); + +SVN_SWIG_SWIGUTIL_EXPORT extern const svn_ra_reporter2_t swig_py_ra_reporter2; #ifdef __cplusplus === modified file 'subversion/bindings/swig/python/tests/ra.py' --- subversion/bindings/swig/python/tests/ra.py 2007-06-12 22:52:07 +0000 +++ subversion/bindings/swig/python/tests/ra.py 2007-07-20 14:20:05 +0000 @@ -164,6 +164,15 @@ ra.get_file_revs(self.ra_ctx, "trunk/README.txt", 0, 10, rev_handler) + def test_lock(self): + def callback(baton, path, do_lock, lock, ra_err, pool): + pass + # This test merely makes sure that the arguments can be wrapped + # properly. svn.ra.lock() currently fails because it is not possible + # to retrieve the username from the auth_baton yet. + self.assertRaises(core.SubversionException, + lambda: ra.lock(self.ra_ctx, {"/": 0}, "sleutel", False, callback)) + def test_update(self): class TestEditor(delta.Editor): pass === modified file 'subversion/bindings/swig/svn_ra.i' --- subversion/bindings/swig/svn_ra.i 2007-04-03 07:12:48 +0000 +++ subversion/bindings/swig/svn_ra.i 2007-07-20 14:04:50 +0000 @@ -91,9 +91,9 @@ svn_swig_rb_ra_file_rev_handler) #endif -#ifdef SWIGRUBY +#ifndef SWIGPERL %callback_typemap(svn_ra_lock_callback_t lock_func, void *lock_baton, - , + svn_swig_py_ra_lock_callback, , svn_swig_rb_ra_lock_callback) #endif