Modified: subversion/branches/1.6.x/subversion/tests/cmdline/merge_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/1.6.x/subversion/tests/cmdline/merge_tests.py?rev=924028&r1=924027&r2=924028&view=diff ============================================================================== --- subversion/branches/1.6.x/subversion/tests/cmdline/merge_tests.py (original) +++ subversion/branches/1.6.x/subversion/tests/cmdline/merge_tests.py Tue Mar 16 22:27:36 2010 @@ -15248,10 +15248,19 @@ def reintegrate_with_subtree_mergeinfo(s None, None, None, None, None, 1, 1, "--reintegrate") -def dont_merge_gaps_in_history(sbox): - "mergeinfo aware merges ignore natural history gaps" - - ## See http://svn.haxx.se/dev/archive-2008-11/0618.shtml ## +def set_up_natural_history_gap(sbox): + '''Starting with standard greek tree, do the following: + r2 - A/D/H/psi + r3 - A/D/G/rho + r4 - A/B/E/beta + r5 - A/D/H/omega + r6 - Delete A + r7 - "Resurrect" A, by copying a...@2 to A + r8 - Copy A to A_COPY + r9 - Text mod to A/D/gamma + Lastly it updates the WC to r9. + All text mods set file contents to "New content". + Return (expected_disk, expected_status).''' # r1: Create a standard greek tree. sbox.build() @@ -15310,8 +15319,26 @@ def dont_merge_gaps_in_history(sbox): svntest.main.file_write(gamma_path, "New content") expected_output = wc.State(wc_dir, {'A/D/gamma' : Item(verb='Sending')}) wc_status.tweak('A/D/gamma', wc_rev=9) + + # Update the WC to a uniform revision. svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status, None, wc_dir) + svntest.actions.run_and_verify_svn(None, ["At revision 9.\n"], [], + 'up', wc_dir) + return wc_disk, wc_status + +def dont_merge_gaps_in_history(sbox): + "mergeinfo aware merges ignore natural history gaps" + + ## See http://svn.haxx.se/dev/archive-2008-11/0618.shtml ## + + wc_dir = sbox.wc_dir + + # Create a branch with gaps in its natural history. + set_up_natural_history_gap(sbox) + + # Some paths we'll care about. + A_COPY_path = os.path.join(wc_dir, "A_COPY") # Now merge all available changes from 'A' to 'A_COPY'. The only # available revisions are r8 and r9. Only r9 effects the source/target @@ -15350,7 +15377,7 @@ def dont_merge_gaps_in_history(sbox): 'D/H/psi' : Item(status=' '), 'D/H/omega' : Item(status=' '), }) - expected_status.tweak(wc_rev=8) + expected_status.tweak(wc_rev=9) expected_disk = wc.State('', { '' : Item(props={SVN_PROP_MERGEINFO : '/A:8-9'}), 'B' : Item(), @@ -15383,6 +15410,131 @@ def dont_merge_gaps_in_history(sbox): None, None, None, None, None, 1) +# Test for issue #3432 'Merge can record mergeinfo from natural history +# gaps'. See http://subversion.tigris.org/issues/show_bug.cgi?id=3432 +def handle_gaps_in_implicit_mergeinfo(sbox): + "correctly consider natural history gaps" + + wc_dir = sbox.wc_dir + + # Create a branch with gaps in its natural history. + # + # r1--------r2--------r3--------r4--------r5--------r6 + # Add 'A' edit edit edit edit Delete A + # psi rho beta omega + # | + # V + # r7--------r9-----------------> + # Rez 'A' edit + # | gamma + # | + # V + # r8---------------------------> + # Copy 'a...@7' to + # 'A_COPY' + # + expected_disk, expected_status = set_up_natural_history_gap(sbox) + + # Some paths we'll care about. + A_COPY_path = os.path.join(wc_dir, "A_COPY") + + # Merge r4 to 'A_COPY' from a...@4, which is *not* part of A_COPY's history. + expected_output = wc.State(A_COPY_path, { + 'B/E/beta' : Item(status='U '), + }) + expected_status = wc.State(A_COPY_path, { + '' : Item(status=' M'), + 'B' : Item(status=' '), + 'mu' : Item(status=' '), + 'B/E' : Item(status=' '), + 'B/E/alpha' : Item(status=' '), + 'B/E/beta' : Item(status='M '), + 'B/lambda' : Item(status=' '), + 'B/F' : Item(status=' '), + 'C' : Item(status=' '), + 'D' : Item(status=' '), + 'D/G' : Item(status=' '), + 'D/G/pi' : Item(status=' '), + 'D/G/rho' : Item(status=' '), + 'D/G/tau' : Item(status=' '), + 'D/gamma' : Item(status=' '), + 'D/H' : Item(status=' '), + 'D/H/chi' : Item(status=' '), + 'D/H/psi' : Item(status=' '), + 'D/H/omega' : Item(status=' '), + }) + expected_status.tweak(wc_rev=9) + expected_disk = wc.State('', { + '' : Item(props={SVN_PROP_MERGEINFO : '/A:4'}), + 'B' : Item(), + 'mu' : Item("This is the file 'mu'.\n"), + 'B/E' : Item(), + 'B/E/alpha' : Item("This is the file 'alpha'.\n"), + 'B/E/beta' : Item("New content"), # From the merge of a...@4 + 'B/lambda' : Item("This is the file 'lambda'.\n"), + 'B/F' : Item(), + 'C' : Item(), + 'D' : Item(), + 'D/G' : Item(), + 'D/G/pi' : Item("This is the file 'pi'.\n"), + 'D/G/rho' : Item("This is the file 'rho'.\n"), + 'D/G/tau' : Item("This is the file 'tau'.\n"), + 'D/gamma' : Item("This is the file 'gamma'.\n"), + 'D/H' : Item(), + 'D/H/chi' : Item("This is the file 'chi'.\n"), + 'D/H/psi' : Item("New content"), # From a...@2 + 'D/H/omega' : Item("This is the file 'omega'.\n"), + }) + expected_skip = wc.State(A_COPY_path, { }) + svntest.actions.run_and_verify_merge(A_COPY_path, 3, 4, + sbox.repo_url + \ + '/a...@4', + expected_output, + expected_disk, + expected_status, + expected_skip, + None, None, None, None, + None, 1) + + # Now reverse merge -r9:2 from 'a...@head' to 'A_COPY'. This should be + # a no-op since the only operative change made on 'a...@head' between r2:9 + # is the text mod to 'A/D/gamma' made in r9, but since that was after + # 'A_COPY' was copied from 'A 'and that change was never merged, we don't + # try to reverse merge it. + # + # Also, the mergeinfo recorded by the previous merge, i.e. '/A:4', should + # *not* be removed! a...@4 is not on the same line of history as 'a...@9'. + expected_output = wc.State(A_COPY_path, {}) + svntest.actions.run_and_verify_merge(A_COPY_path, 9, 2, + sbox.repo_url + \ + '/A', + expected_output, + expected_disk, + expected_status, + expected_skip, + None, None, None, None, + None, 1) + + # Now merge all available revisions from 'A' to 'A_COPY'. + # The mergeinfo '/A:4' on 'A_COPY' should have no impact on this merge + # since it refers to another line of history. Since 'A_COPY' was copied + # from 'a...@7' the only available revisions are r8 and r9. + expected_output = wc.State(A_COPY_path, { + 'D/gamma' : Item(status='U '), + }) + expected_status.tweak('D/gamma', status='M ') + expected_disk.tweak('D/gamma', contents='New content') + expected_disk.tweak('', props={SVN_PROP_MERGEINFO : '/A:4,8-9'}) + svntest.actions.run_and_verify_merge(A_COPY_path, None, None, + sbox.repo_url + \ + '/A', + expected_output, + expected_disk, + expected_status, + expected_skip, + None, None, None, None, + None, 1) + #---------------------------------------------------------------------- # Test for issue #3323 'Mergeinfo deleted by a merge should disappear' def mergeinfo_deleted_by_a_merge_should_disappear(sbox): @@ -16465,6 +16617,8 @@ test_list = [ None, # ra_serf causes duplicate notifications with this test: Skip(merge_replace_causes_tree_conflict, svntest.main.is_ra_type_dav_serf), + SkipUnless(handle_gaps_in_implicit_mergeinfo, + server_has_mergeinfo), reintegrate_with_self_referential_mergeinfo, ]
