Author: pburba
Date: Thu Aug  4 20:55:47 2011
New Revision: 1154009

URL: http://svn.apache.org/viewvc?rev=1154009&view=rev
Log:
Fix issue #3978 'Reverse merge which adds subtree fails'

* subversion/libsvn_client/merge.c
  (record_mergeinfo_for_added_subtrees): Document and enforce that this
   function handles forward merges only.

  (do_directory_merge): If a reverse merge adds a subtree, there is no
   possible mergeinfo on the subtree that needs to be removed in order
   to describe the merge itself, so don't try.

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=1154009&r1=1154008&r2=1154009&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/merge.c (original)
+++ subversion/trunk/subversion/libsvn_client/merge.c Thu Aug  4 20:55:47 2011
@@ -7755,6 +7755,9 @@ record_mergeinfo_for_dir_merge(svn_merge
 
    DEPTH, NOTIFY_B, MERGE_B, and SQUELCH_MERGEINFO_NOTIFICATIONS, are
    cascaded from do_directory_merge's arguments of the same names.
+
+   Note: This is intended to support forward merges only, i.e.
+   MERGED_RANGE->START must be older than MERGED_RANGE->END.
 */
 static svn_error_t *
 record_mergeinfo_for_added_subtrees(
@@ -7773,6 +7776,8 @@ record_mergeinfo_for_added_subtrees(
   if (!notify_b->added_abspaths)
     return SVN_NO_ERROR;
 
+  SVN_ERR_ASSERT(merged_range->start < merged_range->end);
+
   iterpool = svn_pool_create(pool);
   for (hi = apr_hash_first(pool, notify_b->added_abspaths); hi;
        hi = apr_hash_next(hi))
@@ -8604,7 +8609,9 @@ do_directory_merge(svn_mergeinfo_catalog
          So here we look at the root path of each subtree added during the
          merge and set explicit mergeinfo on it if it meets the aforementioned
          conditions. */
-      if (err == SVN_NO_ERROR)
+      if (err == SVN_NO_ERROR
+          && (range.start < range.end)) /* Nothing to record on added subtrees
+                                           resulting from reverse merges. */
         {
           err = record_mergeinfo_for_added_subtrees(
                   &range, mergeinfo_path, depth,


Reply via email to