From commits-return-50012-archive-asf-public=cust-asf.ponee.io@subversion.apache.org Fri Nov 30 17:02:45 2018 Return-Path: X-Original-To: archive-asf-public@cust-asf.ponee.io Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx-eu-01.ponee.io (Postfix) with SMTP id C9071180671 for ; Fri, 30 Nov 2018 17:02:44 +0100 (CET) Received: (qmail 73490 invoked by uid 500); 30 Nov 2018 16:02:43 -0000 Mailing-List: contact commits-help@subversion.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@subversion.apache.org Delivered-To: mailing list commits@subversion.apache.org Received: (qmail 73477 invoked by uid 99); 30 Nov 2018 16:02:43 -0000 Received: from Unknown (HELO svn01-us-west.apache.org) (209.188.14.144) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 30 Nov 2018 16:02:43 +0000 Received: from svn01-us-west.apache.org (localhost [127.0.0.1]) by svn01-us-west.apache.org (ASF Mail Server at svn01-us-west.apache.org) with ESMTP id 648FB3A1EB8 for ; Fri, 30 Nov 2018 16:02:43 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: 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 Date: Fri, 30 Nov 2018 16:02:43 -0000 To: commits@subversion.apache.org From: julianfoad@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20181130160243.648FB3A1EB8@svn01-us-west.apache.org> 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',