You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ph...@apache.org on 2010/02/01 22:45:27 UTC

svn commit: r905422 - /subversion/trunk/subversion/libsvn_client/copy.c

Author: philip
Date: Mon Feb  1 21:45:26 2010
New Revision: 905422

URL: http://svn.apache.org/viewvc?rev=905422&view=rev
Log:
Remove access batons from wc-to-wc moves.

* subversion/libsvn_client/copy.c
  (do_wc_to_moves): Split, and call do_wc_to_wc_moves_with_locks1.
  (do_wc_to_wc_moves_with_locks1, do_wc_to_wc_moves_with_locks2): New.

Modified:
    subversion/trunk/subversion/libsvn_client/copy.c

Modified: subversion/trunk/subversion/libsvn_client/copy.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/copy.c?rev=905422&r1=905421&r2=905422&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/copy.c (original)
+++ subversion/trunk/subversion/libsvn_client/copy.c Mon Feb  1 21:45:26 2010
@@ -332,6 +332,56 @@
   return SVN_NO_ERROR;
 }
 
+struct do_wc_to_wc_moves_with_locks_baton {
+  svn_client_ctx_t *ctx;
+  svn_client__copy_pair_t *pair;
+  const char *dst_parent_abspath;
+  svn_boolean_t lock_src;
+  svn_boolean_t lock_dst;
+};
+
+/* The locked bit of do_wc_to_wc_moves. */
+static svn_error_t *
+do_wc_to_wc_moves_with_locks2(void *baton,
+                              apr_pool_t *result_pool,
+                              apr_pool_t *scratch_pool)
+{
+  struct do_wc_to_wc_moves_with_locks_baton *b = baton;
+  const char *dst_abspath;
+
+  dst_abspath = svn_dirent_join(b->dst_parent_abspath, b->pair->base_name,
+                                scratch_pool);
+
+  SVN_ERR(svn_wc_copy3(b->ctx->wc_ctx, b->pair->src_abs, dst_abspath,
+                       b->ctx->cancel_func, b->ctx->cancel_baton,
+                       b->ctx->notify_func2, b->ctx->notify_baton2,
+                       scratch_pool));
+
+  SVN_ERR(svn_wc_delete4(b->ctx->wc_ctx, b->pair->src_abs, FALSE, FALSE,
+                         b->ctx->cancel_func, b->ctx->cancel_baton,
+                         b->ctx->notify_func2, b->ctx->notify_baton2,
+                         scratch_pool));
+
+  return SVN_NO_ERROR;
+}
+
+/* Wrapper to add an optional second lock */
+static svn_error_t *
+do_wc_to_wc_moves_with_locks1(void *baton,
+                              apr_pool_t *result_pool,
+                              apr_pool_t *scratch_pool)
+{
+  struct do_wc_to_wc_moves_with_locks_baton *b = baton;
+
+  if (b->lock_dst)
+    SVN_ERR(svn_wc__call_with_write_lock(do_wc_to_wc_moves_with_locks2, b,
+                                         b->ctx->wc_ctx, b->dst_parent_abspath,
+                                         result_pool, scratch_pool));
+  else
+    SVN_ERR(do_wc_to_wc_moves_with_locks2(b, result_pool, scratch_pool));
+
+  return SVN_NO_ERROR;
+}
 
 /* Move each COPY_PAIR->SRC into COPY_PAIR->DST, deleting COPY_PAIR->SRC
    afterwards.  Use POOL for temporary allocations. */
@@ -347,14 +397,10 @@
 
   for (i = 0; i < copy_pairs->nelts; i++)
     {
-      svn_wc_adm_access_t *src_access;
-      svn_wc_adm_access_t *dst_access;
-      svn_boolean_t close_dst_access = FALSE;
-      svn_boolean_t close_src_access = FALSE;
       const char *src_parent;
       const char *src_parent_abspath;
-      const char *dst_abspath;
       const char *dst_parent_abspath;
+      struct do_wc_to_wc_moves_with_locks_baton baton;
 
       svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i,
                                                     svn_client__copy_pair_t *);
@@ -370,77 +416,46 @@
       SVN_ERR(svn_dirent_get_absolute(&dst_parent_abspath, pair->dst_parent,
                                       iterpool));
 
