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/12/03 16:38:52 UTC
svn commit: r1848063 - in /subversion/trunk/subversion:
include/private/svn_client_private.h libsvn_client/copy.c
libsvn_client/copy_foreign.c tests/libsvn_client/client-test.c
Author: julianfoad
Date: Mon Dec 3 16:38:52 2018
New Revision: 1848063
URL: http://svn.apache.org/viewvc?rev=1848063&view=rev
Log:
Simplify the physical implementation of foreign-repo copy.
For issue #4786 "Create a WC working-mods editor".
* subversion/include/private/svn_client_private.h
(svn_client__copy_foreign): Remove.
* subversion/libsvn_client/copy.c
(copy_foreign_dir): New here, moved from copy_foreign.c.
(svn_client__repos_to_wc_copy_dir): Call copy_foreign_dir() directly
instead of through svn_client__foreign_copy().
(svn_client__repos_to_wc_copy): Allow a null 'timestamp_sleep' output ptr.
* subversion/libsvn_client/copy_foreign.c
Delete this file; move copy_foreign_dir() to copy.c.
* subversion/tests/libsvn_client/client-test.c
(test_foreign_repos_copy): Update callers of svn_client__copy_foreign()
to use svn_client__repos_to_wc_copy() instead.
Removed:
subversion/trunk/subversion/libsvn_client/copy_foreign.c
Modified:
subversion/trunk/subversion/include/private/svn_client_private.h
subversion/trunk/subversion/libsvn_client/copy.c
subversion/trunk/subversion/tests/libsvn_client/client-test.c
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=1848063&r1=1848062&r2=1848063&view=diff
==============================================================================
--- subversion/trunk/subversion/include/private/svn_client_private.h (original)
+++ subversion/trunk/subversion/include/private/svn_client_private.h Mon Dec 3 16:38:52 2018
@@ -281,28 +281,6 @@ svn_client__wc_node_get_origin(svn_clien
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
-/* Copy the file or directory at LOC to DST_ABSPATH,
- * copying node information and properties.
- *
- * If URL specifies a directory, create the copy using depth DEPTH.
- *
- * If MAKE_PARENTS is TRUE and DST_ABSPATH doesn't have an added parent
- * create missing parent directories
- *
- * The caller should be holding a WC write lock that allows DST_ABSPATH to
- * be created, such as on the parent of DST_ABSPATH.
- *
- * Use RA_SESSION to fetch the data. The session may point to a different
- * URL after returning.
- */
-svn_error_t *
-svn_client__copy_foreign(const svn_client__pathrev_t *loc,
- const char *dst_abspath,
- svn_depth_t depth,
- svn_ra_session_t *ra_session,
- svn_client_ctx_t *ctx,
- apr_pool_t *scratch_pool);
-
/* Same as the public svn_client_mergeinfo_log2 API, except for the addition
* of the TARGET_MERGEINFO_CATALOG and RESULT_POOL parameters.
*
Modified: subversion/trunk/subversion/libsvn_client/copy.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/copy.c?rev=1848063&r1=1848062&r2=1848063&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/copy.c (original)
+++ subversion/trunk/subversion/libsvn_client/copy.c Mon Dec 3 16:38:52 2018
@@ -2353,6 +2353,65 @@ notification_adjust_func(void *baton,
nb->inner_func(nb->inner_baton, inner_notify, pool);
}
+/** Copy a directory tree from a remote repository.
+ *
+ * Copy from RA_SESSION:LOCATION, depth DEPTH, to WC_CTX:DST_ABSPATH.
+ *
+ * Create the directory DST_ABSPATH, if not present. Its parent should be
+ * already under version control in the WC and in a suitable state for
+ * scheduling the addition of a child.
+ *
+ * Ignore any incoming non-regular properties (entry-props, DAV/WC-props).
+ * Remove any incoming 'svn:mergeinfo' properties.
+ */
+static svn_error_t *
+copy_foreign_dir(svn_ra_session_t *ra_session,
+ const svn_client__pathrev_t *location,
+ const char *dst_abspath,
+ svn_depth_t depth,
+ svn_wc_notify_func2_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *scratch_pool)
+{
+ const svn_delta_editor_t *editor;
+ void *eb;
+ const svn_delta_editor_t *wrapped_editor;
+ void *wrapped_baton;
+ const svn_ra_reporter3_t *reporter;
+ void *reporter_baton;
+
+ /* Get a WC editor. It does not need an RA session because we will not
+ be sending it any 'copy from' requests, only 'add' requests. */
+ SVN_ERR(svn_client__wc_editor_internal(&editor, &eb,
+ dst_abspath,
+ TRUE /*root_dir_add*/,
+ TRUE /*ignore_mergeinfo_changes*/,
+ notify_func, notify_baton,
+ NULL /*ra_session*/,
+ ctx, scratch_pool));
+
+ SVN_ERR(svn_delta_get_cancellation_editor(cancel_func, cancel_baton,
+ editor, eb,
+ &wrapped_editor, &wrapped_baton,
+ scratch_pool));
+
+ SVN_ERR(svn_ra_do_update3(ra_session, &reporter, &reporter_baton,
+ location->rev, "", svn_depth_infinity,
+ FALSE, FALSE, wrapped_editor, wrapped_baton,
+ scratch_pool, scratch_pool));
+
+ SVN_ERR(reporter->set_path(reporter_baton, "", location->rev, depth,
+ TRUE /* incomplete */,
+ NULL, scratch_pool));
+
+ SVN_ERR(reporter->finish_report(reporter_baton, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
/* Implementation of svn_client__repos_to_wc_copy() for a dir.
*/
static svn_error_t *
@@ -2378,11 +2437,13 @@ svn_client__repos_to_wc_copy_dir(svn_boo
SVN_ERR(svn_client__pathrev_create_with_session(&location, ra_session,
src_revnum, src_url,
scratch_pool));
- SVN_ERR(svn_client__copy_foreign(location,
- dst_abspath,
- svn_depth_infinity,
- ra_session,
- ctx, scratch_pool));
+ SVN_ERR(svn_ra_reparent(ra_session, src_url, scratch_pool));
+ SVN_ERR(copy_foreign_dir(ra_session, location,
+ dst_abspath,
+ svn_depth_infinity,
+ ctx->notify_func2, ctx->notify_baton2,
+ ctx->cancel_func, ctx->cancel_baton,
+ ctx, scratch_pool));
return SVN_NO_ERROR;
}
@@ -2518,6 +2579,11 @@ svn_client__repos_to_wc_copy(svn_boolean
svn_client_ctx_t *ctx,
apr_pool_t *scratch_pool)
{
+ svn_boolean_t timestamp_sleep_ignored;
+
+ if (!timestamp_sleep)
+ timestamp_sleep = ×tamp_sleep_ignored;
+
if (kind == svn_node_dir)
{
SVN_ERR(svn_client__repos_to_wc_copy_dir(timestamp_sleep,
Modified: subversion/trunk/subversion/tests/libsvn_client/client-test.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/libsvn_client/client-test.c?rev=1848063&r1=1848062&r2=1848063&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_client/client-test.c (original)
+++ subversion/trunk/subversion/tests/libsvn_client/client-test.c Mon Dec 3 16:38:52 2018
@@ -31,6 +31,7 @@
#include "../../libsvn_client/client.h"
#include "svn_pools.h"
#include "svn_client.h"
+#include "private/svn_client_private.h"
#include "private/svn_client_mtcc.h"
#include "svn_repos.h"
#include "svn_subst.h"
@@ -765,17 +766,22 @@ test_foreign_repos_copy(const svn_test_o
loc->url = svn_path_url_add_component2(repos2_url, "A", pool);
SVN_WC__CALL_WITH_WRITE_LOCK(
- svn_client__copy_foreign(loc,
+ svn_client__repos_to_wc_copy(NULL /*sleep*/, svn_node_dir,
+ loc->url, loc->rev,
svn_dirent_join(wc_path, "A-copied", pool),
- svn_depth_infinity,
+ /*svn_depth_infinity,*/
+ FALSE /*same_repositories*/,
ra_session, ctx, pool),
ctx->wc_ctx, wc_path, FALSE, pool);
+ SVN_ERR(svn_ra_reparent(ra_session, repos2_url, pool));
loc->url = svn_path_url_add_component2(repos2_url, "iota", pool);
SVN_WC__CALL_WITH_WRITE_LOCK(
- svn_client__copy_foreign(loc,
+ svn_client__repos_to_wc_copy(NULL /*sleep*/, svn_node_file,
+ loc->url, loc->rev,
svn_dirent_join(wc_path, "iota-copied", pool),
- svn_depth_infinity,
+ /*svn_depth_infinity,*/
+ FALSE /*same_repositories*/,
ra_session, ctx, pool),
ctx->wc_ctx, wc_path, FALSE, pool);