You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ju...@apache.org on 2012/08/14 16:17:02 UTC
svn commit: r1372898 - in /subversion/trunk/subversion/libsvn_client:
merge.c ra.c
Author: julianfoad
Date: Tue Aug 14 14:17:02 2012
New Revision: 1372898
URL: http://svn.apache.org/viewvc?rev=1372898&view=rev
Log:
When temporarily reparenting an RA session in libsvn_client, make sure we
restore the session URL even if the intervening code throws an error.
This patch doesn't fix every instance of the bug: notably, it doesn't fix
the reparenting of the two RA sessions in drive_merge_report_editor().
However, at present there is no code that recovers from an error thrown by
that function, so that does not matter.
I was not aware of any symptoms caused by this bug, until I tried an
experimental code rearrangement in merge.c (moving the call of
remove_noop_subtree_ranges() after fix_deleted_subtree_ranges()) which
triggered one of the session-URL assertions that I added recently.
* subversion/libsvn_client/merge.c
(single_file_merge_get_file, do_file_merge, find_unsynced_ranges): As above.
* subversion/libsvn_client/ra.c
(svn_client__repos_location_segments, svn_client__repos_location): As above.
Modified:
subversion/trunk/subversion/libsvn_client/merge.c
subversion/trunk/subversion/libsvn_client/ra.c
Modified: subversion/trunk/subversion/libsvn_client/merge.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/merge.c?rev=1372898&r1=1372897&r2=1372898&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/merge.c (original)
+++ subversion/trunk/subversion/libsvn_client/merge.c Tue Aug 14 14:17:02 2012
@@ -5421,6 +5421,7 @@ single_file_merge_get_file(const char **
{
svn_stream_t *stream;
const char *old_sess_url;
+ svn_error_t *err;
SVN_ERR(svn_stream_open_unique(&stream, filename,
svn_dirent_dirname(wc_target, pool),
@@ -5428,9 +5429,10 @@ single_file_merge_get_file(const char **
SVN_ERR(svn_client__ensure_ra_session_url(&old_sess_url, ra_session, location->url,
pool));
- SVN_ERR(svn_ra_get_file(ra_session, "", location->rev,
- stream, NULL, props, pool));
- SVN_ERR(svn_ra_reparent(ra_session, old_sess_url, pool));
+ err = svn_ra_get_file(ra_session, "", location->rev,
+ stream, NULL, props, pool);
+ SVN_ERR(svn_error_compose_create(
+ err, svn_ra_reparent(ra_session, old_sess_url, pool)));
return svn_stream_close(stream);
}
@@ -6979,15 +6981,18 @@ do_file_merge(svn_mergeinfo_catalog_t re
if (source->ancestral && (remaining_ranges->nelts > 1))
{
const char *old_sess_url;
+ svn_error_t *err;
+
SVN_ERR(svn_client__ensure_ra_session_url(&old_sess_url,
merge_b->ra_session1,
primary_src->url,
iterpool));
- SVN_ERR(remove_noop_merge_ranges(&ranges_to_merge,
- merge_b->ra_session1,
- remaining_ranges, scratch_pool));
- SVN_ERR(svn_ra_reparent(merge_b->ra_session1, old_sess_url,
- iterpool));
+ err = remove_noop_merge_ranges(&ranges_to_merge,
+ merge_b->ra_session1,
+ remaining_ranges, scratch_pool);
+ SVN_ERR(svn_error_compose_create(
+ err, svn_ra_reparent(merge_b->ra_session1, old_sess_url,
+ iterpool)));
}
for (i = 0; i < ranges_to_merge->nelts; i++)
@@ -10088,9 +10093,7 @@ find_unsynced_ranges(const svn_client__p
svn_merge_range_t *))->end;
log_find_operative_baton_t log_baton;
const char *old_session_url;
-
- SVN_ERR(svn_client__ensure_ra_session_url(
- &old_session_url, ra_session, target_loc->url, scratch_pool));
+ svn_error_t *err;
log_baton.merged_catalog = merged_catalog;
log_baton.unmerged_catalog = true_unmerged_catalog;
@@ -10100,12 +10103,14 @@ find_unsynced_ranges(const svn_client__p
= svn_client__pathrev_fspath(target_loc, scratch_pool);
log_baton.result_pool = result_pool;
- SVN_ERR(get_log(ra_session, "", youngest_rev, oldest_rev,
- TRUE, /* discover_changed_paths */
- log_find_operative_revs, &log_baton,
- scratch_pool));
-
- SVN_ERR(svn_ra_reparent(ra_session, old_session_url, scratch_pool));
+ SVN_ERR(svn_client__ensure_ra_session_url(
+ &old_session_url, ra_session, target_loc->url, scratch_pool));
+ err = get_log(ra_session, "", youngest_rev, oldest_rev,
+ TRUE, /* discover_changed_paths */
+ log_find_operative_revs, &log_baton,
+ scratch_pool);
+ SVN_ERR(svn_error_compose_create(
+ err, svn_ra_reparent(ra_session, old_session_url, scratch_pool)));
}
return SVN_NO_ERROR;
Modified: subversion/trunk/subversion/libsvn_client/ra.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/ra.c?rev=1372898&r1=1372897&r2=1372898&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/ra.c (original)
+++ subversion/trunk/subversion/libsvn_client/ra.c Tue Aug 14 14:17:02 2012
@@ -581,6 +581,7 @@ svn_client__repos_location_segments(apr_
{
struct gls_receiver_baton_t gls_receiver_baton;
const char *old_session_url;
+ svn_error_t *err;
*segments = apr_array_make(pool, 8, sizeof(svn_location_segment_t *));
gls_receiver_baton.segments = *segments;
@@ -588,11 +589,12 @@ svn_client__repos_location_segments(apr_
gls_receiver_baton.pool = pool;
SVN_ERR(svn_client__ensure_ra_session_url(&old_session_url, ra_session,
url, pool));
- SVN_ERR(svn_ra_get_location_segments(ra_session, "", peg_revision,
- start_revision, end_revision,
- gls_receiver, &gls_receiver_baton,
- pool));
- SVN_ERR(svn_ra_reparent(ra_session, old_session_url, pool));
+ err = svn_ra_get_location_segments(ra_session, "", peg_revision,
+ start_revision, end_revision,
+ gls_receiver, &gls_receiver_baton,
+ pool);
+ SVN_ERR(svn_error_compose_create(
+ err, svn_ra_reparent(ra_session, old_session_url, pool)));
qsort((*segments)->elts, (*segments)->nelts,
(*segments)->elt_size, compare_segments);
return SVN_NO_ERROR;
@@ -689,14 +691,16 @@ svn_client__repos_location(svn_client__p
{
const char *old_session_url;
const char *op_url;
+ svn_error_t *err;
SVN_ERR(svn_client__ensure_ra_session_url(&old_session_url, ra_session,
peg_loc->url, scratch_pool));
- SVN_ERR(repos_locations(&op_url, NULL, ra_session,
- peg_loc->url, peg_loc->rev,
- op_revnum, SVN_INVALID_REVNUM,
- result_pool, scratch_pool));
- SVN_ERR(svn_ra_reparent(ra_session, old_session_url, scratch_pool));
+ err = repos_locations(&op_url, NULL, ra_session,
+ peg_loc->url, peg_loc->rev,
+ op_revnum, SVN_INVALID_REVNUM,
+ result_pool, scratch_pool);
+ SVN_ERR(svn_error_compose_create(
+ err, svn_ra_reparent(ra_session, old_session_url, scratch_pool)));
*op_loc_p = svn_client__pathrev_create(peg_loc->repos_root_url,
peg_loc->repos_uuid,