Author: pburba Date: Fri Dec 18 01:03:08 2009 New Revision: 892050 URL: http://svn.apache.org/viewvc?rev=892050&view=rev Log: Add a test for a reintegrate bug which can occur when the merge source has mergeinfo that explicitly describes common history with the reintegrate target.
We encountered this in our own repos, see http://svn.haxx.se/dev/archive-2009-12/0338.shtml * subversion/tests/cmdline/merge_tests.py (reintegrate_with_self_referential_mergeinfo): New test. (test_list): Add reintegrate_with_self_referential_mergeinfo, set as XFail. Modified: subversion/trunk/subversion/tests/cmdline/merge_tests.py Modified: subversion/trunk/subversion/tests/cmdline/merge_tests.py URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/merge_tests.py?rev=892050&r1=892049&r2=892050&view=diff ============================================================================== --- subversion/trunk/subversion/tests/cmdline/merge_tests.py (original) +++ subversion/trunk/subversion/tests/cmdline/merge_tests.py Fri Dec 18 01:03:08 2009 @@ -17164,6 +17164,126 @@ expected_skip, None, None, None, None, None, 1, 0) + +def reintegrate_with_self_referential_mergeinfo(sbox): + "source has target's history as explicit mergeinfo" + + sbox.build() + wc_dir = sbox.wc_dir + + # Make some changes under 'A' in r2-5. + wc_disk, wc_status = set_up_branch(sbox, nbr_of_branches=0) + + # Some paths we'll care about + A_path = os.path.join(wc_dir, "A") + A2_path = os.path.join(wc_dir, "A2") + A2_B_path = os.path.join(wc_dir, "A2", "B") + A2_1_path = os.path.join(wc_dir, "A2.1") + A2_1_mu_path = os.path.join(wc_dir, "A2.1", "mu") + + # r6 Copy A to A2 and then manually set some self-referential mergeinfo on + # A2/B and A2. + svntest.actions.run_and_verify_svn(None, ["At revision 5.\n"], [], + 'up', wc_dir) + svntest.actions.run_and_verify_svn(None, None, [], + 'copy', A_path, A2_path) + # /A:3 describes A2's natural history, a.k.a. it's implicit mergeinfo, so + # it is self-referential. Same for /A/B:4 and A2/B. Normally this is + # redundant but not harmful. + svntest.actions.run_and_verify_svn(None, None, [], + 'ps', 'svn:mergeinfo', '/A:3', A2_path) + svntest.actions.run_and_verify_svn(None, None, [], + 'ps', 'svn:mergeinfo', '/A/B:4', A2_B_path) + svntest.actions.run_and_verify_svn( + None, None, [], 'ci', '-m', + 'copy A to A2 and set some self-referential mergeinfo on the latter.', + wc_dir) + + # r7 Copy A2 to A2.1 + svntest.actions.run_and_verify_svn(None, None, [], + 'copy', A2_path, A2_1_path) + svntest.actions.run_and_verify_svn(None, None, [], 'ci', + '-m', 'copy A2to A2.1.', wc_dir) + + # r8 Make a change on A2.1/mu + svntest.main.file_write(A2_1_mu_path, 'New A2.1 stuff') + svntest.actions.run_and_verify_svn(None, None, [], 'ci', + '-m', 'Work done on the A2.1 branch.', + wc_dir) + + # Update to uniform revision and reintegrated A2.1 back to A2. + svntest.actions.run_and_verify_svn(None, ["At revision 8.\n"], [], + 'up', wc_dir) + + # Now merge all available revisions from A to A_COPY: + expected_output = wc.State(A2_path, { + 'mu' : Item(status='U '), + }) + expected_status = wc.State(A2_path, { + '' : Item(status=' M'), + 'B' : Item(status=' M'), + 'mu' : Item(status='M '), + 'B/E' : Item(status=' '), + 'B/E/alpha' : Item(status=' '), + 'B/E/beta' : Item(status=' '), + '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=8) + expected_disk = wc.State('', { + '' : Item(props={SVN_PROP_MERGEINFO : '/A:3\n/A2.1:7-8'}), + 'B' : Item(props={SVN_PROP_MERGEINFO : '/A/B:4\n/A2.1/B:7-8'}), + 'mu' : Item("New A2.1 stuff"), + 'B/E' : Item(), + 'B/E/alpha' : Item("This is the file 'alpha'.\n"), + 'B/E/beta' : Item("New content"), + '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("New content"), + '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"), + 'D/H/omega' : Item("New content"), + }) + expected_skip = wc.State(A2_path, { }) + # Currently failing with this error: + # + # svn merge ^/A2.1" A2 --reintegrate + # ..\..\..\subversion\svn\merge-cmd.c:349: (apr_err=160013) + # ..\..\..\subversion\libsvn_client\merge.c:9219: (apr_err=160013) + # ..\..\..\subversion\libsvn_client\ra.c:728: (apr_err=160013) + # ..\..\..\subversion\libsvn_client\mergeinfo.c:733: (apr_err=160013) + # ..\..\..\subversion\libsvn_client\ra.c:526: (apr_err=160013) + # ..\..\..\subversion\libsvn_repos\rev_hunt.c:908: (apr_err=160013) + # ..\..\..\subversion\libsvn_repos\rev_hunt.c:607: (apr_err=160013) + # ..\..\..\subversion\libsvn_fs_fs\tree.c:2886: (apr_err=160013) + # ..\..\..\subversion\libsvn_fs_fs\tree.c:669: (apr_err=160013) + # svn: File not found: revision 4, path '/A2' + svntest.actions.run_and_verify_merge(A2_path, None, None, + sbox.repo_url + '/A2.1', + expected_output, + expected_disk, + expected_status, + expected_skip, + None, None, None, None, + None, 1, 0, '--reintegrate') ######################################################################## # Run the tests @@ -17394,6 +17514,7 @@ XFail(committed_case_only_move_and_revert, is_fs_case_insensitive), merge_into_wc_for_deleted_branch, + XFail(reintegrate_with_self_referential_mergeinfo), ] if __name__ == '__main__':
