[prev in list] [next in list] [prev in thread] [next in thread] 

List:       subversion-commits
Subject:    svn commit: r1847813 - in /subversion/trunk/subversion: include/private/svn_client_private.h libsvn_
From:       julianfoad () apache ! org
Date:       2018-11-30 12:46:25
Message-ID: 20181130124625.949853A1EC3 () svn01-us-west ! apache ! org
[Download RAW message or body]

Author: julianfoad
Date: Fri Nov 30 12:46:25 2018
New Revision: 1847813

URL: http://svn.apache.org/viewvc?rev=1847813&view=rev
Log:
For issue #4786 "Create a WC working-mods editor": combine dir and file
versions of a copy API, in the interest of unifying file and dir operations
as much as possible to simplify callers.

* subversion/include/private/svn_client_private.h
  (svn_client__repos_to_wc_copy): New.
  (svn_client__repos_to_wc_copy_dir,
   svn_client__repos_to_wc_copy_file): Delete.

* subversion/libsvn_client/copy.c
  (verify_wc_srcs): Add a simple doc string.
  (svn_client__repos_to_wc_copy_dir,
   svn_client__repos_to_wc_copy_file): Make static.
  (svn_client__repos_to_wc_copy): New.
  (repos_to_wc_copy_single): Update callers.

* subversion/libsvn_client/conflicts.c
  (merge_incoming_added_dir_replace): Update callers.

* subversion/libsvn_client/wc_editor.c
  (dir_add,
   file_add): Update callers.

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

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=1847813&r1=1847812&r2=1847813&view=diff
 ==============================================================================
--- subversion/trunk/subversion/include/private/svn_client_private.h (original)
+++ subversion/trunk/subversion/include/private/svn_client_private.h Fri Nov 30 \
12:46:25 2018 @@ -414,7 +414,8 @@ svn_client__get_diff_summarize_callbacks
                         apr_pool_t *result_pool,
                         apr_pool_t *scratch_pool);
 
-/* Copy a directory tree from SRC_URL @ SRC_REV, to DST_ABSPATH in a WC.
+/* Copy a directory tree or a file (according to KIND) from SRC_URL @ SRC_REV,
+ * to DST_ABSPATH in a WC.
  *
  * The caller should be holding a WC write lock that allows DST_ABSPATH to
  * be created, such as on the parent of DST_ABSPATH.
@@ -428,38 +429,16 @@ svn_client__get_diff_summarize_callbacks
  * URL after returning.
  */
 svn_error_t *
-svn_client__repos_to_wc_copy_dir(svn_boolean_t *timestamp_sleep,
-                                 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,
-                                 apr_pool_t *pool);
-
-/* Copy a file from SRC_URL @ SRC_REV, to DST_ABSPATH in a WC.
- *
- * The caller should be holding a WC write lock that allows DST_ABSPATH to
- * be created, such as on the parent of DST_ABSPATH.
- *
- * SAME_REPOSITORIES must be true if and only if the source of this copy
- * is from the same repository at the WC parent of DST_ABSPATH.
- * If SAME_REPOSITORIES, then fill in the 'copy-from' in the WC target.
- * If not SAME_REPOSITORIES, then remove any svn:mergeinfo property.
- *
- * Use RA_SESSION to fetch the data. The session may point to a different
- * URL after returning.
- */
-svn_error_t *
-svn_client__repos_to_wc_copy_file(svn_boolean_t *timestamp_sleep,
-                                  const char *src_url,
-                                  svn_revnum_t src_rev,
-                                  const char *dst_abspath,
-                                  svn_boolean_t same_repositories,
-                                  svn_ra_session_t *ra_session,
-                                  svn_client_ctx_t *ctx,
-                                  apr_pool_t *scratch_pool);
+svn_client__repos_to_wc_copy(svn_boolean_t *timestamp_sleep,
+                             svn_node_kind_t kind,
+                             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,
+                             apr_pool_t *scratch_pool);
 
 /** Return an editor for applying local modifications to a WC.
  *

Modified: subversion/trunk/subversion/libsvn_client/conflicts.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/conflicts.c?rev=1847813&r1=1847812&r2=1847813&view=diff
 ==============================================================================
--- subversion/trunk/subversion/libsvn_client/conflicts.c (original)
+++ subversion/trunk/subversion/libsvn_client/conflicts.c Fri Nov 30 12:46:25 2018
@@ -8041,13 +8041,13 @@ merge_incoming_added_dir_replace(svn_cli
   if (err)
     goto unlock_wc;
 
-  err = svn_client__repos_to_wc_copy_dir(&timestamp_sleep,
-                                         url,
-                                         incoming_new_pegrev,
-                                         local_abspath,
-                                         TRUE, /* we want to ignore externals */
-                                         TRUE /*same_repositories*/,
-                                         ra_session, ctx, scratch_pool);
+  err = svn_client__repos_to_wc_copy(&timestamp_sleep,
+                                     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)
     goto unlock_wc;
 

Modified: subversion/trunk/subversion/libsvn_client/copy.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/copy.c?rev=1847813&r1=1847812&r2=1847813&view=diff
 ==============================================================================
--- subversion/trunk/subversion/libsvn_client/copy.c (original)
+++ subversion/trunk/subversion/libsvn_client/copy.c Fri Nov 30 12:46:25 2018
@@ -1099,6 +1099,9 @@ verify_wc_dsts(const apr_array_header_t
   return SVN_NO_ERROR;
 }
 
