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,