Author: pburba
Date: Tue May 10 20:31:32 2011
New Revision: 1101635
URL: http://svn.apache.org/viewvc?rev=1101635&view=rev
Log:
Some more pool cleanup in libsvn_client/merge.c.
* subversion/libsvn_client/merge.c
(properties_same_p,
make_merge_conflict_error):
Rename sole pool argument to scratch_pool to better reflect its purpose.
(inherit_implicit_mergeinfo_from_parent): Replace single pool argument
with scratch and result pools.
(record_skips,
drive_merge_report_editor): Rename sole pool argument to scratch_pool
to better reflect its purpose. Add an iterpool for unbounded iteration.
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=1101635&r1=1101634&r2=1101635&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/merge.c (original)
+++ subversion/trunk/subversion/libsvn_client/merge.c Tue May 10 20:31:32 2011
@@ -1753,13 +1753,13 @@ static svn_error_t *
properties_same_p(svn_boolean_t *same,
apr_hash_t *props1,
apr_hash_t *props2,
- apr_pool_t *pool)
+ apr_pool_t *scratch_pool)
{
apr_array_header_t *prop_changes;
int i, diffs;
/* Examine the properties that differ */
- SVN_ERR(svn_prop_diffs(&prop_changes, props1, props2, pool));
+ SVN_ERR(svn_prop_diffs(&prop_changes, props1, props2, scratch_pool));
diffs = 0;
for (i = 0; i < prop_changes->nelts; i++)
{
@@ -3411,7 +3411,8 @@ inherit_implicit_mergeinfo_from_parent(s
svn_revnum_t revision2,
svn_ra_session_t *ra_session,
svn_client_ctx_t *ctx,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
const char *path_diff;
@@ -3427,19 +3428,20 @@ inherit_implicit_mergeinfo_from_parent(s
ra_session, child->abspath,
MAX(revision1, revision2),
MIN(revision1, revision2),
- ctx, pool, pool));
+ ctx, result_pool, scratch_pool));
/* Let CHILD inherit PARENT's implicit mergeinfo. */
- child->implicit_mergeinfo = apr_hash_make(pool);
+ child->implicit_mergeinfo = apr_hash_make(result_pool);
- path_diff = svn_dirent_is_child(parent->abspath, child->abspath, pool);
+ path_diff = svn_dirent_is_child(parent->abspath, child->abspath,
+ scratch_pool);
/* PARENT->PATH better be an ancestor of CHILD->ABSPATH! */
SVN_ERR_ASSERT(path_diff);
SVN_ERR(svn_client__adjust_mergeinfo_source_paths(
child->implicit_mergeinfo, path_diff,
- parent->implicit_mergeinfo, pool));
+ parent->implicit_mergeinfo, result_pool));
return SVN_NO_ERROR;
}
@@ -3479,7 +3481,8 @@ ensure_implicit_mergeinfo(svn_client__me
revision2,
ra_session,
ctx,
- result_pool));
+ result_pool,
+ scratch_pool));
else
SVN_ERR(get_full_mergeinfo(NULL,
&(child->implicit_mergeinfo),
@@ -4569,31 +4572,34 @@ record_skips(const char *mergeinfo_path,
svn_boolean_t is_rollback,
notification_receiver_baton_t *notify_b,
merge_cmd_baton_t *merge_b,
- apr_pool_t *pool)
+ apr_pool_t *scratch_pool)
{
apr_hash_index_t *hi;
apr_hash_t *merges;
apr_size_t nbr_skips = (notify_b->skipped_abspaths != NULL ?
apr_hash_count(notify_b->skipped_abspaths) : 0);
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
if (nbr_skips == 0)
return SVN_NO_ERROR;
- merges = apr_hash_make(pool);
+ merges = apr_hash_make(scratch_pool);
/* Override the mergeinfo for child paths which weren't actually merged. */
- for (hi = apr_hash_first(pool, notify_b->skipped_abspaths); hi;
+ for (hi = apr_hash_first(scratch_pool, notify_b->skipped_abspaths); hi;
hi = apr_hash_next(hi))
{
const char *skipped_abspath = svn__apr_hash_index_key(hi);
svn_wc_notify_state_t obstruction_state;
+ svn_pool_clear(iterpool);
+
/* Before we override, make sure this is a versioned path, it might
be an external or missing from disk due to authz restrictions. */
SVN_ERR(perform_obstruction_check(&obstruction_state,
NULL, NULL, NULL,
merge_b, skipped_abspath,
- svn_node_unknown, pool));
+ svn_node_unknown, iterpool));
if (obstruction_state == svn_wc_notify_state_obstructed
|| obstruction_state == svn_wc_notify_state_missing)
continue;
@@ -4611,7 +4617,8 @@ record_skips(const char *mergeinfo_path,
### http://subversion.tigris.org/issues/show_bug.cgi?id=3440. */
apr_hash_set(merges, skipped_abspath,
APR_HASH_KEY_STRING,
- apr_array_make(pool, 0, sizeof(svn_merge_range_t *)));
+ apr_array_make(scratch_pool, 0,
+ sizeof(svn_merge_range_t *)));
if (nbr_skips < notify_b->nbr_notifications)
/* ### Use RANGELIST as the mergeinfo for all children of
@@ -4619,9 +4626,10 @@ record_skips(const char *mergeinfo_path,
### skipped? */
;
}
+ svn_pool_destroy(iterpool);
SVN_ERR(update_wc_mergeinfo(NULL, merge_b->target_abspath,
mergeinfo_path, merges,
- is_rollback, merge_b->ctx, pool));
+ is_rollback, merge_b->ctx, scratch_pool));
return SVN_NO_ERROR;
}
@@ -4631,7 +4639,7 @@ record_skips(const char *mergeinfo_path,
static APR_INLINE svn_error_t *
make_merge_conflict_error(const char *target_wcpath,
svn_merge_range_t *r,
- apr_pool_t *pool)
+ apr_pool_t *scratch_pool)
{
return svn_error_createf
(SVN_ERR_WC_FOUND_CONFLICT, NULL,
@@ -4639,7 +4647,7 @@ make_merge_conflict_error(const char *ta
"'%s' --\n"
"resolve all conflicts and rerun the merge to apply the remaining\n"
"unmerged revisions"),
- r->start, r->end, svn_dirent_local_style(target_wcpath, pool));
+ r->start, r->end, svn_dirent_local_style(target_wcpath, scratch_pool));
}
/* Remove the element at IDX from the array ARR.
@@ -4807,7 +4815,7 @@ drive_merge_report_editor(const char *ta
svn_depth_t depth,
notification_receiver_baton_t *notify_b,
merge_cmd_baton_t *merge_b,
- apr_pool_t *pool)
+ apr_pool_t *scratch_pool)
{
const svn_ra_reporter3_t *reporter;
const svn_delta_editor_t *diff_editor;
@@ -4878,7 +4886,7 @@ drive_merge_report_editor(const char *ta
this to request individual file contents. */
SVN_ERR(svn_client__ensure_ra_session_url(&old_sess2_url,
merge_b->ra_session2,
- url1, pool));
+ url1, scratch_pool));
/* Get the diff editor and a reporter with which to, ultimately,
drive it. */
@@ -4891,22 +4899,23 @@ drive_merge_report_editor(const char *ta
merge_b->ctx->cancel_func,
merge_b->ctx->cancel_baton,
notification_receiver, notify_b,
- pool, pool));
+ scratch_pool, scratch_pool));
SVN_ERR(svn_ra_do_diff3(merge_b->ra_session1,
&reporter, &report_baton, revision2,
"", depth, merge_b->ignore_ancestry,
TRUE, /* text_deltas */
- url2, diff_editor, diff_edit_baton, pool));
+ url2, diff_editor, diff_edit_baton, scratch_pool));
/* Drive the reporter. */
SVN_ERR(reporter->set_path(report_baton, "", target_start, depth,
- FALSE, NULL, pool));
+ FALSE, NULL, scratch_pool));
if (honor_mergeinfo && children_with_mergeinfo)
{
/* Describe children with mergeinfo overlapping this merge
operation such that no repeated diff is retrieved for them from
the repository. */
int i;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
/* Start with CHILDREN_WITH_MERGEINFO[1], CHILDREN_WITH_MERGEINFO[0]
is always the merge target (TARGET_ABSPATH). */
@@ -4924,6 +4933,8 @@ drive_merge_report_editor(const char *ta
if (child->absent)
continue;
+ svn_pool_clear(iterpool);
+
/* Find this child's nearest wc ancestor with mergeinfo. */
parent_index = find_nearest_ancestor(children_with_mergeinfo,
FALSE, child->abspath);
@@ -4972,7 +4983,8 @@ drive_merge_report_editor(const char *ta
/* Ok, we really need to describe this subtree as it needs different
ranges applied than its nearest working copy parent. */
child_repos_path = svn_dirent_is_child(target_abspath,
- child->abspath, pool);
+ child->abspath,
+ iterpool);
/* This loop is only processing subtrees, so CHILD->ABSPATH
better be a proper child of the merge target. */
SVN_ERR_ASSERT(child_repos_path);
@@ -4986,21 +4998,22 @@ drive_merge_report_editor(const char *ta
anything. */
SVN_ERR(reporter->set_path(report_baton, child_repos_path,
revision2, depth, FALSE,
- NULL, pool));
+ NULL, iterpool));
}
else
{
SVN_ERR(reporter->set_path(report_baton, child_repos_path,
range->start, depth, FALSE,
- NULL, pool));
+ NULL, iterpool));
}
}
+ svn_pool_destroy(iterpool);
}
- SVN_ERR(reporter->finish_report(report_baton, pool));
+ SVN_ERR(reporter->finish_report(report_baton, scratch_pool));
/* Point the merge baton's second session back where it was. */
if (old_sess2_url)
- SVN_ERR(svn_ra_reparent(merge_b->ra_session2, old_sess2_url, pool));
+ SVN_ERR(svn_ra_reparent(merge_b->ra_session2, old_sess2_url,
scratch_pool));
/* Caller must call svn_sleep_for_timestamps() */
*(merge_b->use_sleep) = TRUE;