+/* Verify that the WC sources in COPY_PAIRS exist, and set pair->src_kind
+   for each.
+ */
 static svn_error_t *
 verify_wc_srcs(const apr_array_header_t *copy_pairs,
                svn_client_ctx_t *ctx,
@@ -2350,7 +2353,9 @@ notification_adjust_func(void *baton,
     nb->inner_func(nb->inner_baton, inner_notify, pool);
 }
 
-svn_error_t *
+/* Implementation of svn_client__repos_to_wc_copy() for a dir.
+ */
+static svn_error_t *
 svn_client__repos_to_wc_copy_dir(svn_boolean_t *timestamp_sleep,
                                  const char *src_url,
                                  svn_revnum_t src_revnum,
@@ -2454,7 +2459,12 @@ svn_client__repos_to_wc_copy_dir(svn_boo
   return SVN_NO_ERROR;
 }
 
-svn_error_t *
+/* Implementation of svn_client__repos_to_wc_copy() for a file.
+ *
+ * This has no 'ignore_externals' parameter because we don't support the
+ * 'svn:externals' property being set on a file.
+ */
+static svn_error_t *
 svn_client__repos_to_wc_copy_file(svn_boolean_t *timestamp_sleep,
                                   const char *src_url,
                                   svn_revnum_t src_rev,
@@ -2498,6 +2508,40 @@ svn_client__repos_to_wc_copy_file(svn_bo
   return SVN_NO_ERROR;
 }
 
+svn_error_t *
+svn_client__repos_to_wc_copy(svn_boolean_t *timestamp_sleep,
+                             svn_node_kind_t kind,
+                             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,
+                             apr_pool_t *scratch_pool)
+{
+  if (kind == svn_node_dir)
+    {
+      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));
+    }
+  else if (kind == svn_node_file)
+    {
+      SVN_ERR(svn_client__repos_to_wc_copy_file(timestamp_sleep,
+                                                src_url, src_rev,
+                                                dst_abspath,
+                                                same_repositories,
+                                                ra_session,
+                                                ctx, scratch_pool));
+    }
+  return SVN_NO_ERROR;
+}
+
 /* Peform each individual copy operation for a repos -> wc copy.  A
    helper for repos_to_wc_copy().
 
@@ -2537,24 +2581,25 @@ 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)
     {
-      /* 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_dir(timestamp_sleep,
-                                               pair->src_abspath_or_url,
-                                               pair->src_revnum,
-                                               dst_abspath,
-                                               ignore_externals,
-                                               same_repositories,
-                                               ra_session, ctx, pool));
-
       if (same_repositories && pin_externals)
         {
           apr_hash_t *pinned_externals;
@@ -2609,17 +2654,6 @@ repos_to_wc_copy_single(svn_boolean_t *t
                                                ctx, iterpool));
           svn_pool_destroy(iterpool);
         }
-    } /* end directory case */
-
-  else if (pair->src_kind == svn_node_file)
-    {
-      SVN_ERR(svn_client__repos_to_wc_copy_file(timestamp_sleep,
-                                                pair->src_abspath_or_url,
-                                                pair->src_revnum,
-                                                dst_abspath,
-                                                same_repositories,
-                                                ra_session,
-                                                ctx, pool));
     }
 
   if (same_repositories)

Modified: subversion/trunk/subversion/libsvn_client/wc_editor.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/wc_editor.c?rev=1847813&r1=1847812&r2=1847813&view=diff
 ==============================================================================
--- subversion/trunk/subversion/libsvn_client/wc_editor.c (original)
+++ subversion/trunk/subversion/libsvn_client/wc_editor.c Fri Nov 30 12:46:25 2018
@@ -253,14 +253,15 @@ dir_add(const char *path,
                                  db->eb->ra_session, db->local_abspath,
                                  db->eb->ctx, db->pool));
 
-      SVN_ERR(svn_client__repos_to_wc_copy_dir(&timestamp_sleep,
-                                               copyfrom_path,
-                                               copyfrom_revision,
-                                               db->local_abspath,
-                                               TRUE /*ignore_externals*/,
-                                               same_repository,
-                                               db->eb->ra_session,
-                                               db->eb->ctx, db->pool));
+      SVN_ERR(svn_client__repos_to_wc_copy(&timestamp_sleep,
+                                           svn_node_dir,
+                                           copyfrom_path,
+                                           copyfrom_revision,
+                                           db->local_abspath,
+                                           TRUE /*ignore_externals*/,
+                                           same_repository,
+                                           db->eb->ra_session,
+                                           db->eb->ctx, db->pool));
     }
 
   *child_baton = db;
@@ -443,13 +444,15 @@ file_add(const char *path,
                                  fb->eb->ra_session, fb->local_abspath,
                                  fb->eb->ctx, fb->pool));
 
-      SVN_ERR(svn_client__repos_to_wc_copy_file(&timestamp_sleep,
-                                                copyfrom_path,
-                                                copyfrom_revision,
-                                                fb->local_abspath,
-                                                same_repository,
-                                                fb->eb->ra_session,
-                                                fb->eb->ctx, fb->pool));
+      SVN_ERR(svn_client__repos_to_wc_copy(&timestamp_sleep,
+                                           svn_node_file,
+                                           copyfrom_path,
+                                           copyfrom_revision,
+                                           fb->local_abspath,
+                                           TRUE /*ignore_externals*/,
+                                           same_repository,
+                                           fb->eb->ra_session,
+                                           fb->eb->ctx, fb->pool));
     }
 
   *file_baton = fb;


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic