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"