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 2012/07/16 15:06:16 UTC
svn commit: r1362019 - in /subversion/trunk/subversion:
include/private/svn_wc_private.h libsvn_client/externals.c
libsvn_wc/externals.c
Author: rhuijben
Date: Mon Jul 16 13:06:16 2012
New Revision: 1362019
URL: http://svn.apache.org/viewvc?rev=1362019&view=rev
Log:
Properly remove external registrations from the EXTERNALS table on the first
update after the defining property removes an external and the on-disk
external is missing.
* subversion/include/private/svn_wc_private.h
(svn_wc__external_remove): Add declaration only argument.
* subversion/libsvn_client/externals.c
(relegate_dir_external): Update caller.
(handle_external_item_removal): If an external doesn't exist on-disk still
remove its registration.
* subversion/libsvn_wc/externals.c
(svn_wc__external_remove): Don't change NODES when we only remove the external
declaration.
Modified:
subversion/trunk/subversion/include/private/svn_wc_private.h
subversion/trunk/subversion/libsvn_client/externals.c
subversion/trunk/subversion/libsvn_wc/externals.c
Modified: subversion/trunk/subversion/include/private/svn_wc_private.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/private/svn_wc_private.h?rev=1362019&r1=1362018&r2=1362019&view=diff
==============================================================================
--- subversion/trunk/subversion/include/private/svn_wc_private.h (original)
+++ subversion/trunk/subversion/include/private/svn_wc_private.h Mon Jul 16 13:06:16 2012
@@ -228,6 +228,9 @@ svn_wc__external_register(svn_wc_context
/* Remove the external at LOCAL_ABSPATH from the working copy identified by
WRI_ABSPATH using WC_CTX.
+ If DECLARATION_ONLY is TRUE, only remove the registration and leave the
+ on-disk structure untouched.
+
If not NULL, call CANCEL_FUNC with CANCEL_BATON to allow canceling while
removing the working copy files.
@@ -237,6 +240,7 @@ svn_error_t *
svn_wc__external_remove(svn_wc_context_t *wc_ctx,
const char *wri_abspath,
const char *local_abspath,
+ svn_boolean_t declaration_only,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *scratch_pool);
Modified: subversion/trunk/subversion/libsvn_client/externals.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/externals.c?rev=1362019&r1=1362018&r2=1362019&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/externals.c (original)
+++ subversion/trunk/subversion/libsvn_client/externals.c Mon Jul 16 13:06:16 2012
@@ -63,7 +63,7 @@ relegate_dir_external(svn_wc_context_t *
{
svn_error_t *err = SVN_NO_ERROR;
- err = svn_wc__external_remove(wc_ctx, wri_abspath, local_abspath,
+ err = svn_wc__external_remove(wc_ctx, wri_abspath, local_abspath, FALSE,
cancel_func, cancel_baton, scratch_pool);
if (err && (err->apr_err == SVN_ERR_WC_LEFT_LOCAL_MOD))
{
@@ -512,19 +512,18 @@ handle_external_item_removal(const svn_c
SVN_ERR(svn_wc_read_kind(&kind, ctx->wc_ctx, local_abspath, FALSE,
scratch_pool));
- if (kind == svn_node_none)
- return SVN_NO_ERROR; /* It's neither... Nothing to remove */
-
- SVN_ERR(svn_wc_locked2(&lock_existed, NULL, ctx->wc_ctx,
- local_abspath, scratch_pool));
-
- if (! lock_existed)
+ if (kind != svn_node_none)
{
- SVN_ERR(svn_wc__acquire_write_lock(&lock_root_abspath,
- ctx->wc_ctx, local_abspath,
- FALSE,
- scratch_pool,
- scratch_pool));
+ SVN_ERR(svn_wc_locked2(&lock_existed, NULL, ctx->wc_ctx,
+ local_abspath, scratch_pool));
+
+ if (! lock_existed)
+ {
+ SVN_ERR(svn_wc__acquire_write_lock(&lock_root_abspath,
+ ctx->wc_ctx, local_abspath,
+ FALSE,
+ scratch_pool, scratch_pool));
+ }
}
/* We don't use relegate_dir_external() here, because we know that
@@ -532,7 +531,7 @@ handle_external_item_removal(const svn_c
going to need this directory, and therefore it's better to
leave stuff where the user expects it. */
err = svn_wc__external_remove(ctx->wc_ctx, defining_abspath,
- local_abspath,
+ local_abspath, (kind == svn_node_none),
ctx->cancel_func, ctx->cancel_baton,
scratch_pool);
Modified: subversion/trunk/subversion/libsvn_wc/externals.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/externals.c?rev=1362019&r1=1362018&r2=1362019&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/externals.c (original)
+++ subversion/trunk/subversion/libsvn_wc/externals.c Mon Jul 16 13:06:16 2012
@@ -1288,6 +1288,7 @@ svn_error_t *
svn_wc__external_remove(svn_wc_context_t *wc_ctx,
const char *wri_abspath,
const char *local_abspath,
+ svn_boolean_t declaration_only,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *scratch_pool)
@@ -1303,6 +1304,9 @@ svn_wc__external_remove(svn_wc_context_t
SVN_ERR(svn_wc__db_external_remove(wc_ctx->db, local_abspath, wri_abspath,
NULL, scratch_pool));
+ if (declaration_only)
+ return SVN_NO_ERROR;
+
if (kind == svn_kind_dir)
SVN_ERR(svn_wc_remove_from_revision_control2(wc_ctx, local_abspath,
TRUE, FALSE,