[[[
Fix issue #3819: 'svn update' touches file externals in ../sibling/ too.
* subversion/libsvn_client/client.h
(svn_client__handle_externals): Add TARGET parameter.
* subversion/libsvn_client/externals.c
(handle_externals_desc_change_baton): Grow TARGET_ABSPATH member.
(handle_externals_desc_change): Document KEY parameter, and ignore
externals not under TARGET_ABSPATH.
(svn_client__handle_externals): Add TARGET parameter, and use it to
populate the baton's TARGET_ABSPATH member.
* subversion/libsvn_client/switch.c
(switch_internal): Pass TARGET to svn_client__handle_externals().
* subversion/libsvn_client/update.c
(update_internal): Pass "" for TARGET to svn_client__handle_externals().
]]]
[[[
Index: subversion/libsvn_client/externals.c
===================================================================
--- subversion/libsvn_client/externals.c (revision 1081110)
+++ subversion/libsvn_client/externals.c (working copy)
@@ -1026,6 +1026,7 @@ struct handle_externals_desc_change_baton
external item parent directory path. */
const char *from_url;
const char *to_abspath;
+ const char *target_abspath;
/* Passed through to handle_external_item_change_baton. */
svn_client_ctx_t *ctx;
@@ -1042,6 +1043,7 @@ struct handle_externals_desc_change_baton
/* This implements the 'svn_hash_diff_func_t' interface.
BATON is of type 'struct handle_externals_desc_change_baton *'.
+ KEY is a 'const char *'.
*/
static svn_error_t *
handle_externals_desc_change(const void *key, apr_ssize_t klen,
@@ -1088,6 +1093,10 @@ handle_externals_desc_change(const void *key, apr_
&& cb->requested_depth < svn_depth_infinity))
return SVN_NO_ERROR;
+ /* Only handle externals under TARGET. */
+ if (! svn_dirent_is_ancestor(cb->target_abspath, (const char *) key))
+ return SVN_NO_ERROR;
+
if ((old_desc_text = apr_hash_get(cb->externals_old, key, klen)))
SVN_ERR(svn_wc_parse_externals_description3(&old_desc, key, old_desc_text,
FALSE, cb->pool));
@@ -1206,6 +1215,7 @@ svn_client__handle_externals(apr_hash_t *externals
apr_hash_t *ambient_depths,
const char *from_url,
const char *to_abspath,
+ const char *target,
const char *repos_root_url,
svn_depth_t requested_depth,
svn_boolean_t *timestamp_sleep,
@@ -1227,6 +1237,7 @@ svn_client__handle_externals(apr_hash_t *externals
cb.ambient_depths = ambient_depths;
cb.from_url = from_url;
cb.to_abspath = to_abspath;
+ cb.target_abspath = svn_dirent_join(to_abspath, target, pool);
cb.repos_root_url = repos_root_url;
cb.ctx = ctx;
cb.timestamp_sleep = timestamp_sleep;
@@ -1262,6 +1273,7 @@ svn_client__fetch_externals(apr_hash_t *externals,
cb.ctx = ctx;
cb.from_url = from_url;
cb.to_abspath = to_abspath;
+ cb.target_abspath = "";
cb.repos_root_url = repos_root_url;
cb.timestamp_sleep = timestamp_sleep;
cb.native_eol = native_eol;
]]]
Received on 2011-03-13 15:38:48 CET