Author: julianfoad Date: Wed Nov 16 17:25:02 2011 New Revision: 1202794 URL: http://svn.apache.org/viewvc?rev=1202794&view=rev Log: In some merge tests, generate more of the expected output centrally, through expected_merge_output().
* subversion/tests/cmdline/merge_tests.py (expected_merge_output): Add optional parameters to specify a target and an expected summary of conflicts. (svn_merge): Pass the target and conflicts parameters on to expected_merge_output(). (foreign_repos_prop_conflict): Let expected_merge_output() handle the summary of conflicts. * subversion/tests/cmdline/merge_tree_conflict_tests.py (merge_replace_causes_tree_conflict, merge_replace_causes_tree_conflict2, merge_replace_on_del_fails): Use expected_merge_output(). * subversion/tests/cmdline/svntest/main.py (mergeinfo_notify_line, merge_notify_line): Accept an optional 'target' parameter. Modified: subversion/trunk/subversion/tests/cmdline/merge_tests.py subversion/trunk/subversion/tests/cmdline/merge_tree_conflict_tests.py subversion/trunk/subversion/tests/cmdline/svntest/main.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=1202794&r1=1202793&r2=1202794&view=diff ============================================================================== --- subversion/trunk/subversion/tests/cmdline/merge_tests.py (original) +++ subversion/trunk/subversion/tests/cmdline/merge_tests.py Wed Nov 16 17:25:02 2011 @@ -49,7 +49,8 @@ from svntest.actions import make_conflic from svntest.actions import inject_conflict_into_expected_state def expected_merge_output(rev_ranges, additional_lines=None, foreign=False, - elides=False, two_url=False): + elides=False, two_url=False, target=None, + text_conflicts=0, prop_conflicts=0, tree_conflicts=0): """Generate an (inefficient) regex representing the expected merge output and mergeinfo notifications from REV_RANGES and ADDITIONAL_LINES. @@ -65,7 +66,13 @@ def expected_merge_output(rev_ranges, ad If ELIDES is true, add to the regex an expression representing elision notification. If TWO_URL is true, tweak the regex to expect the - appropriate mergeinfo notification for a 3-way merge.""" + appropriate mergeinfo notification for a 3-way merge. + + TARGET is the local path to the target, as it should appear in + notifications; if None, it is not checked. + + TEXT_CONFLICTS, PROP_CONFLICTS and TREE_CONFLICTS specify the number of + each kind of conflict to expect.""" if rev_ranges is None: lines = [svntest.main.merge_notify_line(None, None, False, foreign)] @@ -78,8 +85,8 @@ def expected_merge_output(rev_ranges, ad else: end_rev = None lines += [svntest.main.merge_notify_line(start_rev, end_rev, - True, foreign)] - lines += [svntest.main.mergeinfo_notify_line(start_rev, end_rev)] + True, foreign, target)] + lines += [svntest.main.mergeinfo_notify_line(start_rev, end_rev, target)] if (elides): lines += ["--- Eliding mergeinfo from .*\n"] @@ -103,6 +110,16 @@ def expected_merge_output(rev_ranges, ad if sys.platform == 'win32' and additional_lines != None: additional_lines = additional_lines.replace("\\", "\\\\") lines.append(str(additional_lines)) + + if text_conflicts or prop_conflicts or tree_conflicts: + lines.append("Summary of conflicts:\n") + if text_conflicts: + lines.append(" Text conflicts: %d\n" % text_conflicts) + if prop_conflicts: + lines.append(" Property conflicts: %d\n" % prop_conflicts) + if tree_conflicts: + lines.append(" Tree conflicts: %d\n" % tree_conflicts) + return "|".join(lines) def check_mergeinfo_recursively(root_path, subpaths_mergeinfo): @@ -12544,15 +12561,10 @@ def svn_merge(rev_range, source, target, rev_arg = '-r' + str(rev_range[0] - 1) + ':' + str(rev_range[1]) if lines is None: lines = ["(A |D |[UG] | [UG]|[UG][UG]) " + target + ".*\n"] - if text_conflicts or prop_conflicts or tree_conflicts: - lines.append("Summary of conflicts:\n") - if text_conflicts: - lines.append(" Text conflicts: %d\n" % text_conflicts) - if prop_conflicts: - lines.append(" Property conflicts: %d\n" % prop_conflicts) - if tree_conflicts: - lines.append(" Tree conflicts: %d\n" % tree_conflicts) - exp_out = expected_merge_output([mi_rev_range], lines) + exp_out = expected_merge_output([mi_rev_range], lines, target=target, + text_conflicts=text_conflicts, + prop_conflicts=prop_conflicts, + tree_conflicts=tree_conflicts) svntest.actions.run_and_verify_svn(None, exp_out, [], 'merge', rev_arg, source, target, *args) @@ -16694,11 +16706,9 @@ def foreign_repos_prop_conflict(sbox): # Now, merge the propchange to the *second* working copy. expected_output = [' C %s\n' % (os.path.join(other_wc_dir, - "A", "D", "G")), - 'Summary of conflicts:\n', - ' Property conflicts: 1\n', - ] - expected_output = expected_merge_output([[3]], expected_output, True) + "A", "D", "G"))] + expected_output = expected_merge_output([[3]], expected_output, True, + prop_conflicts=1) svntest.actions.run_and_verify_svn(None, expected_output, [], 'merge', '-c3', Modified: subversion/trunk/subversion/tests/cmdline/merge_tree_conflict_tests.py URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/merge_tree_conflict_tests.py?rev=1202794&r1=1202793&r2=1202794&view=diff ============================================================================== --- subversion/trunk/subversion/tests/cmdline/merge_tree_conflict_tests.py (original) +++ subversion/trunk/subversion/tests/cmdline/merge_tree_conflict_tests.py Wed Nov 16 17:25:02 2011 @@ -46,6 +46,7 @@ from svntest.main import server_has_merg from merge_tests import set_up_branch from merge_tests import svn_copy from merge_tests import svn_merge +from merge_tests import expected_merge_output #---------------------------------------------------------------------- @SkipUnless(server_has_mergeinfo) @@ -1726,18 +1727,15 @@ def merge_replace_causes_tree_conflict(s 'propname', 'propval', A_D_H) # svn merge $URL/A $URL/branch A - expected_stdout = verify.UnorderedOutput([ - "--- Merging differences between repository URLs into '" + A + "':\n", + expected_stdout = expected_merge_output(None, [ + # merge ' C ' + A_B_E + '\n', ' C ' + A_mu + '\n', ' C ' + A_D_G_pi + '\n', ' C ' + A_D_H + '\n', - "--- Recording mergeinfo for merge between repository URLs into '" \ - + A + "':\n", + # mergeinfo ' U ' + A + '\n', - 'Summary of conflicts:\n', - ' Tree conflicts: 4\n', - ]) + ], target=A, two_url=True, tree_conflicts=4) actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'merge', url_A, url_branch, A) @@ -1817,15 +1815,10 @@ def merge_replace_causes_tree_conflict2( ### A file-with-file replacement onto a deleted file. # svn merge $URL/A/mu $URL/branch/mu A/mu - expected_stdout = verify.UnorderedOutput([ - "--- Merging differences between repository URLs into '" + A + "':\n", - ' C ' + A_mu + '\n', - "--- Recording mergeinfo for merge between repository URLs into '" + - A + "':\n", - " U " + A + "\n", - 'Summary of conflicts:\n', - ' Tree conflicts: 1\n', - ]) + expected_stdout = expected_merge_output(None, [ + ' C ' + A_mu + '\n', # merge + " U " + A + "\n", # mergeinfo + ], target=A, two_url=True, tree_conflicts=1) actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'merge', url_A, url_branch, A, '--depth=files') @@ -1841,15 +1834,10 @@ def merge_replace_causes_tree_conflict2( ### A dir-with-dir replacement onto a deleted directory. # svn merge $URL/A/B $URL/branch/B A/B - expected_stdout = verify.UnorderedOutput([ - "--- Merging differences between repository URLs into '" + A_B + "':\n", - ' C ' + A_B_E + '\n', - "--- Recording mergeinfo for merge between repository URLs into '" + - A_B + "':\n", - " U " + A_B + "\n", - 'Summary of conflicts:\n', - ' Tree conflicts: 1\n', - ]) + expected_stdout = expected_merge_output(None, [ + ' C ' + A_B_E + '\n', # merge + " U " + A_B + "\n", # mergeinfo + ], target=A_B, two_url=True, tree_conflicts=1) actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'merge', url_A_B, url_branch_B, A_B) @@ -1865,16 +1853,11 @@ def merge_replace_causes_tree_conflict2( ### A dir-with-file replacement onto a deleted directory. # svn merge --depth=immediates $URL/A/D $URL/branch/D A/D - expected_stdout = verify.UnorderedOutput([ - "--- Merging differences between repository URLs into '" + A_D + "':\n", - ' C ' + A_D_H + '\n', - "--- Recording mergeinfo for merge between repository URLs into '" + - A_D + "':\n", - " U " + A_D + "\n", + expected_stdout = expected_merge_output(None, [ + ' C ' + A_D_H + '\n', # merge + " U " + A_D + "\n", # mergeinfo " U " + A_D_G + "\n", - 'Summary of conflicts:\n', - ' Tree conflicts: 1\n', - ]) + ], target=A_D, two_url=True, tree_conflicts=1) actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'merge', '--depth=immediates', url_A_D, url_branch_D, A_D) @@ -1890,20 +1873,9 @@ def merge_replace_causes_tree_conflict2( ### A file-with-dir replacement onto a deleted file. # svn merge $URL/A/D/G $URL/branch/D/G A/D/G - expected_stdout = verify.UnorderedOutput([ - "--- Merging differences between repository URLs into '" + A_D_G + - "':\n", - ' C ' + A_D_G_pi + '\n', - "--- Recording mergeinfo for merge between repository URLs into '" + - A_D_G + "':\n", - "--- Eliding mergeinfo from '" + A_D_G_pi + "':\n", - " U " + A_D_G_pi + "\n", - "--- Eliding mergeinfo from '" + A_D_G_pi + "':\n", - " U " + A_D_G_pi + "\n", - " G " + A_D_G + "\n", - 'Summary of conflicts:\n', - ' Tree conflicts: 1\n', - ]) + expected_stdout = expected_merge_output(None, [ + ' C ' + A_D_G_pi + '\n', # merge + ], target=A_D_G, elides=[A_D_G_pi, A_D_G], two_url=True, tree_conflicts=1) actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'merge', url_A_D_G, url_branch_D_G, A_D_G) @@ -1963,15 +1935,10 @@ def merge_replace_on_del_fails(sbox): # Sync merge ^/A to branch svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir) - expected_stdout = verify.UnorderedOutput([ - "--- Merging r2 through r4 into '" + branch_path + "':\n", - ' C ' + C_branch_path + '\n', - "--- Recording mergeinfo for merge of r2 through r4 into '" \ - + branch_path + "':\n", - ' U ' + branch_path + '\n', - 'Summary of conflicts:\n', - ' Tree conflicts: 1\n', - ]) + expected_stdout = expected_merge_output([[2,4]], [ + ' C ' + C_branch_path + '\n', # merge + ' U ' + branch_path + '\n', # mergeinfo + ], target=branch_path, tree_conflicts=1) # This currently fails with: # # >svn merge ^/A branch Modified: subversion/trunk/subversion/tests/cmdline/svntest/main.py URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/svntest/main.py?rev=1202794&r1=1202793&r2=1202794&view=diff ============================================================================== --- subversion/trunk/subversion/tests/cmdline/svntest/main.py (original) +++ subversion/trunk/subversion/tests/cmdline/svntest/main.py Wed Nov 16 17:25:02 2011 @@ -998,51 +998,60 @@ def use_editor(func): os.environ['SVNTEST_EDITOR_FUNC'] = func os.environ['SVN_TEST_PYTHON'] = sys.executable -def mergeinfo_notify_line(revstart, revend): +def mergeinfo_notify_line(revstart, revend, target=None): """Return an expected output line that describes the beginning of a mergeinfo recording notification on revisions REVSTART through REVEND.""" + if target: + target_re = re.escape(target) + else: + target_re = ".+" if (revend is None): if (revstart < 0): revstart = abs(revstart) - return "--- Recording mergeinfo for reverse merge of r%ld .*:\n" \ - % (revstart) + return "--- Recording mergeinfo for reverse merge of r%ld into '%s':\n" \ + % (revstart, target_re) else: - return "--- Recording mergeinfo for merge of r%ld .*:\n" % (revstart) + return "--- Recording mergeinfo for merge of r%ld into '%s':\n" \ + % (revstart, target_re) elif (revstart < revend): - return "--- Recording mergeinfo for merge of r%ld through r%ld .*:\n" \ - % (revstart, revend) + return "--- Recording mergeinfo for merge of r%ld through r%ld into '%s':\n" \ + % (revstart, revend, target_re) else: return "--- Recording mergeinfo for reverse merge of r%ld through " \ - "r%ld .*:\n" % (revstart, revend) + "r%ld into '%s':\n" % (revstart, revend, target_re) def merge_notify_line(revstart=None, revend=None, same_URL=True, - foreign=False): + foreign=False, target=None): """Return an expected output line that describes the beginning of a merge operation on revisions REVSTART through REVEND. Omit both REVSTART and REVEND for the case where the left and right sides of the merge are from different URLs.""" from_foreign_phrase = foreign and "\(from foreign repository\) " or "" + if target: + target_re = re.escape(target) + else: + target_re = ".+" if not same_URL: - return "--- Merging differences between %srepository URLs into '.+':\n" \ - % (foreign and "foreign " or "") + return "--- Merging differences between %srepository URLs into '%s':\n" \ + % (foreign and "foreign " or "", target_re) if revend is None: if revstart is None: # The left and right sides of the merge are from different URLs. - return "--- Merging differences between %srepository URLs into '.+':\n" \ - % (foreign and "foreign " or "") + return "--- Merging differences between %srepository URLs into '%s':\n" \ + % (foreign and "foreign " or "", target_re) elif revstart < 0: - return "--- Reverse-merging %sr%ld into '.+':\n" \ - % (from_foreign_phrase, abs(revstart)) + return "--- Reverse-merging %sr%ld into '%s':\n" \ + % (from_foreign_phrase, abs(revstart), target_re) else: - return "--- Merging %sr%ld into '.+':\n" \ - % (from_foreign_phrase, revstart) + return "--- Merging %sr%ld into '%s':\n" \ + % (from_foreign_phrase, revstart, target_re) else: if revstart > revend: - return "--- Reverse-merging %sr%ld through r%ld into '.+':\n" \ - % (from_foreign_phrase, revstart, revend) + return "--- Reverse-merging %sr%ld through r%ld into '%s':\n" \ + % (from_foreign_phrase, revstart, revend, target_re) else: - return "--- Merging %sr%ld through r%ld into '.+':\n" \ - % (from_foreign_phrase, revstart, revend) + return "--- Merging %sr%ld through r%ld into '%s':\n" \ + % (from_foreign_phrase, revstart, revend, target_re) def make_log_msg():