You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by pb...@apache.org on 2011/05/09 22:03:50 UTC

svn commit: r1101195 - /subversion/trunk/subversion/libsvn_client/merge.c

Author: pburba
Date: Mon May  9 20:03:50 2011
New Revision: 1101195

URL: http://svn.apache.org/viewvc?rev=1101195&view=rev
Log:
Don't create subpools in merge svn_wc_diff_callbacks4_t callbacks when there
are already scratch_pools available.

Suggested by: rhuijben

* subversion/libsvn_client/merge.c
  (merge_file_changed,
   merge_file_added,
   merge_file_deleted,
   merge_dir_added,
   merge_dir_deleted):

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

Modified: subversion/trunk/subversion/libsvn_client/merge.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/merge.c?rev=1101195&r1=1101194&r2=1101195&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/merge.c (original)
+++ subversion/trunk/subversion/libsvn_client/merge.c Mon May  9 20:03:50 2011
@@ -1319,7 +1319,6 @@ merge_file_changed(svn_wc_notify_state_t
                    apr_pool_t *scratch_pool)
 {
   merge_cmd_baton_t *merge_b = baton;
-  apr_pool_t *subpool;
   enum svn_wc_merge_outcome_t merge_outcome;
   svn_node_kind_t wc_kind;
   svn_boolean_t is_deleted;
@@ -1395,8 +1394,6 @@ merge_file_changed(svn_wc_notify_state_t
       return SVN_NO_ERROR;
     }
 
-   subpool = svn_pool_create(merge_b->pool);
-
   /* ### TODO: Thwart attempts to merge into a path that has
      ### unresolved conflicts.  This needs to be smart enough to deal
      ### with tree conflicts!
@@ -1431,7 +1428,6 @@ merge_file_changed(svn_wc_notify_state_t
           if (tree_conflicted != NULL)
             *tree_conflicted = TRUE;
 
-          svn_pool_destroy(subpool);
           return SVN_NO_ERROR;
         }
     }
@@ -1441,7 +1437,6 @@ merge_file_changed(svn_wc_notify_state_t
   /* Easy out: We are only applying mergeinfo differences. */
   if (merge_b->record_only)
     {
-      svn_pool_destroy(subpool);
       if (content_state)
         *content_state = svn_wc_notify_state_unchanged;
       return SVN_NO_ERROR;
@@ -1455,10 +1450,10 @@ merge_file_changed(svn_wc_notify_state_t
          '.merge-right.r%ld' strings are used to tag onto a file
          name in case of a merge conflict */
       const char *target_label = _(".working");
-      const char *left_label = apr_psprintf(subpool,
+      const char *left_label = apr_psprintf(scratch_pool,
                                             _(".merge-left.r%ld"),
                                             older_rev);
-      const char *right_label = apr_psprintf(subpool,
+      const char *right_label = apr_psprintf(scratch_pool,
                                              _(".merge-right.r%ld"),
                                              yours_rev);
       conflict_resolver_baton_t conflict_baton = { 0 };
@@ -1466,7 +1461,7 @@ merge_file_changed(svn_wc_notify_state_t
       const svn_wc_conflict_version_t *right;
 
       SVN_ERR(svn_wc_text_modified_p2(&has_local_mods, merge_b->ctx->wc_ctx,
-                                      mine_abspath, FALSE, subpool));
+                                      mine_abspath, FALSE, scratch_pool));
 
       conflict_baton.wrapped_func = merge_b->ctx->conflict_func2;
       conflict_baton.wrapped_baton = merge_b->ctx->conflict_baton2;
@@ -1484,7 +1479,7 @@ merge_file_changed(svn_wc_notify_state_t
                             conflict_resolver, &conflict_baton,
                             merge_b->ctx->cancel_func,
                             merge_b->ctx->cancel_baton,
-                            subpool));
+                            scratch_pool));
 
       if (content_state)
         {
@@ -1502,7 +1497,6 @@ merge_file_changed(svn_wc_notify_state_t
         }
     }
 
-  svn_pool_destroy(subpool);
   return SVN_NO_ERROR;
 }
 
