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 2013/02/15 15:37:41 UTC

svn commit: r1446605 - /subversion/trunk/subversion/libsvn_client/merge.c

Author: julianfoad
Date: Fri Feb 15 14:37:41 2013
New Revision: 1446605

URL: http://svn.apache.org/r1446605
Log:
Where a merge throws an error to report that there were conflicts, move
that code up to the calling function, one small step closer to making it
available through the API.  For issue #4316 "Merge errors out after
resolving conflicts".

* subversion/libsvn_client/merge.c
  (make_merge_conflict_error): Remove an unused parameter.
  (merge_locked,
   merge_reintegrate_locked,
   merge_peg_locked,
   do_automatic_merge_locked): Report conflicts through an output parameter
    instead of by an error. Add a 'result_pool' parameter.
  (svn_client_merge5,
   svn_client_merge_reintegrate,
   svn_client_merge_peg5,
   svn_client_do_automatic_merge): Call make_merge_conflict_error() here
    instead.

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=1446605&r1=1446604&r2=1446605&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/merge.c (original)
+++ subversion/trunk/subversion/libsvn_client/merge.c Fri Feb 15 14:37:41 2013
@@ -5321,7 +5321,6 @@ conflict_report_dup(const conflict_repor
    revisions range(s). */
 static APR_INLINE svn_error_t *
 make_merge_conflict_error(conflict_report_t *report,
-                          const char *target_wcpath,
                           apr_pool_t *scratch_pool)
 {
   assert(!report || svn_dirent_is_absolute(report->target_abspath));
@@ -10143,7 +10142,8 @@ open_target_wc(merge_target_t **target_p
  * IGNORE_MERGEINFO and DIFF_IGNORE_ANCESTRY are as in do_merge().
  */
 static svn_error_t *
-merge_locked(const char *source1,
+merge_locked(conflict_report_t **conflict_report,
+             const char *source1,
              const svn_opt_revision_t *revision1,
              const char *source2,
              const svn_opt_revision_t *revision2,
@@ -10157,6 +10157,7 @@ merge_locked(const char *source1,
              svn_boolean_t allow_mixed_rev,
              const apr_array_header_t *merge_options,
              svn_client_ctx_t *ctx,
+             apr_pool_t *result_pool,
              apr_pool_t *scratch_pool)
 {
   merge_target_t *target;
@@ -10165,7 +10166,6 @@ merge_locked(const char *source1,
   svn_ra_session_t *ra_session1, *ra_session2;
   apr_array_header_t *merge_sources;
   svn_error_t *err;
-  conflict_report_t *conflict_report;
   svn_boolean_t use_sleep = FALSE;
   svn_client__pathrev_t *yca = NULL;
   apr_pool_t *sesspool;
@@ -10262,7 +10262,7 @@ merge_locked(const char *source1,
           source.loc2 = source2_loc;
           source.ancestral = FALSE;
 
-          err = merge_cousins_and_supplement_mergeinfo(&conflict_report,
+          err = merge_cousins_and_supplement_mergeinfo(conflict_report,
                                                        &use_sleep,
                                                        target,
                                                        ra_session1,
@@ -10276,7 +10276,7 @@ merge_locked(const char *source1,
                                                        record_only, dry_run,
                                                        merge_options,
                                                        ctx,
-                                                       scratch_pool,
+                                                       result_pool,
                                                        scratch_pool);
           /* Close our temporary RA sessions (this could've happened
              after the second call to normalize_merge_sources() inside
@@ -10287,9 +10287,6 @@ merge_locked(const char *source1,
             svn_io_sleep_for_timestamps(target->abspath, scratch_pool);
 
           SVN_ERR(err);
-          SVN_ERR(make_merge_conflict_error(
-                    conflict_report, target->abspath, scratch_pool));
-
           return SVN_NO_ERROR;
         }
     }
@@ -10306,12 +10303,12 @@ merge_locked(const char *source1,
       APR_ARRAY_PUSH(merge_sources, merge_source_t *) = &source;
     }
 
-  err = do_merge(NULL, NULL, &conflict_report, &use_sleep,
+  err = do_merge(NULL, NULL, conflict_report, &use_sleep,
                  merge_sources, target,
                  ra_session1, sources_related, same_repos,
                  ignore_mergeinfo, diff_ignore_ancestry, force_delete, dry_run,
                  record_only, NULL, FALSE, FALSE, depth, merge_options,
-                 ctx, scratch_pool, scratch_pool);
+                 ctx, result_pool, scratch_pool);
 
   /* Close our temporary RA sessions. */
   svn_pool_destroy(sesspool);
@@ -10320,10 +10317,6 @@ merge_locked(const char *source1,
     svn_io_sleep_for_timestamps(target->abspath, scratch_pool);
 
   SVN_ERR(err);
-
-  SVN_ERR(make_merge_conflict_error(
-            conflict_report, target->abspath, scratch_pool));
-
   return SVN_NO_ERROR;
 }
 
@@ -10367,6 +10360,7 @@ svn_client_merge5(const char *source1,
                   apr_pool_t *pool)
 {
   const char *target_abspath, *lock_abspath;
+  conflict_report_t *conflict_report;
 
   /* Sanity check our input -- we require specified revisions,
    * and either 2 paths or 2 URLs. */
@@ -10389,19 +10383,22 @@ svn_client_merge5(const char *source1,
 
   if (!dry_run)
     SVN_WC__CALL_WITH_WRITE_LOCK(
-      merge_locked(source1, revision1, source2, revision2,
+      merge_locked(&conflict_report,
+                   source1, revision1, source2, revision2,
                    target_abspath, depth, ignore_mergeinfo,
                    diff_ignore_ancestry,
                    force_delete, record_only, dry_run,
-                   allow_mixed_rev, merge_options, ctx, pool),
+                   allow_mixed_rev, merge_options, ctx, pool, pool),
       ctx->wc_ctx, lock_abspath, FALSE /* lock_anchor */, pool);
   else
-    SVN_ERR(merge_locked(source1, revision1, source2, revision2,
+    SVN_ERR(merge_locked(&conflict_report,
+                   source1, revision1, source2, revision2,
                    target_abspath, depth, ignore_mergeinfo,
                    diff_ignore_ancestry,
                    force_delete, record_only, dry_run,
-                   allow_mixed_rev, merge_options, ctx, pool));
+                   allow_mixed_rev, merge_options, ctx, pool, pool));
 
+  SVN_ERR(make_merge_conflict_error(conflict_report, pool));
   return SVN_NO_ERROR;
 }
 
@@ -11419,13 +11416,15 @@ open_reintegrate_source_and_target(svn_r
 
 /* The body of svn_client_merge_reintegrate(), which see for details. */
 static svn_error_t *
-merge_reintegrate_locked(const char *source_path_or_url,
+merge_reintegrate_locked(conflict_report_t **conflict_report,
+                         const char *source_path_or_url,
                          const svn_opt_revision_t *source_peg_revision,
                          const char *target_abspath,
                          svn_boolean_t diff_ignore_ancestry,
                          svn_boolean_t dry_run,
                          const apr_array_header_t *merge_options,
                          svn_client_ctx_t *ctx,
+                         apr_pool_t *result_pool,
                          apr_pool_t *scratch_pool)
 {
   svn_ra_session_t *target_ra_session, *source_ra_session;
@@ -11433,7 +11432,6 @@ merge_reintegrate_locked(const char *sou
   svn_client__pathrev_t *source_loc;
   merge_source_t *source;
   svn_client__pathrev_t *yc_ancestor;
-  conflict_report_t *conflict_report;
   svn_boolean_t use_sleep;
   svn_error_t *err;
 
@@ -11459,7 +11457,7 @@ merge_reintegrate_locked(const char *sou
      ### isn't "ancestral" even if it is (in the degenerate case where
      ### source-left equals YCA). */
   source->ancestral = FALSE;
-  err = merge_cousins_and_supplement_mergeinfo(&conflict_report,
+  err = merge_cousins_and_supplement_mergeinfo(conflict_report,
                                                &use_sleep,
                                                target,
                                                target_ra_session,
@@ -11473,15 +11471,12 @@ merge_reintegrate_locked(const char *sou
                                                dry_run,
                                                merge_options,
                                                ctx,
-                                               scratch_pool, scratch_pool);
+                                               result_pool, scratch_pool);
 
   if (use_sleep)
     svn_io_sleep_for_timestamps(target_abspath, scratch_pool);
 
   SVN_ERR(err);
-  SVN_ERR(make_merge_conflict_error(
-            conflict_report, target->abspath, scratch_pool));
-
   return SVN_NO_ERROR;
 }
 
@@ -11495,23 +11490,27 @@ svn_client_merge_reintegrate(const char 
                              apr_pool_t *pool)
 {
   const char *target_abspath, *lock_abspath;
+  conflict_report_t *conflict_report;
 
   SVN_ERR(get_target_and_lock_abspath(&target_abspath, &lock_abspath,
                                       target_wcpath, ctx, pool));
 
   if (!dry_run)
     SVN_WC__CALL_WITH_WRITE_LOCK(
-      merge_reintegrate_locked(source_path_or_url, source_peg_revision,
+      merge_reintegrate_locked(&conflict_report,
+                               source_path_or_url, source_peg_revision,
                                target_abspath,
                                FALSE /*diff_ignore_ancestry*/,
-                               dry_run, merge_options, ctx, pool),
+                               dry_run, merge_options, ctx, pool, pool),
       ctx->wc_ctx, lock_abspath, FALSE /* lock_anchor */, pool);
   else
-    SVN_ERR(merge_reintegrate_locked(source_path_or_url, source_peg_revision,
+    SVN_ERR(merge_reintegrate_locked(&conflict_report,
+                                     source_path_or_url, source_peg_revision,
                                      target_abspath,
                                      FALSE /*diff_ignore_ancestry*/,
-                                     dry_run, merge_options, ctx, pool));
+                                     dry_run, merge_options, ctx, pool, pool));
 
+  SVN_ERR(make_merge_conflict_error(conflict_report, pool));
   return SVN_NO_ERROR;
 }
 
@@ -11521,7 +11520,8 @@ svn_client_merge_reintegrate(const char 
  * IGNORE_MERGEINFO and DIFF_IGNORE_ANCESTRY are as in do_merge().
  */
 static svn_error_t *
-merge_peg_locked(const char *source_path_or_url,
+merge_peg_locked(conflict_report_t **conflict_report,
+                 const char *source_path_or_url,
                  const svn_opt_revision_t *source_peg_revision,
                  const svn_rangelist_t *ranges_to_merge,
                  const char *target_abspath,
@@ -11534,6 +11534,7 @@ merge_peg_locked(const char *source_path
                  svn_boolean_t allow_mixed_rev,
                  const apr_array_header_t *merge_options,
                  svn_client_ctx_t *ctx,
+                 apr_pool_t *result_pool,
                  apr_pool_t *scratch_pool)
 {
   merge_target_t *target;
@@ -11541,7 +11542,6 @@ merge_peg_locked(const char *source_path
   apr_array_header_t *merge_sources;
   svn_ra_session_t *ra_session;
   apr_pool_t *sesspool;
-  conflict_report_t *conflict_report;
   svn_boolean_t use_sleep = FALSE;
   svn_error_t *err;
   svn_boolean_t same_repos;
@@ -11572,12 +11572,12 @@ merge_peg_locked(const char *source_path
 
   /* Do the real merge!  (We say with confidence that our merge
      sources are both ancestral and related.) */
-  err = do_merge(NULL, NULL, &conflict_report, &use_sleep,
+  err = do_merge(NULL, NULL, conflict_report, &use_sleep,
                  merge_sources, target, ra_session,
                  TRUE /*sources_related*/, same_repos, ignore_mergeinfo,
                  diff_ignore_ancestry, force_delete, dry_run,
                  record_only, NULL, FALSE, FALSE, depth, merge_options,
-                 ctx, scratch_pool, scratch_pool);
+                 ctx, result_pool, scratch_pool);
 
   /* We're done with our RA session. */
   svn_pool_destroy(sesspool);
@@ -11586,9 +11586,6 @@ merge_peg_locked(const char *source_path
     svn_io_sleep_for_timestamps(target_abspath, scratch_pool);
 
   SVN_ERR(err);
-  SVN_ERR(make_merge_conflict_error(
-            conflict_report, target->abspath, scratch_pool));
-
   return SVN_NO_ERROR;
 }
 
@@ -11609,6 +11606,7 @@ svn_client_merge_peg5(const char *source
                       apr_pool_t *pool)
 {
   const char *target_abspath, *lock_abspath;
+  conflict_report_t *conflict_report;
 
   /* No ranges to merge?  No problem. */
   if (ranges_to_merge->nelts == 0)
@@ -11619,21 +11617,24 @@ svn_client_merge_peg5(const char *source
 
   if (!dry_run)
     SVN_WC__CALL_WITH_WRITE_LOCK(
-      merge_peg_locked(source_path_or_url, source_peg_revision,
+      merge_peg_locked(&conflict_report,
+                       source_path_or_url, source_peg_revision,
                        ranges_to_merge,
                        target_abspath, depth, ignore_mergeinfo,
                        diff_ignore_ancestry,
                        force_delete, record_only, dry_run,
-                       allow_mixed_rev, merge_options, ctx, pool),
+                       allow_mixed_rev, merge_options, ctx, pool, pool),
       ctx->wc_ctx, lock_abspath, FALSE /* lock_anchor */, pool);
   else
-    SVN_ERR(merge_peg_locked(source_path_or_url, source_peg_revision,
+    SVN_ERR(merge_peg_locked(&conflict_report,
+                       source_path_or_url, source_peg_revision,
                        ranges_to_merge,
                        target_abspath, depth, ignore_mergeinfo,
                        diff_ignore_ancestry,
                        force_delete, record_only, dry_run,
-                       allow_mixed_rev, merge_options, ctx, pool));
+                       allow_mixed_rev, merge_options, ctx, pool, pool));
 
+  SVN_ERR(make_merge_conflict_error(conflict_report, pool));
   return SVN_NO_ERROR;
 }
 
@@ -12186,7 +12187,8 @@ svn_client_find_automatic_merge(svn_clie
  * eliminate already-cherry-picked revisions from the source.
  */
 static svn_error_t *
-do_automatic_merge_locked(const svn_client_automatic_merge_t *merge,
+do_automatic_merge_locked(conflict_report_t **conflict_report,
+                          const svn_client_automatic_merge_t *merge,
                           const char *target_abspath,
                           svn_depth_t depth,
                           svn_boolean_t diff_ignore_ancestry,
@@ -12195,11 +12197,11 @@ do_automatic_merge_locked(const svn_clie
                           svn_boolean_t dry_run,
                           const apr_array_header_t *merge_options,
                           svn_client_ctx_t *ctx,
+                          apr_pool_t *result_pool,
                           apr_pool_t *scratch_pool)
 {
   merge_target_t *target;
   svn_boolean_t reintegrate_like = merge->is_reintegrate_like;
-  conflict_report_t *conflict_report;
   svn_boolean_t use_sleep = FALSE;
   svn_error_t *err;
 
@@ -12257,7 +12259,7 @@ do_automatic_merge_locked(const svn_clie
       source.loc2 = merge->right;
       source.ancestral = ! merge->is_reintegrate_like;
 
-      err = merge_cousins_and_supplement_mergeinfo(&conflict_report,
+      err = merge_cousins_and_supplement_mergeinfo(conflict_report,
                                                    &use_sleep,
                                                    target,
                                                    base_ra_session,
@@ -12270,7 +12272,7 @@ do_automatic_merge_locked(const svn_clie
                                                    dry_run,
                                                    merge_options,
                                                    ctx,
-                                                   scratch_pool, scratch_pool);
+                                                   result_pool, scratch_pool);
     }
   else /* ! merge->is_reintegrate_like */
     {
@@ -12296,21 +12298,19 @@ do_automatic_merge_locked(const svn_clie
                                   scratch_pool),
         ra_session, ctx, scratch_pool, scratch_pool));
 
-      err = do_merge(NULL, NULL, &conflict_report, &use_sleep,
+      err = do_merge(NULL, NULL, conflict_report, &use_sleep,
                      merge_sources, target, ra_session,
                      TRUE /*related*/, TRUE /*same_repos*/,
                      FALSE /*ignore_mergeinfo*/, diff_ignore_ancestry,
                      force_delete, dry_run,
                      record_only, NULL, FALSE, FALSE, depth, merge_options,
-                     ctx, scratch_pool, scratch_pool);
+                     ctx, result_pool, scratch_pool);
     }
 
   if (use_sleep)
     svn_io_sleep_for_timestamps(target_abspath, scratch_pool);
 
   SVN_ERR(err);
-  SVN_ERR(make_merge_conflict_error(
-            conflict_report, target->abspath, scratch_pool));
 
   return SVN_NO_ERROR;
 }
@@ -12328,25 +12328,29 @@ svn_client_do_automatic_merge(const svn_
                               apr_pool_t *pool)
 {
   const char *target_abspath, *lock_abspath;
+  conflict_report_t *conflict_report;
 
   SVN_ERR(get_target_and_lock_abspath(&target_abspath, &lock_abspath,
                                       target_wcpath, ctx, pool));
 
   if (!dry_run)
     SVN_WC__CALL_WITH_WRITE_LOCK(
-      do_automatic_merge_locked(merge,
+      do_automatic_merge_locked(&conflict_report,
+                                merge,
                                 target_abspath, depth,
                                 diff_ignore_ancestry,
                                 force_delete, record_only, dry_run,
-                                merge_options, ctx, pool),
+                                merge_options, ctx, pool, pool),
       ctx->wc_ctx, lock_abspath, FALSE /* lock_anchor */, pool);
   else
-    SVN_ERR(do_automatic_merge_locked(merge,
+    SVN_ERR(do_automatic_merge_locked(&conflict_report,
+                                merge,
                                 target_abspath, depth,
                                 diff_ignore_ancestry,
                                 force_delete, record_only, dry_run,
-                                merge_options, ctx, pool));
+                                merge_options, ctx, pool, pool));
 
+  SVN_ERR(make_merge_conflict_error(conflict_report, pool));
   return SVN_NO_ERROR;
 }