You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by pb...@apache.org on 2010/10/15 00:40:38 UTC

svn commit: r1022744 - in /subversion/trunk/subversion: libsvn_client/merge.c tests/cmdline/merge_tests.py

Author: pburba
Date: Thu Oct 14 22:40:37 2010
New Revision: 1022744

URL: http://svn.apache.org/viewvc?rev=1022744&view=rev
Log:
Fix issue #3324 'path moved by merge but source not deleted'.

* subversion/libsvn_client/merge.c

  (do_directory_merge): Don't ask the server for the diff between X:Y but
   tell the client we are getting the diff between Z:Y where X!=Z.  This
   is the crux of issue #3324, see
   http://subversion.tigris.org/issues/show_bug.cgi?id=3324#desc7

* subversion/tests/cmdline/merge_tests.py

  (subtree_merges_dont_intersect_with_targets): Change expected merge
   header output resulting from the slightly different way we drive the
   editor now; the resulting mergeinfo and WC state are still the same.

  (subtree_gets_changes_even_if_ultimately_deleted): Don't compare --dry-run
   and real merge output.  Ever since merge tracking introduced the
   possibility that a single merge subcommand could spawn multiple editor
   drives, we've had the possibility that a --dry-run could differ from
   the real merge.  In this case the --dry-run produces a tree conflict
   because an earlier editor drive modified a file that a subsequent drive
   deletes, but since this is a --dry-run the modification never really took
   place and the deletion attempt spawns a tree-conflict.

  (merge_range_prior_to_rename_source_existence): Don't compare --dry-run
   output (see above for the 'why').  Remove comments about failure status.

  (test_list): Remove XFail from
   merge_range_prior_to_rename_source_existence.

Modified:
    subversion/trunk/subversion/libsvn_client/merge.c
    subversion/trunk/subversion/tests/cmdline/merge_tests.py

Modified: subversion/trunk/subversion/libsvn_client/merge.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/merge.c?rev=1022744&r1=1022743&r2=1022744&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/merge.c (original)
+++ subversion/trunk/subversion/libsvn_client/merge.c Thu Oct 14 22:40:37 2010
@@ -8190,6 +8190,33 @@ do_directory_merge(svn_mergeinfo_catalog
               svn_revnum_t next_end_rev;
               const char *real_url1 = url1, *real_url2 = url2;
               const char *old_sess1_url = NULL, *old_sess2_url = NULL;
+              svn_merge_range_t *first_target_range = APR_ARRAY_IDX(
+                target_merge_path->remaining_ranges, 0, svn_merge_range_t *);
+
+              /* Issue #3324: Stop editor abuse!  Don't call
+                 drive_merge_report_editor() in such a way that we request an
+                 editor with svn_client__get_diff_editor() for some rev X,
+                 then call svn_ra_do_diff3() for some revision Y, and then
+                 call reporter->set_path(PATH=="") to set the root revision
+                 for the editor drive to revision Z where
+                 (X != Z && X < Z < Y).  This is bogus because the server will
+                 send us the diff between X:Y but the client is expecting the
+                 diff between Y:Z.  See issue #3324 for full details on the
+                 problems this can cause. */
+              if (first_target_range
+                  && start_rev != first_target_range->start)
+                {
+                  if (is_rollback)
+                    {
+                      if (end_rev < first_target_range->start)
+                        end_rev = first_target_range->start;
+                    }
+                  else
+                    {
+                      if (end_rev > first_target_range->start)
+                        end_rev = first_target_range->start;
+                    }
+                }
 
               svn_pool_clear(iterpool);
 

Modified: subversion/trunk/subversion/tests/cmdline/merge_tests.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/merge_tests.py?rev=1022744&r1=1022743&r2=1022744&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/merge_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/merge_tests.py Thu Oct 14 22:40:37 2010
@@ -11830,7 +11830,7 @@ def subtree_merges_dont_intersect_with_t
 
   # Repeat the forward merge
   expected_output = expected_merge_output(
-    [[5],[8,9],[5,9]],
+    [[5],[8],[5,9]],
     ['U    %s\n' % (rho_COPY_2_path),
      'U    %s\n' % (psi_COPY_2_path),
      ' U   %s\n' % (H_COPY_2_path),
@@ -13678,7 +13678,7 @@ def subtree_gets_changes_even_if_ultimat
                                        expected_elision_output,
                                        expected_disk,
                                        expected_status, expected_skip,
-                                       None, None, None, None, None, 1)
+                                       None, None, None, None, None, 1, 0)
 
 #----------------------------------------------------------------------
 def no_self_referential_filtering_on_added_path(sbox):
@@ -13958,8 +13958,8 @@ def merge_range_prior_to_rename_source_e
   # the reverse merge we performed in r11; the only operative change
   # here is the text mod to alpha made in r9.
   #
-  # This merge currently fails because the delete half of the A_COPY/D/H/nu
-  # to A_COPY/D/H/nu_moved move is reported in the notifications, but doesn't
+  # This merge previously failed because the delete half of the A_COPY/D/H/nu
+  # to A_COPY/D/H/nu_moved move was reported in the notifications, but didn't
   # actually happen.
   expected_output = wc.State(A_COPY_path, {
     'B/E/alpha'    : Item(status='U '),
@@ -14027,7 +14027,7 @@ def merge_range_prior_to_rename_source_e
                                        expected_status,
                                        expected_skip,
                                        None, None, None, None,
-                                       None, 1, 1)
+                                       None, 1, 0)
   svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
                                      'Merge -r7:12 from A to A_COPY', wc_dir)
 
@@ -14090,9 +14090,9 @@ def merge_range_prior_to_rename_source_e
   # We can only reverse merge changes from the explicit mergeinfo or
   # natural history of a target, but since all of these changes intersect with
   # the target's explicit mergeinfo (including subtrees), all should be
-  # reverse merged, including the deletion of A_COPY/D/H/nu.  However, like
-  # the forward merge performed earlier, A_COPY/D/H/nu is reported as deleted,
-  # but still remains as a versioned item in the WC.
+  # reverse merged, including the deletion of A_COPY/D/H/nu.  Like the forward
+  # merge performed earlier, this test previously failed when A_COPY/D/H/nu
+  # was reported as deleted, but still remained as a versioned item in the WC.
   expected_output = wc.State(A_COPY_2_path, {
     'B/E/alpha'    : Item(status='U '),
     'D/H/nu'       : Item(status='D '),
@@ -16210,8 +16210,8 @@ test_list = [ None,
                          server_has_mergeinfo),
               SkipUnless(no_self_referential_filtering_on_added_path,
                          server_has_mergeinfo),
-              XFail(SkipUnless(merge_range_prior_to_rename_source_existence,
-                               server_has_mergeinfo)),
+              SkipUnless(merge_range_prior_to_rename_source_existence,
+                         server_has_mergeinfo),
               SkipUnless(dont_merge_gaps_in_history,
                          server_has_mergeinfo),
               SkipUnless(mergeinfo_deleted_by_a_merge_should_disappear,