@@ -1526,7 +1520,6 @@ merge_file_added(svn_wc_notify_state_t *
                  apr_pool_t *scratch_pool)
 {
   merge_cmd_baton_t *merge_b = baton;
-  apr_pool_t *subpool = svn_pool_create(merge_b->pool);
   svn_node_kind_t kind;
   int i;
   apr_hash_t *file_props;
@@ -1536,7 +1529,6 @@ merge_file_added(svn_wc_notify_state_t *
   /* Easy out: We are only applying mergeinfo differences. */
   if (merge_b->record_only)
     {
-      svn_pool_destroy(subpool);
       if (content_state)
         *content_state = svn_wc_notify_state_unchanged;
       if (prop_state)
@@ -1551,7 +1543,7 @@ merge_file_added(svn_wc_notify_state_t *
     *prop_state = svn_wc_notify_state_unknown;
 
   /* Apply the prop changes to a new hash table. */
-  file_props = apr_hash_copy(subpool, original_props);
+  file_props = apr_hash_copy(scratch_pool, original_props);
   for (i = 0; i < prop_changes->nelts; ++i)
     {
       const svn_prop_t *prop = &APR_ARRAY_IDX(prop_changes, i, svn_prop_t);
@@ -1600,12 +1592,11 @@ merge_file_added(svn_wc_notify_state_t *
         else if (content_state)
           *content_state = obstr_state;
 
-        svn_pool_destroy(subpool);
         return SVN_NO_ERROR;
       }
   }
 
-  SVN_ERR(svn_io_check_path(mine_abspath, &kind, subpool));
+  SVN_ERR(svn_io_check_path(mine_abspath, &kind, scratch_pool));
   switch (kind)
     {
     case svn_node_none:
@@ -1623,33 +1614,35 @@ merge_file_added(svn_wc_notify_state_t *
                Otherwise, we'll use a pure add. */
             if (merge_b->same_repos)
               {
-                const char *child = svn_dirent_is_child(merge_b->target_abspath,
-                                                        mine_abspath, subpool);
+                const char *child =
+                  svn_dirent_is_child(merge_b->target_abspath, mine_abspath,
+                                      scratch_pool);
                 if (child != NULL)
                   copyfrom_url = svn_path_url_add_component2(
                                                merge_b->merge_source.url2,
-                                               child, subpool);
+                                               child, scratch_pool);
                 else
                   copyfrom_url = merge_b->merge_source.url2;
                 copyfrom_rev = rev2;
                 SVN_ERR(check_repos_match(merge_b, mine_abspath, copyfrom_url,
-                                          subpool));
+                                          scratch_pool));
                 new_base_props = file_props;
                 new_props = NULL; /* inherit from new_base_props */
                 SVN_ERR(svn_stream_open_readonly(&new_base_contents,
                                                  yours_abspath,
-                                                 subpool, subpool));
+                                                 scratch_pool,
+                                                 scratch_pool));
                 new_contents = NULL; /* inherit from new_base_contents */
               }
             else
               {
                 copyfrom_url = NULL;
                 copyfrom_rev = SVN_INVALID_REVNUM;
-                new_base_props = apr_hash_make(subpool);
+                new_base_props = apr_hash_make(scratch_pool);
                 new_props = file_props;
-                new_base_contents = svn_stream_empty(subpool);
+                new_base_contents = svn_stream_empty(scratch_pool);
                 SVN_ERR(svn_stream_open_readonly(&new_contents, yours_abspath,
-                                                 subpool, subpool));
+                                                 scratch_pool, scratch_pool));
               }
 
             SVN_ERR(svn_wc__get_tree_conflict(&existing_conflict,
@@ -1677,14 +1670,15 @@ merge_file_added(svn_wc_notify_state_t *
                    copying 'yours' to 'mine', isn't enough; we need to get
                    the whole text-base and props installed too, just as if
                    we had called 'svn cp wc wc'. */
-                SVN_ERR(svn_wc_add_repos_file4(
-                            merge_b->ctx->wc_ctx, mine_abspath,
-                            new_base_contents, new_contents,
-                            new_base_props, new_props,
-                            copyfrom_url, copyfrom_rev,
-                            merge_b->ctx->cancel_func,
-                            merge_b->ctx->cancel_baton,
-                            subpool));
+                SVN_ERR(svn_wc_add_repos_file4(merge_b->ctx->wc_ctx,
+                                               mine_abspath,
+                                               new_base_contents,
+                                               new_contents,
+                                               new_base_props, new_props,
+                                               copyfrom_url, copyfrom_rev,
+                                               merge_b->ctx->cancel_func,
+                                               merge_b->ctx->cancel_baton,
+                                               scratch_pool));
 
                 /* ### delete 'yours' ? */
               }
@@ -1711,7 +1705,7 @@ merge_file_added(svn_wc_notify_state_t *
           /* directory already exists, is it under version control? */
           svn_node_kind_t wc_kind;
           SVN_ERR(svn_wc_read_kind(&wc_kind, merge_b->ctx->wc_ctx,
-                                   mine_abspath, FALSE, subpool));
+                                   mine_abspath, FALSE, scratch_pool));
 
           if ((wc_kind != svn_node_none)
               && dry_run_deleted_p(merge_b, mine_abspath))
@@ -1750,7 +1744,6 @@ merge_file_added(svn_wc_notify_state_t *
       break;
     }
 
-  svn_pool_destroy(subpool);
   return SVN_NO_ERROR;
 }
 
