You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by rh...@apache.org on 2011/04/27 02:54:14 UTC

svn commit: r1096975 - in /subversion/trunk/subversion: libsvn_ra_serf/locks.c tests/cmdline/lock_tests.py

Author: rhuijben
Date: Wed Apr 27 00:54:14 2011
New Revision: 1096975

URL: http://svn.apache.org/viewvc?rev=1096975&view=rev
Log:
Fix issue #3794 and #3801, for ra_serf.

* subversion/libsvn_ra_serf/locks.c
  (svn_ra_serf__unlock): On http status 403 provide the expected error type to
    the lock callback.

* subversion/tests/cmdline/lock_tests.py
  (unlock_wrong_token,
   unlocked_lock_of_other_user): Remove XFail for these tests for ra_serf,
      by making the XFail neon specific.

Modified:
    subversion/trunk/subversion/libsvn_ra_serf/locks.c
    subversion/trunk/subversion/tests/cmdline/lock_tests.py

Modified: subversion/trunk/subversion/libsvn_ra_serf/locks.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_serf/locks.c?rev=1096975&r1=1096974&r2=1096975&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_serf/locks.c (original)
+++ subversion/trunk/subversion/libsvn_ra_serf/locks.c Wed Apr 27 00:54:14 2011
@@ -695,7 +695,9 @@ svn_ra_serf__unlock(svn_ra_session_t *ra
       const char *req_url, *path, *token;
       const void *key;
       void *val;
+      svn_lock_t *existing_lock;
       struct unlock_context_t unlock_ctx;
+      svn_error_t *lock_err = NULL;
 
       svn_pool_clear(subpool);
 
@@ -707,10 +709,9 @@ svn_ra_serf__unlock(svn_ra_session_t *ra
 
       if (force && (!token || token[0] == '\0'))
         {
-          svn_lock_t *lock;
-
-          SVN_ERR(svn_ra_serf__get_lock(ra_session, &lock, path, subpool));
-          token = lock->token;
+          SVN_ERR(svn_ra_serf__get_lock(ra_session, &existing_lock, path,
+                                        subpool));
+          token = existing_lock->token;
           if (!token)
             {
               svn_error_t *err;
@@ -753,15 +754,28 @@ svn_ra_serf__unlock(svn_ra_session_t *ra
       svn_ra_serf__request_create(handler);
       SVN_ERR(svn_ra_serf__context_run_wait(&ctx->done, session, subpool));
 
-      if (ctx->status != 204)
+      switch (ctx->status)
         {
-           return svn_error_createf(SVN_ERR_RA_DAV_REQUEST_FAILED, NULL,
-                                    _("Unlock request failed: %d %s"),
-                                    ctx->status, ctx->reason);
+          case 204:
+            break; /* OK */
+          case 403:
+            /* Api users expect this specific error code to detect failures */
+            lock_err = svn_error_createf(SVN_ERR_FS_LOCK_OWNER_MISMATCH, NULL,
+                                         _("Unlock request failed: %d %s"),
+                                         ctx->status, ctx->reason);
+            break;
+          default:
+            lock_err = svn_error_createf(SVN_ERR_RA_DAV_REQUEST_FAILED, NULL,
+                                   _("Unlock request failed: %d %s"),
+                                   ctx->status, ctx->reason);
         }
 
       if (lock_func)
-        SVN_ERR(lock_func(lock_baton, path, FALSE, NULL, NULL, subpool));
+        {
+          SVN_ERR(lock_func(lock_baton, path, FALSE, existing_lock,
+                            lock_err, subpool));
+          svn_error_clear(lock_err);
+        }
     }
 
   return SVN_NO_ERROR;

Modified: subversion/trunk/subversion/tests/cmdline/lock_tests.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/lock_tests.py?rev=1096975&r1=1096974&r2=1096975&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/lock_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/lock_tests.py Wed Apr 27 00:54:14 2011
@@ -1318,7 +1318,7 @@ def ls_url_encoded(sbox):
 
 #----------------------------------------------------------------------
 # Make sure unlocking a path with the wrong lock token fails.
-@XFail(svntest.main.is_ra_type_dav)
+@XFail(svntest.main.is_ra_type_dav_neon)
 @Issue(3794)
 def unlock_wrong_token(sbox):
   "verify unlocking with wrong lock token"
@@ -1380,7 +1380,7 @@ def examine_lock_encoded_recurse(sbox):
                                         svntest.main.wc_author)
 
 # Trying to unlock someone else's lock with --force should fail.
-@XFail(svntest.main.is_ra_type_dav)
+@XFail(svntest.main.is_ra_type_dav_neon)
 @Issue(3801)
 def unlocked_lock_of_other_user(sbox):
   "unlock file locked by other user"