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,