-      /* We now need to open the right combination of batons.
+      SVN_ERR(svn_dirent_get_absolute(&pair->src_abs, pair->src, pool));
+
+      /* We now need to lock the right combination of batons.
          Four cases:
            1) src_parent == dst_parent
            2) src_parent is parent of dst_parent
            3) dst_parent is parent of src_parent
-           4) src_parent and dst_parent are disjoint */
-      if (strcmp(src_parent_abspath, dst_parent_abspath) == 0)
-        {
-          SVN_ERR(svn_wc__adm_open_in_context(&src_access, ctx->wc_ctx,
-                                              src_parent, TRUE, -1,
-                                              ctx->cancel_func,
-                                              ctx->cancel_baton, iterpool));
-          dst_access = src_access;
-          close_src_access = TRUE;
-        }
-      else if (svn_dirent_is_child(src_parent_abspath, dst_parent_abspath,
-                                   iterpool))
+           4) src_parent and dst_parent are disjoint
+         We can handle 1) as either 2) or 3) */
+      if (strcmp(src_parent_abspath, dst_parent_abspath) == 0
+          || svn_dirent_is_child(src_parent_abspath, dst_parent_abspath,
+                                 iterpool))
         {
-          SVN_ERR(svn_wc__adm_open_in_context(&src_access, ctx->wc_ctx,
-                                              src_parent, TRUE, -1,
-                                              ctx->cancel_func,
-                                              ctx->cancel_baton, iterpool));
-          SVN_ERR(svn_wc_adm_retrieve(&dst_access, src_access,
-                                      pair->dst_parent, iterpool));
-          close_src_access = TRUE;
+          baton.lock_src = TRUE;
+          baton.lock_dst = FALSE;
         }
       else if (svn_dirent_is_child(dst_parent_abspath, src_parent_abspath,
                                    iterpool))
         {
-          SVN_ERR(svn_wc__adm_open_in_context(&dst_access, ctx->wc_ctx,
-                                              pair->dst_parent, TRUE, -1,
-                                              ctx->cancel_func,
-                                              ctx->cancel_baton, iterpool));
-          SVN_ERR(svn_wc_adm_retrieve(&src_access, dst_access, src_parent,
-                                      iterpool));
-          close_dst_access = TRUE;
+          baton.lock_src = FALSE;
+          baton.lock_dst = TRUE;
         }
       else
         {
-          SVN_ERR(svn_wc__adm_open_in_context(&src_access, ctx->wc_ctx,
-                                              src_parent, TRUE, -1,
-                                              ctx->cancel_func,
-                                              ctx->cancel_baton, iterpool));
-          SVN_ERR(svn_wc__adm_open_in_context(&dst_access, ctx->wc_ctx,
-                                              pair->dst_parent, TRUE, -1,
-                                              ctx->cancel_func,
-                                              ctx->cancel_baton, iterpool));
-          close_dst_access = TRUE;
-          close_src_access = TRUE;
+          baton.lock_src = TRUE;
+          baton.lock_dst = TRUE;
         }
 
       /* Perform the copy and then the delete. */
-      SVN_ERR(svn_dirent_get_absolute(&pair->src_abs, pair->src, pool));
-      dst_abspath = svn_dirent_join(dst_parent_abspath, pair->base_name,
-                                    iterpool);
-      err = svn_wc_copy3(ctx->wc_ctx, pair->src_abs, dst_abspath,
-                         ctx->cancel_func, ctx->cancel_baton,
-                         ctx->notify_func2, ctx->notify_baton2, iterpool);
-      if (err)
-        break;
-
-      /* Perform the delete. */
-      SVN_ERR(svn_wc_delete4(ctx->wc_ctx, pair->src_abs, FALSE, FALSE,
-                             ctx->cancel_func, ctx->cancel_baton,
-                             ctx->notify_func2, ctx->notify_baton2,
-                             iterpool));
-
-      if (close_dst_access)
-        SVN_ERR(svn_wc_adm_close2(dst_access, iterpool));
-      if (close_src_access)
-        SVN_ERR(svn_wc_adm_close2(src_access, iterpool));
+      baton.ctx = ctx;
+      baton.pair = pair;
+      baton.dst_parent_abspath = dst_parent_abspath;
+      if (baton.lock_src)
+        SVN_ERR(svn_wc__call_with_write_lock(do_wc_to_wc_moves_with_locks1,
+                                             &baton,
+                                             ctx->wc_ctx, src_parent_abspath,
+                                             iterpool, iterpool));
+      else
+        SVN_ERR(do_wc_to_wc_moves_with_locks1(&baton, iterpool, iterpool));
+
     }
   svn_pool_destroy(iterpool);