You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ju...@apache.org on 2018/11/30 16:02:43 UTC
svn commit: r1847834 - in /subversion/trunk/subversion:
include/private/svn_client_private.h libsvn_client/conflicts.c
libsvn_client/copy.c libsvn_client/wc_editor.c
tests/cmdline/externals_tests.py
Author: julianfoad
Date: Fri Nov 30 16:02:43 2018
New Revision: 1847834
URL: http://svn.apache.org/viewvc?rev=1847834&view=rev
Log:
Unify how 'copy' processes externals with and without pinning.
For issue #4786 "Create a WC working-mods editor".
Remove the optional 'externals' processing from inside the
'repos_to_wc_copy' API. Previously, externals were fetched outside the
'copy' API if and only if some externals were to be pinned. Now we always
use that code path.
As a side effect, this makes the notifications consistent between the two
cases.
* subversion/include/private/svn_client_private.h
(svn_client__repos_to_wc_copy): Remove 'externals' options.
* subversion/libsvn_client/copy.c
(svn_client__repos_to_wc_copy_dir,
svn_client__repos_to_wc_copy): Remove 'externals' option.
(repos_to_wc_copy_single): Always fetch externals after the copy.
* subversion/libsvn_client/conflicts.c
(merge_incoming_added_dir_replace): Trivially update this caller.
* subversion/libsvn_client/wc_editor.c
(dir_add,
file_add): Trivially update these callers.
* subversion/tests/cmdline/externals_tests.py
(url_to_wc_copy_of_externals): Revert the changes to the expected
notifications that were introduced by r1847206.
Modified:
subversion/trunk/subversion/include/private/svn_client_private.h
subversion/trunk/subversion/libsvn_client/conflicts.c
subversion/trunk/subversion/libsvn_client/copy.c
subversion/trunk/subversion/libsvn_client/wc_editor.c
subversion/trunk/subversion/tests/cmdline/externals_tests.py
Modified: subversion/trunk/subversion/include/private/svn_client_private.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/private/svn_client_private.h?rev=1847834&r1=1847833&r2=1847834&view=diff
==============================================================================
--- subversion/trunk/subversion/include/private/svn_client_private.h (original)
+++ subversion/trunk/subversion/include/private/svn_client_private.h Fri Nov 30 16:02:43 2018
@@ -427,6 +427,9 @@ svn_client__get_diff_summarize_callbacks
*
* Use RA_SESSION to fetch the data. The session may point to a different
* URL after returning.
+ *
+ * This API does not process any externals definitions that may be present
+ * on copied directories.
*/
svn_error_t *
svn_client__repos_to_wc_copy(svn_boolean_t *timestamp_sleep,
@@ -434,7 +437,6 @@ svn_client__repos_to_wc_copy(svn_boolean
const char *src_url,
svn_revnum_t src_rev,
const char *dst_abspath,
- svn_boolean_t ignore_externals,
svn_boolean_t same_repositories,
svn_ra_session_t *ra_session,
svn_client_ctx_t *ctx,
Modified: subversion/trunk/subversion/libsvn_client/conflicts.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/conflicts.c?rev=1847834&r1=1847833&r2=1847834&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/conflicts.c (original)
+++ subversion/trunk/subversion/libsvn_client/conflicts.c Fri Nov 30 16:02:43 2018
@@ -8045,7 +8045,6 @@ merge_incoming_added_dir_replace(svn_cli
svn_node_dir,
url, incoming_new_pegrev,
local_abspath,
- TRUE, /* we want to ignore externals */
TRUE /*same_repositories*/,
ra_session, ctx, scratch_pool);
if (err)
Modified: subversion/trunk/subversion/libsvn_client/copy.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/copy.c?rev=1847834&r1=1847833&r2=1847834&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/copy.c (original)
+++ subversion/trunk/subversion/libsvn_client/copy.c Fri Nov 30 16:02:43 2018
@@ -2360,7 +2360,6 @@ svn_client__repos_to_wc_copy_dir(svn_boo
const char *src_url,
svn_revnum_t src_revnum,
const char *dst_abspath,
- svn_boolean_t ignore_externals,
svn_boolean_t same_repositories,
svn_ra_session_t *ra_session,
svn_client_ctx_t *ctx,
@@ -2427,7 +2426,7 @@ svn_client__repos_to_wc_copy_dir(svn_boo
©_src_revision,
©_src_revision,
svn_depth_infinity,
- ignore_externals,
+ TRUE /*ignore_externals*/,
FALSE, /* we don't allow obstructions */
ra_session, ctx, scratch_pool);
@@ -2514,7 +2513,6 @@ svn_client__repos_to_wc_copy(svn_boolean
const char *src_url,
svn_revnum_t src_rev,
const char *dst_abspath,
- svn_boolean_t ignore_externals,
svn_boolean_t same_repositories,
svn_ra_session_t *ra_session,
svn_client_ctx_t *ctx,
@@ -2525,7 +2523,6 @@ svn_client__repos_to_wc_copy(svn_boolean
SVN_ERR(svn_client__repos_to_wc_copy_dir(timestamp_sleep,
src_url, src_rev,
dst_abspath,
- ignore_externals,
same_repositories,
ra_session,
ctx, scratch_pool));
@@ -2581,61 +2578,59 @@ repos_to_wc_copy_single(svn_boolean_t *t
SVN_ERR(ctx->cancel_func(ctx->cancel_baton));
}
- /* Avoid a chicken-and-egg problem:
- * If pinning externals we'll need to adjust externals
- * properties before checking out any externals.
- * But copy needs to happen before pinning because else there
- * are no svn:externals properties to pin. */
- if (pin_externals)
- ignore_externals = TRUE;
-
SVN_ERR(svn_client__repos_to_wc_copy(timestamp_sleep,
pair->src_kind,
pair->src_abspath_or_url,
pair->src_revnum,
dst_abspath,
- ignore_externals,
same_repositories,
ra_session, ctx, pool));
- if (pair->src_kind == svn_node_dir)
+ /* Fetch externals, pinning them if requested */
+ if (!ignore_externals && pair->src_kind == svn_node_dir)
{
- if (same_repositories && pin_externals)
+ if (same_repositories)
{
- apr_hash_t *pinned_externals;
- apr_hash_index_t *hi;
- apr_pool_t *iterpool;
const char *repos_root_url;
apr_hash_t *new_externals;
apr_hash_t *new_depths;
SVN_ERR(svn_ra_get_repos_root2(ra_session, &repos_root_url, pool));
- SVN_ERR(resolve_pinned_externals(&pinned_externals,
- externals_to_pin, pair,
- ra_session, repos_root_url,
- ctx, pool, pool));
-
- iterpool = svn_pool_create(pool);
- for (hi = apr_hash_first(pool, pinned_externals);
- hi;
- hi = apr_hash_next(hi))
+
+ if (pin_externals)
{
- const char *dst_relpath = apr_hash_this_key(hi);
- svn_string_t *externals_propval = apr_hash_this_val(hi);
- const char *local_abspath;
-
- svn_pool_clear(iterpool);
-
- local_abspath = svn_dirent_join(pair->dst_abspath_or_url,
- dst_relpath, iterpool);
- /* ### use a work queue? */
- SVN_ERR(svn_wc_prop_set4(ctx->wc_ctx, local_abspath,
- SVN_PROP_EXTERNALS, externals_propval,
- svn_depth_empty, TRUE /* skip_checks */,
- NULL /* changelist_filter */,
- ctx->cancel_func, ctx->cancel_baton,
- NULL, NULL, /* no extra notification */
- iterpool));
+ apr_hash_t *pinned_externals;
+ apr_hash_index_t *hi;
+ apr_pool_t *iterpool;
+
+ SVN_ERR(resolve_pinned_externals(&pinned_externals,
+ externals_to_pin, pair,
+ ra_session, repos_root_url,
+ ctx, pool, pool));
+
+ iterpool = svn_pool_create(pool);
+ for (hi = apr_hash_first(pool, pinned_externals);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ const char *dst_relpath = apr_hash_this_key(hi);
+ svn_string_t *externals_propval = apr_hash_this_val(hi);
+ const char *local_abspath;
+
+ svn_pool_clear(iterpool);
+
+ local_abspath = svn_dirent_join(pair->dst_abspath_or_url,
+ dst_relpath, iterpool);
+ /* ### use a work queue? */
+ SVN_ERR(svn_wc_prop_set4(ctx->wc_ctx, local_abspath,
+ SVN_PROP_EXTERNALS, externals_propval,
+ svn_depth_empty, TRUE /* skip_checks */,
+ NULL /* changelist_filter */,
+ ctx->cancel_func, ctx->cancel_baton,
+ NULL, NULL, /* no extra notification */
+ iterpool));
+ }
+ svn_pool_destroy(iterpool);
}
/* Now update all externals in the newly created copy. */
@@ -2644,15 +2639,14 @@ repos_to_wc_copy_single(svn_boolean_t *t
ctx->wc_ctx,
dst_abspath,
svn_depth_infinity,
- iterpool, iterpool));
+ pool, pool));
SVN_ERR(svn_client__handle_externals(new_externals,
new_depths,
repos_root_url, dst_abspath,
svn_depth_infinity,
timestamp_sleep,
ra_session,
- ctx, iterpool));
- svn_pool_destroy(iterpool);
+ ctx, pool));
}
}
Modified: subversion/trunk/subversion/libsvn_client/wc_editor.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/wc_editor.c?rev=1847834&r1=1847833&r2=1847834&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/wc_editor.c (original)
+++ subversion/trunk/subversion/libsvn_client/wc_editor.c Fri Nov 30 16:02:43 2018
@@ -258,7 +258,6 @@ dir_add(const char *path,
copyfrom_path,
copyfrom_revision,
db->local_abspath,
- TRUE /*ignore_externals*/,
same_repository,
db->eb->ra_session,
db->eb->ctx, db->pool));
@@ -449,7 +448,6 @@ file_add(const char *path,
copyfrom_path,
copyfrom_revision,
fb->local_abspath,
- TRUE /*ignore_externals*/,
same_repository,
fb->eb->ra_session,
fb->eb->ctx, fb->pool));
Modified: subversion/trunk/subversion/tests/cmdline/externals_tests.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/externals_tests.py?rev=1847834&r1=1847833&r2=1847834&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/externals_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/externals_tests.py Fri Nov 30 16:02:43 2018
@@ -2949,10 +2949,11 @@ def url_to_wc_copy_of_externals(sbox):
"A " + external_root_path + "\n",
"\n",
"Fetching external item into '" + external_ex_path + "':\n",
- "A " + external_ex_path + "\n",
- "A " + external_pi_path + "\n",
- "A " + external_rho_path + "\n",
- "A " + external_tau_path + "\n",
+ "A " + external_pi_path + "\n",
+ "A " + external_rho_path + "\n",
+ "A " + external_tau_path + "\n",
+ "Checked out external at revision 2.\n",
+ "\n",
])
exit_code, stdout, stderr = svntest.actions.run_and_verify_svn2(
expected_stdout, [], 0, 'copy', repo_url + '/A/C',