@@ -1844,7 +1837,6 @@ merge_file_deleted(svn_wc_notify_state_t
                    apr_pool_t *scratch_pool)
 {
   merge_cmd_baton_t *merge_b = baton;
-  apr_pool_t *subpool = svn_pool_create(merge_b->pool);
   svn_node_kind_t kind;
 
   if (merge_b->dry_run)
@@ -1857,7 +1849,6 @@ merge_file_deleted(svn_wc_notify_state_t
   /* Easy out: We are only applying mergeinfo differences. */
   if (merge_b->record_only)
     {
-      svn_pool_destroy(subpool);
       if (state)
         *state = svn_wc_notify_state_unchanged;
       return SVN_NO_ERROR;
@@ -1876,12 +1867,11 @@ merge_file_deleted(svn_wc_notify_state_t
       {
         if (state)
           *state = obstr_state;
-        svn_pool_destroy(subpool);
         return SVN_NO_ERROR;
       }
   }
 
-  SVN_ERR(svn_io_check_path(mine_abspath, &kind, subpool));
+  SVN_ERR(svn_io_check_path(mine_abspath, &kind, scratch_pool));
   switch (kind)
     {
     case svn_node_file:
@@ -1890,14 +1880,15 @@ merge_file_deleted(svn_wc_notify_state_t
 
         /* If the files are identical, attempt deletion */
         SVN_ERR(files_same_p(&same, older_abspath, original_props,
-                             mine_abspath, merge_b->ctx->wc_ctx, subpool));
+                             mine_abspath, merge_b->ctx->wc_ctx,
+                             scratch_pool));
         if (same || merge_b->force || merge_b->record_only /* ### why? */)
           {
             /* Passing NULL for the notify_func and notify_baton because
                repos_diff.c:delete_entry() will do it for us. */
             SVN_ERR(svn_client__wc_delete(mine_abspath, TRUE,
                                           merge_b->dry_run, FALSE, NULL, NULL,
-                                          merge_b->ctx, subpool));
+                                          merge_b->ctx, scratch_pool));
             if (state)
               *state = svn_wc_notify_state_changed;
           }
@@ -1953,7 +1944,6 @@ merge_file_deleted(svn_wc_notify_state_t
       break;
     }
 
-  svn_pool_destroy(subpool);
   return SVN_NO_ERROR;
 }
 
