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,