Author: rhuijben
Date: Fri Jun  1 13:16:03 2012
New Revision: 1345158

URL: http://svn.apache.org/viewvc?rev=1345158&view=rev
Log:
Avoid creating another ra session in most code paths in the merge code. At the
same time fix accidentally opening the ra session with a non read-only working
copy.

This patch relies on the ra.c fix in r1345143, as before this patch we
sometimes opened a working copy that would try to update the dav cache.

* subversion/libsvn_client/merge.c
  (svn_client_open_ra_session): Use svn_client_open_ra_session() as we only
     use the standard options.
  (do_merge): Accept a ra_session to help avoiding creating another session.
  (merge_cousins_and_supplement_mergeinfo,
   merge_locked): Pass session.
  (merge_peg_locked): Pass session. Use session pool as scratch pool for local
    work.
  (do_symmetric_merge_locked): Pass NULL for session.

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=1345158&r1=1345157&r2=1345158&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/merge.c (original)
+++ subversion/trunk/subversion/libsvn_client/merge.c Fri Jun  1 13:16:03 2012
@@ -8856,7 +8856,7 @@ do_directory_merge(svn_mergeinfo_catalog
  * repository, or by allocating a new *RA_SESSION in POOL.
  * (RA_SESSION itself cannot be null, of course.)
  *
- * CTX is used as for svn_client__open_ra_session_internal().
+ * CTX is used as for svn_client_open_ra_session().
  */
 static svn_error_t *
 ensure_ra_session_url(svn_ra_session_t **ra_session,
@@ -8876,8 +8876,7 @@ ensure_ra_session_url(svn_ra_session_t *
   if (! *ra_session || (err && err->apr_err == SVN_ERR_RA_ILLEGAL_URL))
     {
       svn_error_clear(err);
-      err = svn_client__open_ra_session_internal(ra_session, NULL, url, NULL,
-                                                 NULL, FALSE, TRUE, ctx, pool);
+      err = svn_client_open_ra_session(ra_session, url, ctx, pool);
     }
   SVN_ERR(err);
 
@@ -8944,6 +8943,7 @@ do_merge(apr_hash_t **modified_subtrees,
          svn_mergeinfo_catalog_t result_catalog,
          const apr_array_header_t *merge_sources,
          const merge_target_t *target,
+         svn_ra_session_t *src_session,
          svn_boolean_t sources_related,
          svn_boolean_t same_repos,
          svn_boolean_t ignore_ancestry,
@@ -8967,6 +8967,7 @@ do_merge(apr_hash_t **modified_subtrees,
   int i;
   svn_boolean_t checked_mergeinfo_capability = FALSE;
   svn_ra_session_t *ra_session1 = NULL, *ra_session2 = NULL;
+  const char *old_src_session_url = NULL;
   apr_pool_t *iterpool;
 
   SVN_ERR_ASSERT(svn_dirent_is_absolute(target->abspath));
@@ -9059,6 +9060,13 @@ do_merge(apr_hash_t **modified_subtrees,
   notify_baton.merge_b = &merge_cmd_baton;
   notify_baton.pool = result_pool;
 
+  if (src_session)
+    {
+      SVN_ERR(svn_ra_get_session_url(src_session, &old_src_session_url,
+                                     scratch_pool));
+      ra_session1 = src_session;
+    }
+
   for (i = 0; i < merge_sources->nelts; i++)
     {
       merge_source_t *source =
@@ -9162,6 +9170,9 @@ do_merge(apr_hash_t **modified_subtrees,
   /* Let everyone know we're finished here. */
   notify_merge_completed(target->abspath, ctx, iterpool);
 
+  if (src_session)
+    SVN_ERR(svn_ra_reparent(src_session, old_src_session_url, iterpool));
+
   svn_pool_destroy(iterpool);
   return SVN_NO_ERROR;
 }
@@ -9233,7 +9244,7 @@ merge_cousins_and_supplement_mergeinfo(c
       modified_subtrees = apr_hash_make(scratch_pool);
       APR_ARRAY_PUSH(faux_sources, const merge_source_t *) = source;
       SVN_ERR(do_merge(&modified_subtrees, NULL, faux_sources, target,
-                       TRUE, same_repos,
+                       URL1_ra_session, TRUE, same_repos,
                        ignore_ancestry, force, dry_run, FALSE, NULL, TRUE,
                        FALSE, depth, merge_options, use_sleep, ctx,
                        scratch_pool, subpool));
@@ -9265,14 +9276,14 @@ merge_cousins_and_supplement_mergeinfo(c
       notify_mergeinfo_recording(target->abspath, NULL, ctx, scratch_pool);
       svn_pool_clear(subpool);
       SVN_ERR(do_merge(NULL, add_result_catalog, add_sources, target,
-                       TRUE, same_repos,
+                       URL1_ra_session, TRUE, same_repos,
                        ignore_ancestry, force, dry_run, TRUE,
                        modified_subtrees, TRUE,
                        TRUE, depth, merge_options, use_sleep, ctx,
                        scratch_pool, subpool));
       svn_pool_clear(subpool);
       SVN_ERR(do_merge(NULL, remove_result_catalog, remove_sources, target,
-                       TRUE, same_repos,
+                       URL1_ra_session, TRUE, same_repos,
                        ignore_ancestry, force, dry_run, TRUE,
                        modified_subtrees, TRUE,
                        TRUE, depth, merge_options, use_sleep, ctx,
@@ -9641,7 +9652,7 @@ merge_locked(const char *source1,
     }
 
   err = do_merge(NULL, NULL, merge_sources, target,
-                 related, same_repos,
+                 ra_session1, related, same_repos,
                  ignore_ancestry, force, dry_run,
                  record_only, NULL, FALSE, FALSE, depth, merge_options,
                  &use_sleep, ctx, scratch_pool, scratch_pool);
@@ -10730,10 +10741,9 @@ open_reintegrate_source_and_target(svn_r
   SVN_ERR(open_target_wc(&target, target_abspath,
                          FALSE, FALSE, FALSE,
                          ctx, scratch_pool, scratch_pool));
-  SVN_ERR(svn_client__open_ra_session_internal(target_ra_session_p, NULL,
-                                               target->loc.url,
-                                               NULL, NULL, FALSE, FALSE,
-                                               ctx, scratch_pool));
+  SVN_ERR(svn_client_open_ra_session(target_ra_session_p,
+                                     target->loc.url,
+                                     ctx, scratch_pool));
   if (! target->loc.url)
     return svn_error_createf(SVN_ERR_CLIENT_UNRELATED_RESOURCES, NULL,
                              _("Can't reintegrate into '%s' because it is "
@@ -10926,42 +10936,41 @@ merge_peg_locked(const char *source_path
 
   SVN_ERR_ASSERT(svn_dirent_is_absolute(target_abspath));
 
+  /* Create a short lived session pool */
+  sesspool = svn_pool_create(scratch_pool);
+
   SVN_ERR(open_target_wc(&target, target_abspath,
                          allow_mixed_rev, TRUE, TRUE,
-                         ctx, scratch_pool, scratch_pool));
+                         ctx, sesspool, sesspool));
 
   /* Open an RA session to our source URL, and determine its root URL. */
-  sesspool = svn_pool_create(scratch_pool);
   SVN_ERR(open_source_session(&source_loc, &ra_session,
                               source_path_or_url, source_peg_revision,
-                              ctx, sesspool, scratch_pool));
+                              ctx, sesspool, sesspool));
 
   /* Normalize our merge sources. */
   SVN_ERR(normalize_merge_sources(&merge_sources, source_path_or_url,
                                   source_loc,
                                   ranges_to_merge, ra_session, ctx,
-                                  scratch_pool, scratch_pool));
+                                  sesspool, sesspool));
 
   /* Check for same_repos. */
   same_repos = is_same_repos(&target->loc, source_loc, TRUE /* strict_urls */);
 
-  /* We're done with our little RA session. */
-  svn_pool_destroy(sesspool);
-
   /* Do the real merge!  (We say with confidence that our merge
      sources are both ancestral and related.) */
-  err = do_merge(NULL, NULL, merge_sources, target,
+  err = do_merge(NULL, NULL, merge_sources, target, ra_session,
                  TRUE, same_repos, ignore_ancestry, force, dry_run,
                  record_only, NULL, FALSE, FALSE, depth, merge_options,
-                 &use_sleep, ctx, scratch_pool, scratch_pool);
+                 &use_sleep, ctx, sesspool, sesspool);
 
   if (use_sleep)
-    svn_io_sleep_for_timestamps(target_abspath, scratch_pool);
+    svn_io_sleep_for_timestamps(target_abspath, sesspool);
 
-  if (err)
-    return svn_error_trace(err);
+  /* We're done with our RA session. */
+  svn_pool_destroy(sesspool);
 
-  return SVN_NO_ERROR;
+  return svn_error_trace(err);
 }
 
 svn_error_t *
@@ -11596,7 +11605,7 @@ do_symmetric_merge_locked(const svn_clie
       merge_sources = apr_array_make(scratch_pool, 1, sizeof(merge_source_t 
*));
       APR_ARRAY_PUSH(merge_sources, const merge_source_t *) = &source;
 
-      err = do_merge(NULL, NULL, merge_sources, target,
+      err = do_merge(NULL, NULL, merge_sources, target, NULL,
                      TRUE /*related*/,
                      TRUE /*same_repos*/, ignore_ancestry, force, dry_run,
                      record_only, NULL, FALSE, FALSE, depth, merge_options,


Reply via email to