@@ -1968,10 +1958,9 @@ merge_dir_added(svn_wc_notify_state_t *s
                 const char *copyfrom_path,
                 svn_revnum_t copyfrom_revision,
                 void *baton,
-               apr_pool_t *scratch_pool)
+                apr_pool_t *scratch_pool)
 {
   merge_cmd_baton_t *merge_b = baton;
-  apr_pool_t *subpool = svn_pool_create(merge_b->pool);
   svn_node_kind_t kind;
   const char *copyfrom_url = NULL, *child;
   svn_revnum_t copyfrom_rev = SVN_INVALID_REVNUM;
@@ -1982,7 +1971,6 @@ merge_dir_added(svn_wc_notify_state_t *s
   /* Easy out: We are only applying mergeinfo differences. */
   if (merge_b->record_only)
     {
-      svn_pool_destroy(subpool);
       if (state)
         *state = svn_wc_notify_state_unchanged;
       return SVN_NO_ERROR;
@@ -1999,11 +1987,11 @@ merge_dir_added(svn_wc_notify_state_t *s
   if (merge_b->same_repos)
     {
       copyfrom_url = svn_path_url_add_component2(merge_b->merge_source.url2,
-                                                 child, subpool);
+                                                 child, scratch_pool);
       copyfrom_rev = rev;
 
       SVN_ERR(check_repos_match(merge_b, parent_abspath, copyfrom_url,
-                                subpool));
+                                scratch_pool));
     }
 
   /* Check for an obstructed or missing node on disk. */
@@ -2046,7 +2034,6 @@ merge_dir_added(svn_wc_notify_state_t *s
           }
         else if (state)
           *state = obstr_state;
-        svn_pool_destroy(subpool);
         return SVN_NO_ERROR;
       }
 
@@ -2067,14 +2054,15 @@ merge_dir_added(svn_wc_notify_state_t *s
         }
       else
         {
-          SVN_ERR(svn_io_dir_make(local_abspath, APR_OS_DEFAULT, subpool));
+          SVN_ERR(svn_io_dir_make(local_abspath, APR_OS_DEFAULT,
+                                  scratch_pool));
           SVN_ERR(svn_wc_add4(merge_b->ctx->wc_ctx, local_abspath,
                               svn_depth_infinity,
                               copyfrom_url, copyfrom_rev,
                               merge_b->ctx->cancel_func,
                               merge_b->ctx->cancel_baton,
                               NULL, NULL, /* don't pass notification func! */
-                              subpool));
+                              scratch_pool));
 
         }
       if (state)
@@ -2093,7 +2081,7 @@ merge_dir_added(svn_wc_notify_state_t *s
                                 merge_b->ctx->cancel_func,
                                 merge_b->ctx->cancel_baton,
                                 NULL, NULL, /* no notification func! */
-                                subpool));
+                                scratch_pool));
           else
             merge_b->added_path = apr_pstrdup(merge_b->pool, local_abspath);
           if (state)
@@ -2153,7 +2141,6 @@ merge_dir_added(svn_wc_notify_state_t *s
       break;
     }
 
-  svn_pool_destroy(subpool);
   return SVN_NO_ERROR;
 }
 
@@ -2166,7 +2153,6 @@ merge_dir_deleted(svn_wc_notify_state_t 
                   apr_pool_t *scratch_pool)
 {
   merge_cmd_baton_t *merge_b = baton;
-  apr_pool_t *subpool = svn_pool_create(merge_b->pool);
   svn_node_kind_t kind;
   svn_error_t *err;
   svn_boolean_t is_versioned;
@@ -2175,7 +2161,6 @@ merge_dir_deleted(svn_wc_notify_state_t 
   /* Easy out: We are only applying mergeinfo differences. */
   if (merge_b->record_only)
     {
-      svn_pool_destroy(subpool);
       if (state)
         *state = svn_wc_notify_state_unchanged;
       return SVN_NO_ERROR;
@@ -2196,7 +2181,6 @@ merge_dir_deleted(svn_wc_notify_state_t 
       {
         if (state)
           *state = obstr_state;
-        svn_pool_destroy(subpool);
         return SVN_NO_ERROR;
       }
 
@@ -2231,7 +2215,7 @@ merge_dir_deleted(svn_wc_notify_state_t 
             err = svn_client__wc_delete(local_abspath, merge_b->force,
                                         merge_b->dry_run, FALSE,
                                         NULL, NULL,
-                                        merge_b->ctx, subpool);
+                                        merge_b->ctx, scratch_pool);
             if (err)
               {
                 svn_error_clear(err);
@@ -2287,7 +2271,6 @@ merge_dir_deleted(svn_wc_notify_state_t 
       break;
     }
 
-  svn_pool_destroy(subpool);
   return SVN_NO_ERROR;
 }