Author: philip
Date: Sat Feb 28 02:32:33 2015
New Revision: 1662891

URL: http://svn.apache.org/r1662891
Log:
Fix SWIG Python support for svn_ra_lock and svn_ra_unlock.

* subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c
  (svn_swig_py_ra_lock_callback): Pass ra_err.

* subversion/bindings/swig/python/tests/ra.py
  (test_lock): Setup simple username provider, extend test, expect lock
   and unlock to work.

Modified:
    
subversion/trunk/subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c
    subversion/trunk/subversion/bindings/swig/python/tests/ra.py

Modified: 
subversion/trunk/subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c?rev=1662891&r1=1662890&r2=1662891&view=diff
==============================================================================
--- 
subversion/trunk/subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c 
(original)
+++ 
subversion/trunk/subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c 
Sat Feb 28 02:32:33 2015
@@ -4296,9 +4296,10 @@ svn_error_t *svn_swig_py_ra_lock_callbac
   svn_swig_py_acquire_py_lock();
 
   if ((result = PyObject_CallFunction(py_callback,
-                                     (char *)"sbO&O&",
+                                     (char *)"sbO&O&O&",
                                      path, do_lock,
                                      make_ob_lock, lock,
+                                     make_ob_error, ra_err,
                                      make_ob_pool, pool)) == NULL)
     {
       err = callback_exception_error();

Modified: subversion/trunk/subversion/bindings/swig/python/tests/ra.py
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/swig/python/tests/ra.py?rev=1662891&r1=1662890&r2=1662891&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/swig/python/tests/ra.py (original)
+++ subversion/trunk/subversion/bindings/swig/python/tests/ra.py Sat Feb 28 
02:32:33 2015
@@ -298,13 +298,53 @@ class SubversionRepositoryAccessTestCase
     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))
+
+    self.calls = 0
+    self.locks = 0
+    self.errors = 0
+    def callback(path, do_lock, lock, ra_err, pool):
+      self.calls += 1
+      self.assertEqual(path, "trunk/README2.txt")
+      if lock:
+        self.assertEqual(lock.owner, "jrandom")
+        self.locks += 1
+      if ra_err:
+        self.assert_(ra_err.apr_err == core.SVN_ERR_FS_PATH_ALREADY_LOCKED
+                     or ra_err.apr_err == core.SVN_ERR_FS_NO_SUCH_LOCK)
+        self.errors += 1
+
+    providers = [core.svn_auth_get_username_provider()]
+    self.callbacks.auth_baton = core.svn_auth_open(providers)
+    core.svn_auth_set_parameter(self.callbacks.auth_baton,
+                                core.SVN_AUTH_PARAM_DEFAULT_USERNAME,
+                                "jrandom")
+    self.ra_ctx = ra.open2(self.repos_uri, self.callbacks, {})
+    rev = fs.youngest_rev(self.fs)
+    ra.lock(self.ra_ctx, {"trunk/README2.txt":rev}, "sleutel", False, callback)
+    self.assertEqual(self.calls, 1)
+    self.assertEqual(self.locks, 1)
+    self.assertEqual(self.errors, 0)
+
+    self.calls = 0
+    self.locks = 0
+    ra.lock(self.ra_ctx, {"trunk/README2.txt":rev}, "sleutel", False, callback)
+    self.assertEqual(self.calls, 1)
+    self.assertEqual(self.locks, 0)
+    self.assertEqual(self.errors, 1)
+
+    self.calls = 0
+    self.errors = 0
+    the_lock = fs.get_lock(self.fs, "/trunk/README2.txt")
+    ra.unlock(self.ra_ctx, {"trunk/README2.txt":the_lock.token}, False, 
callback)
+    self.assertEqual(self.calls, 1)
+    self.assertEqual(self.locks, 0)
+    self.assertEqual(self.errors, 0)
+
+    self.calls = 0
+    ra.unlock(self.ra_ctx, {"trunk/README2.txt":the_lock.token}, False, 
callback)
+    self.assertEqual(self.calls, 1)
+    self.assertEqual(self.locks, 0)
+    self.assertEqual(self.errors, 1)
 
   def test_get_log2(self):
     # Get an interesting commmit.


Reply via email to