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 2015/03/09 19:34:51 UTC
svn commit: r1665318 - in /subversion/trunk/subversion: include/svn_error.h
libsvn_fs_base/lock.c libsvn_fs_fs/lock.c libsvn_fs_x/lock.c
libsvn_ra_serf/lock.c mod_dav_svn/util.c
Author: rhuijben
Date: Mon Mar 9 18:34:51 2015
New Revision: 1665318
URL: http://svn.apache.org/r1665318
Log:
Make all ra layers and fs backends consistently report errors on invalid
and out of date revisions passed to the lock api: in most cases via the
callback.
* subversion/include/svn_error.h
(SVN_ERR_IS_LOCK_ERROR): Implement the same behavior as implemented
inside the filesystems.
* subversion/libsvn_fs_base/lock.c
(includes): Add revs-txns.h.
(svn_fs_base__lock): Check revisions against youngest like in fsfs.
* subversion/libsvn_fs_fs/lock.c
(check_lock): Add youngest_rev argument and use it for sanity check.
(lock_body): Update caller.
* subversion/libsvn_fs_x/lock.c
(check_lock): Add youngest_rev argument and use it for sanity check.
(lock_body): Update caller.
* subversion/libsvn_ra_serf/lock.c
(run_locks): Assume that 404 errors likely have good server errors, to
avoid duplicate errors in the error chain.
* subversion/mod_dav_svn/util.c
(dav_svn__convert_err): Report SVN_ERR_FS_NO_SUCH_REVISION as status 404
(invalid target) instead of 500 (server error).
Modified:
subversion/trunk/subversion/include/svn_error.h
subversion/trunk/subversion/libsvn_fs_base/lock.c
subversion/trunk/subversion/libsvn_fs_fs/lock.c
subversion/trunk/subversion/libsvn_fs_x/lock.c
subversion/trunk/subversion/libsvn_ra_serf/lock.c
subversion/trunk/subversion/mod_dav_svn/util.c
Modified: subversion/trunk/subversion/include/svn_error.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_error.h?rev=1665318&r1=1665317&r2=1665318&view=diff
==============================================================================
--- subversion/trunk/subversion/include/svn_error.h (original)
+++ subversion/trunk/subversion/include/svn_error.h Mon Mar 9 18:34:51 2015
@@ -455,7 +455,10 @@ svn_error_t *svn_error_purge_tracing(svn
err->apr_err == SVN_ERR_FS_NOT_FOUND || \
err->apr_err == SVN_ERR_FS_OUT_OF_DATE || \
err->apr_err == SVN_ERR_FS_BAD_LOCK_TOKEN || \
- err->apr_err == SVN_ERR_REPOS_HOOK_FAILURE)
+ err->apr_err == SVN_ERR_REPOS_HOOK_FAILURE || \
+ err->apr_err == SVN_ERR_FS_NO_SUCH_REVISION || \
+ err->apr_err == SVN_ERR_FS_OUT_OF_DATE || \
+ err->apr_err == SVN_ERR_FS_NOT_FILE)
/**
* Return TRUE if @a err is an error specifically related to unlocking
Modified: subversion/trunk/subversion/libsvn_fs_base/lock.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_base/lock.c?rev=1665318&r1=1665317&r2=1665318&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_base/lock.c (original)
+++ subversion/trunk/subversion/libsvn_fs_base/lock.c Mon Mar 9 18:34:51 2015
@@ -39,6 +39,7 @@
#include "private/svn_fs_util.h"
#include "private/svn_subr_private.h"
#include "private/svn_dep_compat.h"
+#include "revs-txns.h"
/* Add LOCK and its associated LOCK_TOKEN (associated with PATH) as
@@ -241,8 +242,10 @@ svn_fs_base__lock(svn_fs_t *fs,
{
apr_hash_index_t *hi;
svn_error_t *cb_err = SVN_NO_ERROR;
+ svn_revnum_t youngest_rev = SVN_INVALID_REVNUM;
SVN_ERR(svn_fs__check_fs(fs, TRUE));
+ SVN_ERR(svn_fs_base__youngest_rev(&youngest_rev, fs, scratch_pool));
for (hi = apr_hash_first(scratch_pool, targets); hi; hi = apr_hash_next(hi))
{
@@ -250,7 +253,7 @@ svn_fs_base__lock(svn_fs_t *fs,
const char *path = apr_hash_this_key(hi);
const svn_fs_lock_target_t *target = apr_hash_this_val(hi);
svn_lock_t *lock;
- svn_error_t *err;
+ svn_error_t *err = NULL;
args.lock_p = &lock;
args.path = svn_fs__canonicalize_abspath(path, result_pool);
@@ -262,8 +265,17 @@ svn_fs_base__lock(svn_fs_t *fs,
args.current_rev = target->current_rev;
args.result_pool = result_pool;
- err = svn_fs_base__retry_txn(fs, txn_body_lock, &args, TRUE,
- scratch_pool);
+ if (SVN_IS_VALID_REVNUM(target->current_rev))
+ {
+ if (target->current_rev > youngest_rev)
+ err = svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
+ _("No such revision %ld"),
+ target->current_rev);
+ }
+
+ if (!err)
+ err = svn_fs_base__retry_txn(fs, txn_body_lock, &args, TRUE,
+ scratch_pool);
if (!cb_err && lock_callback)
cb_err = lock_callback(lock_baton, args.path, lock, err, scratch_pool);
svn_error_clear(err);
Modified: subversion/trunk/subversion/libsvn_fs_fs/lock.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/lock.c?rev=1665318&r1=1665317&r2=1665318&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/lock.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/lock.c Mon Mar 9 18:34:51 2015
@@ -715,6 +715,7 @@ check_lock(svn_error_t **fs_err,
const svn_fs_lock_target_t *target,
struct lock_baton *lb,
svn_fs_root_t *root,
+ svn_revnum_t youngest_rev,
apr_pool_t *pool)
{
svn_node_kind_t kind;
@@ -751,6 +752,15 @@ check_lock(svn_error_t **fs_err,
if (SVN_IS_VALID_REVNUM(target->current_rev))
{
svn_revnum_t created_rev;
+
+ if (target->current_rev > youngest_rev)
+ {
+ *fs_err = svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
+ _("No such revision %ld"),
+ target->current_rev);
+ return SVN_NO_ERROR;
+ }
+
SVN_ERR(svn_fs_fs__node_created_rev(&created_rev, root, path,
pool));
@@ -856,7 +866,7 @@ lock_body(void *baton, apr_pool_t *pool)
info.fs_err = SVN_NO_ERROR;
SVN_ERR(check_lock(&info.fs_err, info.path, item->value, lb, root,
- iterpool));
+ youngest, iterpool));
/* If no error occurred while pre-checking, schedule the index updates for
this path. */
Modified: subversion/trunk/subversion/libsvn_fs_x/lock.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_x/lock.c?rev=1665318&r1=1665317&r2=1665318&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_x/lock.c (original)
+++ subversion/trunk/subversion/libsvn_fs_x/lock.c Mon Mar 9 18:34:51 2015
@@ -755,6 +755,7 @@ check_lock(svn_error_t **fs_err,
const svn_fs_lock_target_t *target,
lock_baton_t *lb,
svn_fs_root_t *root,
+ svn_revnum_t youngest_rev,
apr_pool_t *pool)
{
svn_node_kind_t kind;
@@ -791,6 +792,15 @@ check_lock(svn_error_t **fs_err,
if (SVN_IS_VALID_REVNUM(target->current_rev))
{
svn_revnum_t created_rev;
+
+ if (target->current_rev > youngest_rev)
+ {
+ *fs_err = svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
+ _("No such revision %ld"),
+ target->current_rev);
+ return SVN_NO_ERROR;
+ }
+
SVN_ERR(svn_fs_x__node_created_rev(&created_rev, root, path,
pool));
@@ -895,7 +905,8 @@ lock_body(void *baton, apr_pool_t *pool)
svn_pool_clear(iterpool);
info.path = item->key;
- SVN_ERR(check_lock(&info.fs_err, info.path, target, lb, root, iterpool));
+ SVN_ERR(check_lock(&info.fs_err, info.path, target, lb, root,
+ youngest, iterpool));
info.lock = NULL;
info.component = NULL;
APR_ARRAY_PUSH(lb->infos, lock_info_t) = info;
Modified: subversion/trunk/subversion/libsvn_ra_serf/lock.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_serf/lock.c?rev=1665318&r1=1665317&r2=1665318&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_serf/lock.c (original)
+++ subversion/trunk/subversion/libsvn_ra_serf/lock.c Mon Mar 9 18:34:51 2015
@@ -291,6 +291,7 @@ run_locks(svn_ra_serf__session_t *sess,
ctx->handler->sline.reason);
break;
+ case 404:
case 409:
case 500:
if (server_err)
Modified: subversion/trunk/subversion/mod_dav_svn/util.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/mod_dav_svn/util.c?rev=1665318&r1=1665317&r2=1665318&view=diff
==============================================================================
--- subversion/trunk/subversion/mod_dav_svn/util.c (original)
+++ subversion/trunk/subversion/mod_dav_svn/util.c Mon Mar 9 18:34:51 2015
@@ -135,6 +135,7 @@ dav_svn__convert_err(svn_error_t *serr,
switch (purged_serr->apr_err)
{
case SVN_ERR_FS_NOT_FOUND:
+ case SVN_ERR_FS_NO_SUCH_REVISION:
status = HTTP_NOT_FOUND;
break;
case SVN_ERR_UNSUPPORTED_FEATURE: