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 03:41:47 UTC

svn commit: r1096977 - in /subversion/trunk/subversion: libsvn_ra_neon/lock.c tests/cmdline/lock_tests.py

Author: rhuijben
Date: Wed Apr 27 01:41:46 2011
New Revision: 1096977

URL: http://svn.apache.org/viewvc?rev=1096977&view=rev
Log:
Following up on r1096975, also fix issues #3794 and #3801 for ra_neon.

* subversion/libsvn_ra_neon/lock.c
  (do_unlock): Return lock token if retrieved. Handle http status codes
    explicitly instead of via the standard handler to allow returning
    the specific fs errors expected by api users.

* subversion/tests/cmdline/lock_tests.py
  (unlock_wrong_token,
   unlocked_lock_of_other_user): Remove XFail marking.

Modified:
    subversion/trunk/subversion/libsvn_ra_neon/lock.c
    subversion/trunk/subversion/tests/cmdline/lock_tests.py

Modified: subversion/trunk/subversion/libsvn_ra_neon/lock.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_neon/lock.c?rev=1096977&r1=1096976&r2=1096977&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_neon/lock.c (original)
+++ subversion/trunk/subversion/libsvn_ra_neon/lock.c Wed Apr 27 01:41:46 2011
@@ -392,6 +392,7 @@ do_unlock(svn_ra_session_t *session,
           const char *path,
           const char *token,
           svn_boolean_t force,
+          const svn_lock_t **old_lock,
           apr_pool_t *pool)
 {
   svn_ra_neon__session_t *ras = session->priv;
@@ -401,6 +402,9 @@ do_unlock(svn_ra_session_t *session,
 
   apr_hash_t *extra_headers = apr_hash_make(pool);
 
+  if (old_lock)
+    *old_lock = NULL;
+
   /* Make a neon lock structure containing token and full URL to unlock. */
   url = svn_path_url_add_component2(ras->url->data, path, pool);
   if (ne_uri_parse(url, &uri) != 0)
@@ -425,18 +429,44 @@ do_unlock(svn_ra_session_t *session,
                                  _("'%s' is not locked in the repository"),
                                  path);
       token = lock->token;
+      if (old_lock)
+        *old_lock = lock;
     }
 
-
-
   apr_hash_set(extra_headers, "Lock-Token", APR_HASH_KEY_STRING,
                apr_psprintf(pool, "<%s>", token));
   if (force)
     apr_hash_set(extra_headers, SVN_DAV_OPTIONS_HEADER, APR_HASH_KEY_STRING,
                  SVN_DAV_OPTION_LOCK_BREAK);
 
-  return svn_ra_neon__simple_request(NULL, ras, "UNLOCK", url_path,
-                                     extra_headers, NULL, 204, 0, pool);
+  {
+    int code = 0;
+    svn_error_t *err;
+
+    err = svn_ra_neon__simple_request(&code, ras, "UNLOCK", url_path,
+                                      extra_headers, NULL, 204, 0, pool);
+
+    if (err && ((err->apr_err == SVN_ERR_RA_DAV_REQUEST_FAILED)
+                || (err->apr_err == SVN_ERR_RA_DAV_FORBIDDEN)))
+      {
+        switch (code)
+          {
+            case 403:
+              return svn_error_createf(SVN_ERR_FS_LOCK_OWNER_MISMATCH, err,
+                                       _("Unlock failed on '%s'"
+                                         " (%d Forbidden)"), path, code);
+            case 400:
+               return svn_error_createf(SVN_ERR_FS_NO_SUCH_LOCK, err,
+                                       _("No lock on path '%s'"
+                                         " (%d Bad Request)"), path, code);
+            default:
+              break; /* Handle as error */
+          }
+      }
+    else
+      SVN_ERR(err);
+  }
+  return SVN_NO_ERROR;
 }
 
 
@@ -462,6 +492,7 @@ svn_ra_neon__unlock(svn_ra_session_t *se
       void *val;
       const char *token;
       svn_error_t *err, *callback_err = NULL;
+      const svn_lock_t *old_lock = NULL;
 
       svn_pool_clear(iterpool);
 
@@ -474,7 +505,7 @@ svn_ra_neon__unlock(svn_ra_session_t *se
       else
         token = NULL;
 
-      err = do_unlock(session, path, token, force, iterpool);
+      err = do_unlock(session, path, token, force, &old_lock, iterpool);
 
       if (err && !SVN_ERR_IS_UNLOCK_ERROR(err))
         {
@@ -483,7 +514,8 @@ svn_ra_neon__unlock(svn_ra_session_t *se
         }
 
       if (lock_func)
-        callback_err = lock_func(lock_baton, path, FALSE, NULL, err, iterpool);
+        callback_err = svn_error_return(
+                 lock_func(lock_baton, path, FALSE, old_lock, err, iterpool));
 
       svn_error_clear(err);
 
@@ -497,7 +529,8 @@ svn_ra_neon__unlock(svn_ra_session_t *se
   svn_pool_destroy(iterpool);
 
  departure:
-  return svn_ra_neon__maybe_store_auth_info_after_result(ret_err, ras, pool);
+  return svn_error_return(
+          svn_ra_neon__maybe_store_auth_info_after_result(ret_err, ras, pool));
 }
 
 

Modified: subversion/trunk/subversion/tests/cmdline/lock_tests.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/lock_tests.py?rev=1096977&r1=1096976&r2=1096977&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/lock_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/lock_tests.py Wed Apr 27 01:41:46 2011
@@ -1318,7 +1318,6 @@ def ls_url_encoded(sbox):
 
 #----------------------------------------------------------------------
 # Make sure unlocking a path with the wrong lock token fails.
-@XFail(svntest.main.is_ra_type_dav_neon)
 @Issue(3794)
 def unlock_wrong_token(sbox):
   "verify unlocking with wrong lock token"
@@ -1380,7 +1379,6 @@ 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_neon)
 @Issue(3801)
 def unlocked_lock_of_other_user(sbox):
   "unlock file locked by other user"