You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by br...@apache.org on 2012/08/16 12:18:03 UTC

svn commit: r1373783 [44/50] - in /subversion/branches/compressed-pristines: ./ build/ build/ac-macros/ build/generator/ build/generator/templates/ build/win32/ contrib/client-side/emacs/ contrib/client-side/svn-push/ contrib/client-side/svnmerge/ cont...

Modified: subversion/branches/compressed-pristines/subversion/tests/cmdline/merge_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/subversion/tests/cmdline/merge_tests.py?rev=1373783&r1=1373782&r2=1373783&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/subversion/tests/cmdline/merge_tests.py (original)
+++ subversion/branches/compressed-pristines/subversion/tests/cmdline/merge_tests.py Thu Aug 16 10:17:48 2012
@@ -50,7 +50,8 @@ from svntest.actions import inject_confl
 
 def expected_merge_output(rev_ranges, additional_lines=None, foreign=False,
                           elides=False, two_url=False, target=None,
-                          text_conflicts=0, prop_conflicts=0, tree_conflicts=0):
+                          text_conflicts=0, prop_conflicts=0, tree_conflicts=0,
+                          resolved=[]):
   """Generate an (inefficient) regex representing the expected merge
   output and mergeinfo notifications from REV_RANGES and ADDITIONAL_LINES.
 
@@ -72,7 +73,10 @@ def expected_merge_output(rev_ranges, ad
   notifications; if None, it is not checked.
 
   TEXT_CONFLICTS, PROP_CONFLICTS and TREE_CONFLICTS specify the number of
-  each kind of conflict to expect."""
+  each kind of conflict to expect.
+
+  RESOLVED contains a list of target paths of which conflicts are resolved
+  during merging"""
 
   if rev_ranges is None:
     lines = [svntest.main.merge_notify_line(None, None, False, foreign)]
@@ -111,6 +115,9 @@ def expected_merge_output(rev_ranges, ad
       additional_lines = additional_lines.replace("\\", "\\\\")
     lines.append(str(additional_lines))
 
+  for rslv in resolved:
+    lines.append("Resolved conflicted state of '%s'" % re.escape(rslv))
+
   if text_conflicts or prop_conflicts or tree_conflicts:
     lines.append("Summary of conflicts:\n")
     if text_conflicts:
@@ -205,8 +212,8 @@ def textual_merges_galore(sbox):
   #  url = os.path.join(svntest.main.test_area_url, sbox.repo_dir)
 
   # Change mu and rho for revision 2
-  mu_path = os.path.join(wc_dir, 'A', 'mu')
-  rho_path = os.path.join(wc_dir, 'A', 'D', 'G', 'rho')
+  mu_path = sbox.ospath('A/mu')
+  rho_path = sbox.ospath('A/D/G/rho')
   mu_text = fill_file_with_lines(mu_path, 2)
   rho_text = fill_file_with_lines(rho_path, 2)
 
@@ -234,9 +241,9 @@ def textual_merges_galore(sbox):
 
   # Now commit some more mods from the original working copy, to
   # produce revision 3.
-  lambda_path = os.path.join(wc_dir, 'A', 'B', 'lambda')
-  pi_path = os.path.join(wc_dir, 'A', 'D', 'G', 'pi')
-  tau_path = os.path.join(wc_dir, 'A', 'D', 'G', 'tau')
+  lambda_path = sbox.ospath('A/B/lambda')
+  pi_path = sbox.ospath('A/D/G/pi')
+  tau_path = sbox.ospath('A/D/G/tau')
 
   lambda_text = fill_file_with_lines(lambda_path, 2)
   pi_text = fill_file_with_lines(pi_path, 2)
@@ -440,8 +447,8 @@ def add_with_history(sbox):
   sbox.build()
   wc_dir = sbox.wc_dir
 
-  C_path = os.path.join(wc_dir, 'A', 'C')
-  F_path = os.path.join(wc_dir, 'A', 'B', 'F')
+  C_path = sbox.ospath('A/C')
+  F_path = sbox.ospath('A/B/F')
   F_url = sbox.repo_url + '/A/B/F'
 
   Q_path = os.path.join(F_path, 'Q')
@@ -569,9 +576,9 @@ def simple_property_merges(sbox):
   wc_dir = sbox.wc_dir
 
   # Add a property to a file and a directory
-  alpha_path = os.path.join(wc_dir, 'A', 'B', 'E', 'alpha')
-  beta_path = os.path.join(wc_dir, 'A', 'B', 'E', 'beta')
-  E_path = os.path.join(wc_dir, 'A', 'B', 'E')
+  alpha_path = sbox.ospath('A/B/E/alpha')
+  beta_path = sbox.ospath('A/B/E/beta')
+  E_path = sbox.ospath('A/B/E')
 
   svntest.actions.run_and_verify_svn(None, None, [],
                                      'propset', 'foo', 'foo_val',
@@ -642,7 +649,7 @@ def simple_property_merges(sbox):
   pristine_status.tweak(wc_rev=4)
 
   # Merge B 3:4 into B2
-  B2_path = os.path.join(wc_dir, 'A', 'B2')
+  B2_path = sbox.ospath('A/B2')
   expected_output = wc.State(B2_path, {
     'E'        : Item(status=' U'),
     'E/alpha'  : Item(status=' U'),
@@ -760,7 +767,7 @@ def simple_property_merges(sbox):
   # inherited from A2 (created by its copy from A) allows us to avoid
   # a repeated merge.
   alpha_url = sbox.repo_url + '/A/B/E/alpha'
-  alpha_path = os.path.join(wc_dir, 'B', 'E', 'alpha')
+  alpha_path = sbox.ospath('B/E/alpha')
 
   # Cannot use run_and_verify_merge with a file target
   svntest.actions.run_and_verify_svn(None, [], [], 'merge', '-r', '3:4',
@@ -795,9 +802,9 @@ def merge_similar_unrelated_trees(sbox):
   # Modify some stuff in the second one.  Now merge
   # (firstdir:seconddir->thirddir).
 
-  base1_path = os.path.join(wc_dir, 'base1')
-  base2_path = os.path.join(wc_dir, 'base2')
-  apply_path = os.path.join(wc_dir, 'apply')
+  base1_path = sbox.ospath('base1')
+  base2_path = sbox.ospath('base2')
+  apply_path = sbox.ospath('apply')
 
   base1_url = os.path.join(sbox.repo_url + '/base1')
   base2_url = os.path.join(sbox.repo_url + '/base2')
@@ -872,7 +879,7 @@ def merge_one_file_helper(sbox, arg_flav
 
   rho_rel_path = os.path.join('A', 'D', 'G', 'rho')
   rho_path = os.path.join(wc_dir, rho_rel_path)
-  G_path = os.path.join(wc_dir, 'A', 'D', 'G')
+  G_path = sbox.ospath('A/D/G')
   rho_url = sbox.repo_url + '/A/D/G/rho'
 
   # Change rho for revision 2
@@ -1014,7 +1021,7 @@ def merge_with_implicit_target_helper(sb
   wc_dir = sbox.wc_dir
 
   # Change mu for revision 2
-  mu_path = os.path.join(wc_dir, 'A', 'mu')
+  mu_path = sbox.ospath('A/mu')
   orig_mu_text = svntest.tree.get_text(mu_path)
   added_mu_text = ""
   for x in range(2,11):
@@ -1145,7 +1152,7 @@ def merge_with_prev(sbox):
   wc_dir = sbox.wc_dir
 
   # Change mu for revision 2
-  mu_path = os.path.join(wc_dir, 'A', 'mu')
+  mu_path = sbox.ospath('A/mu')
   orig_mu_text = svntest.tree.get_text(mu_path)
   added_mu_text = ""
   for x in range(2,11):
@@ -1153,7 +1160,7 @@ def merge_with_prev(sbox):
   added_mu_text += "\n"
   svntest.main.file_append(mu_path, added_mu_text)
 
-  zot_path = os.path.join(wc_dir, 'A', 'zot')
+  zot_path = sbox.ospath('A/zot')
 
   svntest.main.file_append(zot_path, "bar")
   svntest.main.run_svn(None, 'add', zot_path)
@@ -1248,7 +1255,7 @@ def merge_binary_file(sbox):
   # Add a binary file to the project
   theta_contents = open(os.path.join(sys.path[0], "theta.bin"), 'rb').read()
   # Write PNG file data into 'A/theta'.
-  theta_path = os.path.join(wc_dir, 'A', 'theta')
+  theta_path = sbox.ospath('A/theta')
   svntest.main.file_write(theta_path, theta_contents, 'wb')
 
   svntest.main.run_svn(None, 'add', theta_path)
@@ -1342,7 +1349,7 @@ def merge_in_new_file_and_diff(sbox):
   svntest.actions.run_and_verify_svn(None, None, [],
                                      'update', wc_dir)
 
-  new_file_path = os.path.join(wc_dir, 'A', 'B', 'E', 'newfile')
+  new_file_path = sbox.ospath('A/B/E/newfile')
   svntest.main.file_write(new_file_path, "newfile\n")
 
   # Add the new file, and commit revision 3.
@@ -1351,7 +1358,7 @@ def merge_in_new_file_and_diff(sbox):
                                      'ci', '-m',
                                      "Changing the trunk.", wc_dir)
 
-  branch_path = os.path.join(wc_dir, "branch")
+  branch_path = sbox.ospath('branch')
   url_branch_path = branch_path.replace(os.path.sep, '/')
 
   # Merge our addition into the branch.
@@ -1418,8 +1425,8 @@ def merge_skips_obstructions(sbox):
   sbox.build()
   wc_dir = sbox.wc_dir
 
-  C_path = os.path.join(wc_dir, 'A', 'C')
-  F_path = os.path.join(wc_dir, 'A', 'B', 'F')
+  C_path = sbox.ospath('A/C')
+  F_path = sbox.ospath('A/B/F')
   F_url = sbox.repo_url + '/A/B/F'
 
   Q_path = os.path.join(F_path, 'Q')
@@ -1539,8 +1546,8 @@ def merge_skips_obstructions(sbox):
   svntest.actions.run_and_verify_svn(None, None, [], 'revert', '-R', wc_dir)
   svntest.actions.run_and_verify_status(wc_dir, pre_merge_status)
 
-  iota_path = os.path.join(wc_dir, 'iota')
-  G_path = os.path.join(wc_dir, 'A', 'D', 'G')
+  iota_path = sbox.ospath('iota')
+  G_path = sbox.ospath('A/D/G')
   svntest.actions.run_and_verify_svn(None, None, [], 'rm', iota_path, G_path)
 
   expected_output = wc.State(wc_dir, {
@@ -1603,7 +1610,7 @@ def merge_skips_obstructions(sbox):
   expected_status.tweak('', status='  ')
   svntest.actions.run_and_verify_status(wc_dir, expected_status)
 
-  lambda_path = os.path.join(wc_dir, 'A', 'B', 'lambda')
+  lambda_path = sbox.ospath('A/B/lambda')
   svntest.main.file_append(lambda_path, "more text")
   expected_output = wc.State(wc_dir, {
     'A/B/lambda'  : Item(verb='Sending'),
@@ -1723,7 +1730,7 @@ def merge_into_missing(sbox):
 
   single_db = svntest.main.wc_is_singledb(wc_dir)
 
-  F_path = os.path.join(wc_dir, 'A', 'B', 'F')
+  F_path = sbox.ospath('A/B/F')
   F_url = sbox.repo_url + '/A/B/F'
   Q_path = os.path.join(F_path, 'Q')
   foo_path = os.path.join(F_path, 'foo')
@@ -1891,7 +1898,7 @@ def dry_run_adds_file_with_prop(sbox):
   wc_dir = sbox.wc_dir
 
   # Commit a new file which has a property.
-  zig_path = os.path.join(wc_dir, 'A', 'B', 'E', 'zig')
+  zig_path = sbox.ospath('A/B/E/zig')
   svntest.main.file_append(zig_path, "zig contents")
   svntest.actions.run_and_verify_svn(None, None, [], 'add', zig_path)
   svntest.actions.run_and_verify_svn(None, None, [],
@@ -1911,7 +1918,7 @@ def dry_run_adds_file_with_prop(sbox):
                                         None, wc_dir)
 
   # Do a regular merge of that change into a different dir.
-  F_path = os.path.join(wc_dir, 'A', 'B', 'F')
+  F_path = sbox.ospath('A/B/F')
   E_url = sbox.repo_url + '/A/B/E'
 
   expected_output = wc.State(F_path, {
@@ -1951,7 +1958,7 @@ def merge_binary_with_common_ancestry(sb
   wc_dir = sbox.wc_dir
 
   # Create the common ancestry path
-  I_path = os.path.join(wc_dir, 'I')
+  I_path = sbox.ospath('I')
   svntest.main.run_svn(None, 'mkdir', I_path)
 
   # Add a binary file to the common ancestry path
@@ -1980,7 +1987,7 @@ def merge_binary_with_common_ancestry(sb
                                         wc_dir)
 
   # Create the first branch
-  J_path = os.path.join(wc_dir, 'J')
+  J_path = sbox.ospath('J')
   svntest.main.run_svn(None, 'copy', I_path, J_path)
 
   # Commit the first branch
@@ -1999,7 +2006,7 @@ def merge_binary_with_common_ancestry(sb
                                         wc_dir)
 
   # Create the path where the files will be merged
-  K_path = os.path.join(wc_dir, 'K')
+  K_path = sbox.ospath('K')
   svntest.main.run_svn(None, 'mkdir', K_path)
 
   # Commit the new path
@@ -2050,7 +2057,7 @@ def merge_binary_with_common_ancestry(sb
                                         wc_dir)
 
   # Create the second branch from the modified ancestry
-  L_path = os.path.join(wc_dir, 'L')
+  L_path = sbox.ospath('L')
   svntest.main.run_svn(None, 'copy', I_path, L_path)
 
   # Commit the second branch
@@ -2169,7 +2176,7 @@ def merge_funny_chars_on_path(sbox):
                                         None, wc_dir)
 
   # Do a regular merge of that change into a different dir.
-  F_path = os.path.join(wc_dir, 'A', 'B', 'F')
+  F_path = sbox.ospath('A/B/F')
   E_url = sbox.repo_url + '/A/B/E'
 
   expected_output_dic = {}
@@ -2315,7 +2322,7 @@ def merge_prop_change_to_deleted_target(
   wc_dir = sbox.wc_dir
 
   # Add a property to alpha.
-  alpha_path = os.path.join(wc_dir, 'A', 'B', 'E', 'alpha')
+  alpha_path = sbox.ospath('A/B/E/alpha')
   svntest.actions.run_and_verify_svn(None, None, [],
                                      'propset', 'foo', 'foo_val',
                                      alpha_path)
@@ -2364,8 +2371,8 @@ def set_up_dir_replace(sbox):
   sbox.build()
   wc_dir = sbox.wc_dir
 
-  C_path = os.path.join(wc_dir, 'A', 'C')
-  F_path = os.path.join(wc_dir, 'A', 'B', 'F')
+  C_path = sbox.ospath('A/C')
+  F_path = sbox.ospath('A/B/F')
   F_url = sbox.repo_url + '/A/B/F'
 
   foo_path = os.path.join(F_path, 'foo')
@@ -2477,8 +2484,8 @@ def merge_dir_replace(sbox):
   set_up_dir_replace(sbox)
   wc_dir = sbox.wc_dir
 
-  C_path = os.path.join(wc_dir, 'A', 'C')
-  F_path = os.path.join(wc_dir, 'A', 'B', 'F')
+  C_path = sbox.ospath('A/C')
+  F_path = sbox.ospath('A/B/F')
   F_url = sbox.repo_url + '/A/B/F'
   foo_path = os.path.join(F_path, 'foo')
   new_file2 = os.path.join(foo_path, "new file 2")
@@ -2591,8 +2598,8 @@ def merge_dir_and_file_replace(sbox):
   set_up_dir_replace(sbox)
   wc_dir = sbox.wc_dir
 
-  C_path = os.path.join(wc_dir, 'A', 'C')
-  F_path = os.path.join(wc_dir, 'A', 'B', 'F')
+  C_path = sbox.ospath('A/C')
+  F_path = sbox.ospath('A/B/F')
   F_url = sbox.repo_url + '/A/B/F'
   foo_path = os.path.join(F_path, 'foo')
   new_file2 = os.path.join(foo_path, "new file 2")
@@ -2708,7 +2715,7 @@ def merge_file_with_space_in_its_name(sb
   # For issue #2144
   sbox.build()
   wc_dir = sbox.wc_dir
-  new_file = os.path.join(wc_dir, "new file")
+  new_file = sbox.ospath('new file')
 
   # Make r2.
   svntest.main.file_append(new_file, "Initial text in the file.\n")
@@ -2743,7 +2750,7 @@ def merge_dir_branches(sbox):
   wc_dir = sbox.wc_dir
   wc_uuid = svntest.actions.get_wc_uuid(wc_dir)
 
-  F_path = os.path.join(wc_dir, 'A', 'B', 'F')
+  F_path = sbox.ospath('A/B/F')
   F_url = sbox.repo_url + '/A/B/F'
   C_url = sbox.repo_url + '/A/C'
 
@@ -2764,7 +2771,7 @@ def merge_dir_branches(sbox):
                                         None, wc_dir)
 
   # Create an unversioned foo
-  foo_path = os.path.join(wc_dir, 'foo')
+  foo_path = sbox.ospath('foo')
   os.mkdir(foo_path)
 
   # Merge from C to F onto the wc_dir
@@ -2798,9 +2805,9 @@ def safe_property_merge(sbox):
   wc_dir = sbox.wc_dir
 
   # Add a property to two files and a directory, commit as r2.
-  alpha_path = os.path.join(wc_dir, 'A', 'B', 'E', 'alpha')
-  beta_path = os.path.join(wc_dir, 'A', 'B', 'E', 'beta')
-  E_path = os.path.join(wc_dir, 'A', 'B', 'E')
+  alpha_path = sbox.ospath('A/B/E/alpha')
+  beta_path = sbox.ospath('A/B/E/beta')
+  E_path = sbox.ospath('A/B/E')
 
   svntest.actions.run_and_verify_svn(None, None, [],
                                      'propset', 'foo', 'foo_val',
@@ -2852,9 +2859,9 @@ def safe_property_merge(sbox):
   svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
 
   # Make local propchanges to E, alpha and beta in the branch.
-  alpha_path2 = os.path.join(wc_dir, 'A', 'B2', 'E', 'alpha')
-  beta_path2 = os.path.join(wc_dir, 'A', 'B2', 'E', 'beta')
-  E_path2 = os.path.join(wc_dir, 'A', 'B2', 'E')
+  alpha_path2 = sbox.ospath('A/B2/E/alpha')
+  beta_path2 = sbox.ospath('A/B2/E/beta')
+  E_path2 = sbox.ospath('A/B2/E')
 
   svntest.actions.run_and_verify_svn(None, None, [],
                                      'propset', 'foo', 'branchval',
@@ -2865,7 +2872,7 @@ def safe_property_merge(sbox):
 
   # Now merge the recent B change to the branch.  Because we already
   # have local propmods, we should get property conflicts.
-  B2_path = os.path.join(wc_dir, 'A', 'B2')
+  B2_path = sbox.ospath('A/B2')
 
   expected_output = wc.State(B2_path, {
     'E'        : Item(status=' C'),
@@ -2929,8 +2936,8 @@ def property_merge_from_branch(sbox):
   wc_dir = sbox.wc_dir
 
   # Add a property to a file and a directory, commit as r2.
-  alpha_path = os.path.join(wc_dir, 'A', 'B', 'E', 'alpha')
-  E_path = os.path.join(wc_dir, 'A', 'B', 'E')
+  alpha_path = sbox.ospath('A/B/E/alpha')
+  E_path = sbox.ospath('A/B/E')
 
   svntest.actions.run_and_verify_svn(None, None, [],
                                      'propset', 'foo', 'foo_val',
@@ -2976,8 +2983,8 @@ def property_merge_from_branch(sbox):
   svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
 
   # Make different propchanges changes to the B2 branch and commit as r5.
-  alpha_path2 = os.path.join(wc_dir, 'A', 'B2', 'E', 'alpha')
-  E_path2 = os.path.join(wc_dir, 'A', 'B2', 'E')
+  alpha_path2 = sbox.ospath('A/B2/E/alpha')
+  E_path2 = sbox.ospath('A/B2/E')
 
   svntest.actions.run_and_verify_svn(None, None, [],
                                      'propset', 'foo', 'branchval',
@@ -2996,7 +3003,7 @@ def property_merge_from_branch(sbox):
 
   # Now merge the recent B change to the branch.  There are no local
   # mods anywhere, but we should still get property conflicts anyway!
-  B2_path = os.path.join(wc_dir, 'A', 'B2')
+  B2_path = sbox.ospath('A/B2')
 
   expected_output = wc.State(B2_path, {
     'E'        : Item(status=' C'),
@@ -3058,7 +3065,7 @@ def property_merge_undo_redo(sbox):
   wc_dir = sbox.wc_dir
 
   # Add a property to a file, commit as r2.
-  alpha_path = os.path.join(wc_dir, 'A', 'B', 'E', 'alpha')
+  alpha_path = sbox.ospath('A/B/E/alpha')
   svntest.actions.run_and_verify_svn(None, None, [],
                                      'propset', 'foo', 'foo_val',
                                      alpha_path)
@@ -3149,11 +3156,11 @@ def cherry_pick_text_conflict(sbox):
   sbox.build()
   wc_dir = sbox.wc_dir
 
-  A_path = os.path.join(wc_dir, 'A')
+  A_path = sbox.ospath('A')
   A_url = sbox.repo_url + '/A'
   mu_path = os.path.join(A_path, 'mu')
   branch_A_url = sbox.repo_url + '/copy-of-A'
-  branch_mu_path = os.path.join(wc_dir, 'copy-of-A', 'mu')
+  branch_mu_path = sbox.ospath('copy-of-A/mu')
 
   # Create a branch of A.
   svntest.actions.run_and_verify_svn(None, None, [], 'cp',
@@ -3259,7 +3266,7 @@ def merge_file_replace(sbox):
   wc_dir = sbox.wc_dir
 
   # File scheduled for deletion
-  rho_path = os.path.join(wc_dir, 'A', 'D', 'G', 'rho')
+  rho_path = sbox.ospath('A/D/G/rho')
   svntest.actions.run_and_verify_svn(None, None, [], 'rm', rho_path)
 
   expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
@@ -3351,7 +3358,7 @@ def merge_file_replace_to_mixed_rev_wc(s
   wc_dir = sbox.wc_dir
 
   # File scheduled for deletion
-  rho_path = os.path.join(wc_dir, 'A', 'D', 'G', 'rho')
+  rho_path = sbox.ospath('A/D/G/rho')
   svntest.actions.run_and_verify_svn(None, None, [], 'rm', rho_path)
 
   expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
@@ -3628,7 +3635,7 @@ def merge_conflict_markers_matching_eol(
   wc_dir = sbox.wc_dir
   filecount = 1
 
-  mu_path = os.path.join(wc_dir, 'A', 'mu')
+  mu_path = sbox.ospath('A/mu')
 
   if os.name == 'nt':
     crlf = '\n'
@@ -3767,7 +3774,7 @@ def merge_eolstyle_handling(sbox):
   sbox.build()
   wc_dir = sbox.wc_dir
 
-  mu_path = os.path.join(wc_dir, 'A', 'mu')
+  mu_path = sbox.ospath('A/mu')
 
   if os.name == 'nt':
     crlf = '\n'
@@ -3981,7 +3988,7 @@ def avoid_repeated_merge_using_inherited
   sbox.build()
   wc_dir = sbox.wc_dir
 
-  A_path = os.path.join(wc_dir, 'A')
+  A_path = sbox.ospath('A')
   A_B_path = os.path.join(A_path, 'B')
   A_B_E_path = os.path.join(A_B_path, 'E')
   A_B_F_path = os.path.join(A_B_path, 'F')
@@ -4100,7 +4107,7 @@ def avoid_repeated_merge_on_subtree_with
   sbox.build()
   wc_dir = sbox.wc_dir
 
-  A_path = os.path.join(wc_dir, 'A')
+  A_path = sbox.ospath('A')
   A_B_path = os.path.join(A_path, 'B')
   A_B_E_path = os.path.join(A_B_path, 'E')
   A_B_F_path = os.path.join(A_B_path, 'F')
@@ -4362,9 +4369,9 @@ def obey_reporter_api_semantics_while_do
   sbox.build()
   wc_dir = sbox.wc_dir
 
-  A_path = os.path.join(wc_dir, 'A')
-  A_D_path = os.path.join(wc_dir, 'A', 'D')
-  copy_of_A_D_path = os.path.join(wc_dir, 'A', 'copy-of-D')
+  A_path = sbox.ospath('A')
+  A_D_path = sbox.ospath('A/D')
+  copy_of_A_D_path = sbox.ospath('A/copy-of-D')
 
   svntest.main.run_svn(None, "cp", A_D_path, copy_of_A_D_path)
 
@@ -4494,6 +4501,12 @@ def set_up_branch(sbox, branch_only = Fa
     r(5 + NBR_OF_BRANCHES) - A/D/H/omega
   Return (expected_disk, expected_status).'''
 
+  # With the default parameters, the branching looks like this:
+  #
+  #   A         -1-----3-4-5-6--
+  #                \
+  #   A_COPY        2-----------
+
   wc_dir = sbox.wc_dir
 
   expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
@@ -4587,7 +4600,7 @@ def set_up_branch(sbox, branch_only = Fa
   # Make some changes under A which we'll later merge under A_COPY:
 
   # r(nbr_of_branches + 2) - modify and commit A/D/H/psi
-  svntest.main.file_write(os.path.join(wc_dir, "A", "D", "H", "psi"),
+  svntest.main.file_write(sbox.ospath('A/D/H/psi'),
                           "New content")
   expected_output = wc.State(wc_dir, {'A/D/H/psi' : Item(verb='Sending')})
   expected_status.tweak('A/D/H/psi', wc_rev=nbr_of_branches + 2)
@@ -4596,7 +4609,7 @@ def set_up_branch(sbox, branch_only = Fa
   expected_disk.tweak('A/D/H/psi', contents="New content")
 
   # r(nbr_of_branches + 3) - modify and commit A/D/G/rho
-  svntest.main.file_write(os.path.join(wc_dir, "A", "D", "G", "rho"),
+  svntest.main.file_write(sbox.ospath('A/D/G/rho'),
                           "New content")
   expected_output = wc.State(wc_dir, {'A/D/G/rho' : Item(verb='Sending')})
   expected_status.tweak('A/D/G/rho', wc_rev=nbr_of_branches + 3)
@@ -4605,7 +4618,7 @@ def set_up_branch(sbox, branch_only = Fa
   expected_disk.tweak('A/D/G/rho', contents="New content")
 
   # r(nbr_of_branches + 4) - modify and commit A/B/E/beta
-  svntest.main.file_write(os.path.join(wc_dir, "A", "B", "E", "beta"),
+  svntest.main.file_write(sbox.ospath('A/B/E/beta'),
                           "New content")
   expected_output = wc.State(wc_dir, {'A/B/E/beta' : Item(verb='Sending')})
   expected_status.tweak('A/B/E/beta', wc_rev=nbr_of_branches + 4)
@@ -4614,7 +4627,7 @@ def set_up_branch(sbox, branch_only = Fa
   expected_disk.tweak('A/B/E/beta', contents="New content")
 
   # r(nbr_of_branches + 5) - modify and commit A/D/H/omega
-  svntest.main.file_write(os.path.join(wc_dir, "A", "D", "H", "omega"),
+  svntest.main.file_write(sbox.ospath('A/D/H/omega'),
                           "New content")
   expected_output = wc.State(wc_dir, {'A/D/H/omega' : Item(verb='Sending')})
   expected_status.tweak('A/D/H/omega', wc_rev=nbr_of_branches + 5)
@@ -4650,13 +4663,13 @@ def mergeinfo_inheritance(sbox):
   wc_disk, wc_status = set_up_branch(sbox)
 
   # Some paths we'll care about
-  A_COPY_path      = os.path.join(wc_dir, "A_COPY")
-  B_COPY_path      = os.path.join(wc_dir, "A_COPY", "B")
-  beta_COPY_path   = os.path.join(wc_dir, "A_COPY", "B", "E", "beta")
-  E_COPY_path      = os.path.join(wc_dir, "A_COPY", "B", "E")
-  omega_COPY_path  = os.path.join(wc_dir, "A_COPY", "D", "H", "omega")
-  D_COPY_path      = os.path.join(wc_dir, "A_COPY", "D")
-  G_COPY_path      = os.path.join(wc_dir, "A_COPY", "D", "G")
+  A_COPY_path      = sbox.ospath('A_COPY')
+  B_COPY_path      = sbox.ospath('A_COPY/B')
+  beta_COPY_path   = sbox.ospath('A_COPY/B/E/beta')
+  E_COPY_path      = sbox.ospath('A_COPY/B/E')
+  omega_COPY_path  = sbox.ospath('A_COPY/D/H/omega')
+  D_COPY_path      = sbox.ospath('A_COPY/D')
+  G_COPY_path      = sbox.ospath('A_COPY/D/G')
 
   # Now start merging...
 
@@ -4988,9 +5001,9 @@ def mergeinfo_elision(sbox):
   wc_disk, wc_status = set_up_branch(sbox)
 
   # Some paths we'll care about
-  A_COPY_path      = os.path.join(wc_dir, "A_COPY")
-  beta_COPY_path   = os.path.join(wc_dir, "A_COPY", "B", "E", "beta")
-  G_COPY_path      = os.path.join(wc_dir, "A_COPY", "D", "G")
+  A_COPY_path      = sbox.ospath('A_COPY')
+  beta_COPY_path   = sbox.ospath('A_COPY/B/E/beta')
+  G_COPY_path      = sbox.ospath('A_COPY/D/G')
 
   # Now start merging...
 
@@ -5242,9 +5255,9 @@ def mergeinfo_inheritance_and_discontinu
 
   # Some paths we'll care about
   A_url = sbox.repo_url + '/A'
-  A_COPY_path      = os.path.join(wc_dir, "A_COPY")
-  D_COPY_path      = os.path.join(wc_dir, "A_COPY", "D")
-  A_COPY_rho_path  = os.path.join(wc_dir, "A_COPY", "D", "G", "rho")
+  A_COPY_path      = sbox.ospath('A_COPY')
+  D_COPY_path      = sbox.ospath('A_COPY/D')
+  A_COPY_rho_path  = sbox.ospath('A_COPY/D/G/rho')
 
   expected_disk, expected_status = set_up_branch(sbox)
 
@@ -5355,9 +5368,9 @@ def merge_to_target_with_copied_children
   expected_disk, expected_status = set_up_branch(sbox)
 
   # Some paths we'll care about
-  D_COPY_path = os.path.join(wc_dir, "A_COPY", "D")
-  G_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "G")
-  rho_COPY_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "G", "rho_copy")
+  D_COPY_path = sbox.ospath('A_COPY/D')
+  G_COPY_path = sbox.ospath('A_COPY/D/G')
+  rho_COPY_COPY_path = sbox.ospath('A_COPY/D/G/rho_copy')
 
   # URL to URL copy A_COPY/D/G/rho to A_COPY/D/G/rho_copy
   svntest.actions.run_and_verify_svn(None, None, [], 'copy',
@@ -5441,11 +5454,11 @@ def merge_to_switched_path(sbox):
   wc_disk, wc_status = set_up_branch(sbox)
 
   # Some paths we'll care about
-  A_COPY_path = os.path.join(wc_dir, "A_COPY")
-  A_COPY_D_path = os.path.join(wc_dir, "A_COPY", "D")
-  G_COPY_path = os.path.join(wc_dir, "A", "D", "G_COPY")
-  A_COPY_D_G_path = os.path.join(wc_dir, "A_COPY", "D", "G")
-  A_COPY_D_G_rho_path = os.path.join(wc_dir, "A_COPY", "D", "G", "rho")
+  A_COPY_path = sbox.ospath('A_COPY')
+  A_COPY_D_path = sbox.ospath('A_COPY/D')
+  G_COPY_path = sbox.ospath('A/D/G_COPY')
+  A_COPY_D_G_path = sbox.ospath('A_COPY/D/G')
+  A_COPY_D_G_rho_path = sbox.ospath('A_COPY/D/G/rho')
 
   expected = svntest.verify.UnorderedOutput(
          ["A    " + os.path.join(G_COPY_path, "pi") + "\n",
@@ -5471,7 +5484,7 @@ def merge_to_switched_path(sbox):
                                         None, wc_dir)
 
   # r8 - modify and commit A/D/G_COPY/rho
-  svntest.main.file_write(os.path.join(wc_dir, "A", "D", "G_COPY", "rho"),
+  svntest.main.file_write(sbox.ospath('A/D/G_COPY/rho'),
                           "New *and* improved rho content")
   expected_output = wc.State(wc_dir, {'A/D/G_COPY/rho' : Item(verb='Sending')})
   wc_status.tweak('A/D/G_COPY/rho', wc_rev=8)
@@ -5634,18 +5647,18 @@ def merge_to_path_with_switched_children
   wc_disk, wc_status = set_up_branch(sbox, False, 3)
 
   # Some paths we'll care about
-  D_path = os.path.join(wc_dir, "A", "D")
-  A_COPY_path = os.path.join(wc_dir, "A_COPY")
-  A_COPY_beta_path = os.path.join(wc_dir, "A_COPY", "B", "E", "beta")
-  A_COPY_chi_path = os.path.join(wc_dir, "A_COPY", "D", "H", "chi")
-  A_COPY_omega_path = os.path.join(wc_dir, "A_COPY", "D", "H", "omega")
-  A_COPY_psi_path = os.path.join(wc_dir, "A_COPY", "D", "H", "psi")
-  A_COPY_G_path = os.path.join(wc_dir, "A_COPY", "D", "G")
-  A_COPY_rho_path = os.path.join(wc_dir, "A_COPY", "D", "G", "rho")
-  A_COPY_H_path = os.path.join(wc_dir, "A_COPY", "D", "H")
-  A_COPY_D_path = os.path.join(wc_dir, "A_COPY", "D")
-  A_COPY_gamma_path = os.path.join(wc_dir, "A_COPY", "D", "gamma")
-  H_COPY_2_path = os.path.join(wc_dir, "A_COPY_2", "D", "H")
+  D_path = sbox.ospath('A/D')
+  A_COPY_path = sbox.ospath('A_COPY')
+  A_COPY_beta_path = sbox.ospath('A_COPY/B/E/beta')
+  A_COPY_chi_path = sbox.ospath('A_COPY/D/H/chi')
+  A_COPY_omega_path = sbox.ospath('A_COPY/D/H/omega')
+  A_COPY_psi_path = sbox.ospath('A_COPY/D/H/psi')
+  A_COPY_G_path = sbox.ospath('A_COPY/D/G')
+  A_COPY_rho_path = sbox.ospath('A_COPY/D/G/rho')
+  A_COPY_H_path = sbox.ospath('A_COPY/D/H')
+  A_COPY_D_path = sbox.ospath('A_COPY/D')
+  A_COPY_gamma_path = sbox.ospath('A_COPY/D/gamma')
+  H_COPY_2_path = sbox.ospath('A_COPY_2/D/H')
 
   svntest.actions.run_and_verify_svn(None, exp_noop_up_out(8), [], 'up',
                                      wc_dir)
@@ -6129,7 +6142,7 @@ def merge_with_implicit_target_file(sbox
   # Make a change to A/mu, then revert it using 'svn merge -r 2:1 A/mu'
 
   # change A/mu and commit
-  A_path = os.path.join(wc_dir, 'A')
+  A_path = sbox.ospath('A')
   mu_path = os.path.join(A_path, 'mu')
 
   svntest.main.file_append(mu_path, "A whole new line.\n")
@@ -6182,10 +6195,10 @@ def empty_mergeinfo(sbox):
   wc_disk, wc_status = set_up_branch(sbox)
 
   # Some paths we'll care about
-  A_COPY_path = os.path.join(wc_dir, "A_COPY")
-  H_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "H")
-  psi_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "H", "psi")
-  rho_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "G", "rho")
+  A_COPY_path = sbox.ospath('A_COPY')
+  H_COPY_path = sbox.ospath('A_COPY/D/H')
+  psi_COPY_path = sbox.ospath('A_COPY/D/H/psi')
+  rho_COPY_path = sbox.ospath('A_COPY/D/G/rho')
 
   # Test area A -- Merge r2:4 into A_COPY then reverse merge 4:2 to
   # A_COPY/D/G.  A_COPY/D/G should end up with empty mergeinfo to
@@ -6320,9 +6333,9 @@ def prop_add_to_child_with_mergeinfo(sbo
   expected_disk, expected_status = set_up_branch(sbox)
 
   # Some paths we'll care about
-  beta_path = os.path.join(wc_dir, "A", "B", "E", "beta")
-  beta_COPY_path = os.path.join(wc_dir, "A_COPY", "B", "E", "beta")
-  B_COPY_path = os.path.join(wc_dir, "A_COPY", "B")
+  beta_path = sbox.ospath('A/B/E/beta')
+  beta_COPY_path = sbox.ospath('A_COPY/B/E/beta')
+  B_COPY_path = sbox.ospath('A_COPY/B')
 
   # Set a non-mergeinfo prop on a file.
   svntest.actions.run_and_verify_svn(None,
@@ -6411,7 +6424,7 @@ def foreign_repos_does_not_update_mergei
 
   # Merge r3:4 (using implied peg revisions) from 'other' repos into
   # A_COPY/D/G.  Merge should succeed, but no mergeinfo should be set.
-  G_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "G")
+  G_COPY_path = sbox.ospath('A_COPY/D/G')
   svntest.actions.run_and_verify_svn(None,
                                      expected_merge_output([[4]],
                                       'U    ' +
@@ -6423,7 +6436,7 @@ def foreign_repos_does_not_update_mergei
 
   # Merge r4:5 (using explicit peg revisions) from 'other' repos into
   # A_COPY/B/E.  Merge should succeed, but no mergeinfo should be set.
-  E_COPY_path = os.path.join(wc_dir, "A_COPY", "B", "E")
+  E_COPY_path = sbox.ospath('A_COPY/B/E')
   svntest.actions.run_and_verify_svn(None,
                                      expected_merge_output([[5]],
                                       'U    ' +
@@ -6492,7 +6505,7 @@ def foreign_repos_does_not_update_mergei
   svntest.actions.run_and_verify_svn(None, None, [], 'merge',
                                      other_repo_url + '/A@1',
                                      other_repo_url + '/A_COPY@7',
-                                     os.path.join(wc_dir, 'A_COPY'))
+                                     sbox.ospath('A_COPY'))
   #...which means there should be no mergeinfo anywhere in WC_DIR, since
   # this test never created any.
   svntest.actions.run_and_verify_svn(None, [], [], 'pg',
@@ -6514,10 +6527,10 @@ def avoid_reflected_revs(sbox):
   wc_disk, wc_status = set_up_branch(sbox, True, 1)
 
   # Some paths we'll care about
-  A_path = os.path.join(wc_dir, 'A')
-  A_COPY_path = os.path.join(wc_dir, 'A_COPY')
-  tfile1_path = os.path.join(wc_dir, 'A', 'tfile1')
-  tfile2_path = os.path.join(wc_dir, 'A', 'tfile2')
+  A_path = sbox.ospath('A')
+  A_COPY_path = sbox.ospath('A_COPY')
+  tfile1_path = sbox.ospath('A/tfile1')
+  tfile2_path = sbox.ospath('A/tfile2')
   bfile1_path = os.path.join(A_COPY_path, 'bfile1')
   bfile2_path = os.path.join(A_COPY_path, 'bfile2')
 
@@ -6528,7 +6541,7 @@ def avoid_reflected_revs(sbox):
   bfile2_content = "This is bfile2\n"
 
   # We'll consider A as the trunk and A_COPY as the feature branch
-  # Create a tfile1 in A
+  # r3 - Create a tfile1 in A
   svntest.main.file_write(tfile1_path, tfile1_content)
   svntest.actions.run_and_verify_svn(None, None, [], 'add', tfile1_path)
   expected_output = wc.State(wc_dir, {'A/tfile1' : Item(verb='Adding')})
@@ -6536,7 +6549,7 @@ def avoid_reflected_revs(sbox):
   svntest.actions.run_and_verify_commit(wc_dir, expected_output,
                                         wc_status, None, wc_dir)
 
-  # Create a bfile1 in A_COPY
+  # r4 - Create a bfile1 in A_COPY
   svntest.main.file_write(bfile1_path, bfile1_content)
   svntest.actions.run_and_verify_svn(None, None, [], 'add', bfile1_path)
   expected_output = wc.State(wc_dir, {'A_COPY/bfile1' : Item(verb='Adding')})
@@ -6544,7 +6557,7 @@ def avoid_reflected_revs(sbox):
   svntest.actions.run_and_verify_commit(wc_dir, expected_output,
                                         wc_status, None, wc_dir)
 
-  # Create one more file in A
+  # r5 - Create one more file in A
   svntest.main.file_write(tfile2_path, tfile2_content)
   svntest.actions.run_and_verify_svn(None, None, [], 'add', tfile2_path)
   expected_output = wc.State(wc_dir, {'A/tfile2' : Item(verb='Adding')})
@@ -6621,7 +6634,6 @@ def avoid_reflected_revs(sbox):
                                        None, A_COPY_path,
                                        '--allow-mixed-revisions')
 
-  # Sync up with the trunk ie., A
   svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
   expected_output = wc.State(wc_dir, {
     'A_COPY'        : Item(verb='Sending'),
@@ -6662,7 +6674,6 @@ def avoid_reflected_revs(sbox):
                                        None, A_COPY_path,
                                        '--allow-mixed-revisions')
 
-
   svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
   expected_output = wc.State(wc_dir, {
     'A_COPY'        : Item(verb='Sending'),
@@ -6671,7 +6682,7 @@ def avoid_reflected_revs(sbox):
   svntest.actions.run_and_verify_commit(wc_dir, expected_output,
                                         None, None, wc_dir)
 
-  # Add bfile2 to A_COPY
+  # r8 - Add bfile2 to A_COPY
   svntest.main.file_write(bfile2_path, bfile2_content)
   svntest.actions.run_and_verify_svn(None, None, [], 'add', bfile2_path)
   expected_output = wc.State(wc_dir, {'A_COPY/bfile2' : Item(verb='Adding')})
@@ -6687,7 +6698,6 @@ def avoid_reflected_revs(sbox):
 
   # Merge 2:8 from A_COPY(feature branch) to A(trunk).
   expected_output = wc.State(A_path, {
-    ''       : Item(status='C '),
     'bfile2' : Item(status='A '),
     'bfile1' : Item(status='A '),
     })
@@ -6697,7 +6707,7 @@ def avoid_reflected_revs(sbox):
   expected_elision_output = wc.State(A_path, {
     })
   expected_status = wc.State(A_path, {
-    ''          : Item(status='CM', wc_rev=6),
+    ''          : Item(status=' M', wc_rev=6),
     'bfile2'    : Item(status='A ', wc_rev='-', copied='+'),
     'bfile1'    : Item(status='A ', wc_rev='-', copied='+'),
     'tfile2'    : Item(status='  ', wc_rev=6),
@@ -6772,7 +6782,7 @@ def update_loses_mergeinfo(sbox):
 
   sbox.build()
   wc_dir = sbox.wc_dir
-  A_C_wc_dir = os.path.join(wc_dir, 'A', 'C')
+  A_C_wc_dir = sbox.ospath('A/C')
   A_B_url = sbox.repo_url + '/A/B'
   A_B_J_url = sbox.repo_url + '/A/B/J'
   A_B_K_url = sbox.repo_url + '/A/B/K'
@@ -6892,7 +6902,7 @@ def merge_loses_mergeinfo(sbox):
 
   sbox.build()
   wc_dir = sbox.wc_dir
-  A_C_wc_dir = os.path.join(wc_dir, 'A', 'C')
+  A_C_wc_dir = sbox.ospath('A/C')
   A_B_url = sbox.repo_url + '/A/B'
   A_B_J_url = sbox.repo_url + '/A/B/J'
   A_B_K_url = sbox.repo_url + '/A/B/K'
@@ -7005,8 +7015,8 @@ def single_file_replace_style_merge_capa
 
   sbox.build()
   wc_dir = sbox.wc_dir
-  iota_path = os.path.join(wc_dir, 'iota')
-  mu_path = os.path.join(wc_dir, 'A', 'mu')
+  iota_path = sbox.ospath('iota')
+  mu_path = sbox.ospath('A/mu')
 
   # delete mu and replace it with a copy of iota
   svntest.main.run_svn(None, 'rm', mu_path)
@@ -7052,7 +7062,7 @@ def merge_to_out_of_date_target(sbox):
   svntest.actions.duplicate_dir(wc_dir, other_wc)
 
   # Some paths we'll care about
-  A_COPY_H_path = os.path.join(wc_dir, "A_COPY", "D", "H")
+  A_COPY_H_path = sbox.ospath('A_COPY/D/H')
   other_A_COPY_H_path = os.path.join(other_wc, "A_COPY", "D", "H")
 
   # Merge -c3 into A_COPY/D/H of first WC.
@@ -7161,10 +7171,10 @@ def merge_with_depth_files(sbox):
   wc_dir = sbox.wc_dir
 
   # Some paths we'll care about
-  mu_path = os.path.join(wc_dir, 'A', 'mu')
-  gamma_path = os.path.join(wc_dir, 'A', 'D', 'gamma')
-  Acopy_path = os.path.join(wc_dir, 'A_copy')
-  Acopy_mu_path = os.path.join(wc_dir, 'A_copy', 'mu')
+  mu_path = sbox.ospath('A/mu')
+  gamma_path = sbox.ospath('A/D/gamma')
+  Acopy_path = sbox.ospath('A_copy')
+  Acopy_mu_path = sbox.ospath('A_copy/mu')
   A_url = sbox.repo_url + '/A'
   Acopy_url = sbox.repo_url + '/A_copy'
 
@@ -7290,16 +7300,16 @@ def merge_away_subtrees_noninheritable_r
   wc_disk, wc_status = set_up_branch(sbox, nbr_of_branches=2)
 
   # Some paths we'll care about
-  H_path      = os.path.join(wc_dir, "A", "D", "H")
-  D_COPY_path = os.path.join(wc_dir, "A_COPY", "D")
-  A_COPY_path = os.path.join(wc_dir, "A_COPY")
-  nu_path     = os.path.join(wc_dir, "A", "nu")
-  mu_path     = os.path.join(wc_dir, "A", "mu")
-  mu_2_path   = os.path.join(wc_dir, "A_COPY_2", "mu")
-  D_COPY_2_path = os.path.join(wc_dir, "A_COPY_2", "D")
-  H_COPY_2_path = os.path.join(wc_dir, "A_COPY_2", "D", "H")
-  mu_COPY_path  = os.path.join(wc_dir, "A_COPY", "mu")
-  nu_COPY_path  = os.path.join(wc_dir, "A_COPY", "nu")
+  H_path      = sbox.ospath('A/D/H')
+  D_COPY_path = sbox.ospath('A_COPY/D')
+  A_COPY_path = sbox.ospath('A_COPY')
+  nu_path     = sbox.ospath('A/nu')
+  mu_path     = sbox.ospath('A/mu')
+  mu_2_path   = sbox.ospath('A_COPY_2/mu')
+  D_COPY_2_path = sbox.ospath('A_COPY_2/D')
+  H_COPY_2_path = sbox.ospath('A_COPY_2/D/H')
+  mu_COPY_path  = sbox.ospath('A_COPY/mu')
+  nu_COPY_path  = sbox.ospath('A_COPY/nu')
 
   # Make a change to directory A/D/H and commit as r8.
   svntest.actions.run_and_verify_svn(None, exp_noop_up_out(7), [],
@@ -7725,16 +7735,16 @@ def merge_to_sparse_directories(sbox):
   wc_disk, wc_status = set_up_branch(sbox, False, 1)
 
   # Some paths we'll care about
-  A_path = os.path.join(wc_dir, "A")
-  D_path = os.path.join(wc_dir, "A", "D")
-  I_path = os.path.join(wc_dir, "A", "C", "I")
-  G_path = os.path.join(wc_dir, "A", "D", "G")
-  A_COPY_path = os.path.join(wc_dir, "A_COPY")
+  A_path = sbox.ospath('A')
+  D_path = sbox.ospath('A/D')
+  I_path = sbox.ospath('A/C/I')
+  G_path = sbox.ospath('A/D/G')
+  A_COPY_path = sbox.ospath('A_COPY')
 
   # Make a few more changes to the merge source...
 
   # r7 - modify and commit A/mu
-  svntest.main.file_write(os.path.join(wc_dir, "A", "mu"),
+  svntest.main.file_write(sbox.ospath('A/mu'),
                           "New content")
   expected_output = wc.State(wc_dir, {'A/mu' : Item(verb='Sending')})
   wc_status.tweak('A/mu', wc_rev=7)
@@ -8009,7 +8019,9 @@ def merge_to_sparse_directories(sbox):
 def merge_old_and_new_revs_from_renamed_dir(sbox):
   "merge -rold(before rename):head renamed dir"
 
-  ## See http://svn.haxx.se/dev/archive-2007-09/0706.shtml ##
+  # See the email on dev@ from Paul Burba, 2007-09-27, "RE: svn commit:
+  # r26803 - [...]", <http://svn.haxx.se/dev/archive-2007-09/0706.shtml> or
+  # <http://subversion.tigris.org/ds/viewMessage.do?dsForumId=462&dsMessageId=927127>.
 
   # Create a WC with a single branch
   sbox.build()
@@ -8019,9 +8031,9 @@ def merge_old_and_new_revs_from_renamed_
   # Some paths we'll care about
   A_url = sbox.repo_url + '/A'
   A_MOVED_url = sbox.repo_url + '/A_MOVED'
-  A_COPY_path = os.path.join(wc_dir, 'A_COPY')
-  mu_path = os.path.join(wc_dir, 'A', 'mu')
-  A_MOVED_mu_path = os.path.join(wc_dir, 'A_MOVED', 'mu')
+  A_COPY_path = sbox.ospath('A_COPY')
+  mu_path = sbox.ospath('A/mu')
+  A_MOVED_mu_path = sbox.ospath('A_MOVED/mu')
 
   # Make a modification to A/mu
   svntest.main.file_write(mu_path, "This is the file 'mu' modified.\n")
@@ -8184,13 +8196,13 @@ def merge_with_child_having_different_re
   # Create a WC
   sbox.build()
   wc_dir = sbox.wc_dir
-  A_path = os.path.join(wc_dir, 'A')
-  mu_path = os.path.join(wc_dir, 'A', 'mu')
+  A_path = sbox.ospath('A')
+  mu_path = sbox.ospath('A/mu')
   A_url = sbox.repo_url + '/A'
   A_mu_url = sbox.repo_url + '/A/mu'
   A_COPY_url = sbox.repo_url + '/A_COPY'
-  A_COPY_path = os.path.join(wc_dir, 'A_COPY')
-  A_COPY_mu_path = os.path.join(wc_dir, 'A_COPY', 'mu')
+  A_COPY_path = sbox.ospath('A_COPY')
+  A_COPY_mu_path = sbox.ospath('A_COPY/mu')
   thirty_line_dummy_text = 'line1\n'
   for i in range(2, 31):
     thirty_line_dummy_text += 'line' + str(i) + '\n'
@@ -8434,9 +8446,9 @@ def merge_old_and_new_revs_from_renamed_
   mu_url = sbox.repo_url + '/A/mu'
   mu_MOVED_url = sbox.repo_url + '/A/mu_MOVED'
   mu_COPY_url = sbox.repo_url + '/A/mu_COPY'
-  mu_COPY_path = os.path.join(wc_dir, 'A', 'mu_COPY')
-  mu_path = os.path.join(wc_dir, 'A', 'mu')
-  mu_MOVED_path = os.path.join(wc_dir, 'A', 'mu_MOVED')
+  mu_COPY_path = sbox.ospath('A/mu_COPY')
+  mu_path = sbox.ospath('A/mu')
+  mu_MOVED_path = sbox.ospath('A/mu_MOVED')
 
   # Copy mu to mu_COPY
   svntest.actions.run_and_verify_svn(None, ['\n', 'Committed revision 2.\n'],
@@ -8502,9 +8514,9 @@ def merge_with_auto_rev_range_detection(
   # Some paths we'll care about
   A_url = sbox.repo_url + '/A'
   A_COPY_url = sbox.repo_url + '/A_COPY'
-  B1_path = os.path.join(wc_dir, 'A', 'B1')
-  B1_mu_path = os.path.join(wc_dir, 'A', 'B1', 'mu')
-  A_COPY_path = os.path.join(wc_dir, 'A_COPY')
+  B1_path = sbox.ospath('A/B1')
+  B1_mu_path = sbox.ospath('A/B1/mu')
+  A_COPY_path = sbox.ospath('A_COPY')
 
   # Create B1 inside A
   svntest.actions.run_and_verify_svn(None, ["A         " + B1_path + "\n"],
@@ -8628,15 +8640,15 @@ def cherry_picking(sbox):
   wc_disk, wc_status = set_up_branch(sbox)
 
   # Some paths we'll care about
-  H_path = os.path.join(wc_dir, "A", "D", "H")
-  G_path = os.path.join(wc_dir, "A", "D", "G")
-  A_COPY_path = os.path.join(wc_dir, "A_COPY")
-  D_COPY_path = os.path.join(wc_dir, "A_COPY", "D")
-  G_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "G")
-  H_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "H")
-  rho_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "G", "rho")
-  omega_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "H", "omega")
-  psi_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "H", "psi")
+  H_path = sbox.ospath('A/D/H')
+  G_path = sbox.ospath('A/D/G')
+  A_COPY_path = sbox.ospath('A_COPY')
+  D_COPY_path = sbox.ospath('A_COPY/D')
+  G_COPY_path = sbox.ospath('A_COPY/D/G')
+  H_COPY_path = sbox.ospath('A_COPY/D/H')
+  rho_COPY_path = sbox.ospath('A_COPY/D/G/rho')
+  omega_COPY_path = sbox.ospath('A_COPY/D/H/omega')
+  psi_COPY_path = sbox.ospath('A_COPY/D/H/psi')
 
   # Update working copy
   expected_output = svntest.wc.State(wc_dir, {})
@@ -8815,11 +8827,11 @@ def propchange_of_subdir_raises_conflict
 
   # Some paths we'll care about
   B_url = sbox.repo_url + '/A/B'
-  E_path = os.path.join(wc_dir, 'A', 'B', 'E')
-  lambda_path = os.path.join(wc_dir, 'A', 'B', 'lambda')
-  A_COPY_B_path = os.path.join(wc_dir, 'A_COPY', 'B')
-  A_COPY_B_E_path = os.path.join(wc_dir, 'A_COPY', 'B', 'E')
-  A_COPY_lambda_path = os.path.join(wc_dir, 'A_COPY', 'B', 'E', 'lambda')
+  E_path = sbox.ospath('A/B/E')
+  lambda_path = sbox.ospath('A/B/lambda')
+  A_COPY_B_path = sbox.ospath('A_COPY/B')
+  A_COPY_B_E_path = sbox.ospath('A_COPY/B/E')
+  A_COPY_lambda_path = sbox.ospath('A_COPY/B/E/lambda')
 
   # Set a property on A/B/E and Make a modification to A/B/lambda
   svntest.main.run_svn(None, 'propset', 'x', 'x', E_path)
@@ -8929,9 +8941,9 @@ def reverse_merge_prop_add_on_child(sbox
   wc_disk, wc_status = set_up_branch(sbox, True, 1)
 
   # Some paths we'll care about
-  G_path = os.path.join(wc_dir, "A", "D", "G")
-  D_COPY_path = os.path.join(wc_dir, "A_COPY", "D")
-  G_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "G")
+  G_path = sbox.ospath('A/D/G')
+  D_COPY_path = sbox.ospath('A_COPY/D')
+  G_COPY_path = sbox.ospath('A_COPY/D/G')
 
   # Make some prop changes to some dirs.
   svntest.actions.run_and_verify_svn(None,
@@ -9041,9 +9053,9 @@ def merge_target_with_non_inheritable_me
 
   # Some paths we'll care about
   B_url = sbox.repo_url + '/A/B'
-  lambda_path = os.path.join(wc_dir, 'A', 'B', 'lambda')
-  newfile_path = os.path.join(wc_dir, 'A', 'B', 'E', 'newfile')
-  A_COPY_B_path = os.path.join(wc_dir, 'A_COPY', 'B')
+  lambda_path = sbox.ospath('A/B/lambda')
+  newfile_path = sbox.ospath('A/B/E/newfile')
+  A_COPY_B_path = sbox.ospath('A_COPY/B')
 
   # Make a modifications to A/B/lambda and add A/B/E/newfile
   svntest.main.file_write(lambda_path, "This is the file 'lambda' modified.\n")
@@ -9153,7 +9165,7 @@ def self_reverse_merge(sbox):
   wc_dir = sbox.wc_dir
 
   # Make changes to the working copy
-  mu_path = os.path.join(wc_dir, 'A', 'mu')
+  mu_path = sbox.ospath('A/mu')
   svntest.main.file_append(mu_path, 'appended mu text')
 
   # Created expected output tree for 'svn ci'
@@ -9233,9 +9245,9 @@ def ignore_ancestry_and_mergeinfo(sbox):
 
   # Some paths we'll care about
   A_B_url = sbox.repo_url + '/A/B'
-  A_COPY_B_path = os.path.join(wc_dir, 'A_COPY', 'B')
-  lambda_path = os.path.join(wc_dir, 'A', 'B', 'lambda')
-  A_COPY_lambda_path = os.path.join(wc_dir, 'A_COPY', 'B', 'lambda')
+  A_COPY_B_path = sbox.ospath('A_COPY/B')
+  lambda_path = sbox.ospath('A/B/lambda')
+  A_COPY_lambda_path = sbox.ospath('A_COPY/B/lambda')
 
   # Make modifications to A/B/lambda
   svntest.main.file_write(lambda_path, "This is the file 'lambda' modified.\n")
@@ -9349,9 +9361,9 @@ def merge_from_renamed_branch_fails_whil
   A_C_url = sbox.repo_url + '/A/C'
   A_COPY_C_url = sbox.repo_url + '/A/COPY_C'
   A_RENAMED_C_url = sbox.repo_url + '/A/RENAMED_C'
-  A_C_path = os.path.join(wc_dir, 'A', 'C')
-  A_RENAMED_C_path = os.path.join(wc_dir, 'A', 'RENAMED_C')
-  A_RENAMED_C_file1_path = os.path.join(wc_dir, 'A', 'RENAMED_C', 'file1')
+  A_C_path = sbox.ospath('A/C')
+  A_RENAMED_C_path = sbox.ospath('A/RENAMED_C')
+  A_RENAMED_C_file1_path = sbox.ospath('A/RENAMED_C/file1')
 
   svntest.main.run_svn(None, 'cp', A_C_url, A_COPY_C_url, '-m', 'copy...')
   svntest.main.run_svn(None, 'mv', A_COPY_C_url, A_RENAMED_C_url, '-m',
@@ -9443,8 +9455,8 @@ def merge_source_normalization_and_subtr
   wc_dir = sbox.wc_dir
 
   # Some paths we'll care about
-  D_COPY_path = os.path.join(wc_dir, "A_COPY", "D")
-  G_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "G")
+  D_COPY_path = sbox.ospath('A_COPY/D')
+  G_COPY_path = sbox.ospath('A_COPY/D/G')
 
   # Use our helper to copy 'A' to 'A_COPY' then make some changes under 'A'
   wc_disk, wc_status = set_up_branch(sbox)
@@ -9486,7 +9498,7 @@ def merge_source_normalization_and_subtr
                                      'update', wc_dir)
 
   # r8 - Make a text mod to 'A_MOVED/D/G/tau'
-  svntest.main.file_write(os.path.join(wc_dir, "A_MOVED", "D", "G", "tau"),
+  svntest.main.file_write(sbox.ospath('A_MOVED/D/G/tau'),
                           "New content")
   expected_output = wc.State(wc_dir,
                              {'A_MOVED/D/G/tau' : Item(verb='Sending')})
@@ -9598,12 +9610,12 @@ def new_subtrees_should_not_break_merge(
   wc_disk, wc_status = set_up_branch(sbox)
 
   # Some paths we'll care about
-  A_COPY_path   = os.path.join(wc_dir, "A_COPY")
-  D_COPY_path   = os.path.join(wc_dir, "A_COPY", "D")
-  nu_path       = os.path.join(wc_dir, "A", "D", "H", "nu")
-  nu_COPY_path  = os.path.join(wc_dir, "A_COPY", "D", "H", "nu")
-  rho_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "G", "rho")
-  H_COPY_path   = os.path.join(wc_dir, "A_COPY", "D", "H")
+  A_COPY_path   = sbox.ospath('A_COPY')
+  D_COPY_path   = sbox.ospath('A_COPY/D')
+  nu_path       = sbox.ospath('A/D/H/nu')
+  nu_COPY_path  = sbox.ospath('A_COPY/D/H/nu')
+  rho_COPY_path = sbox.ospath('A_COPY/D/G/rho')
+  H_COPY_path   = sbox.ospath('A_COPY/D/H')
 
   # Create 'A/D/H/nu', commit it as r7, make a text mod to it in r8.
   svntest.main.file_write(nu_path, "This is the file 'nu'.\n")
@@ -10030,12 +10042,12 @@ def dont_add_mergeinfo_from_own_history(
   wc_disk, wc_status = set_up_branch(sbox)
 
   # Some paths we'll care about
-  A_path        = os.path.join(wc_dir, "A")
-  A_MOVED_path  = os.path.join(wc_dir, "A_MOVED")
-  mu_path       = os.path.join(wc_dir, "A", "mu")
-  mu_MOVED_path = os.path.join(wc_dir, "A_MOVED", "mu")
-  A_COPY_path   = os.path.join(wc_dir, "A_COPY")
-  mu_COPY_path  = os.path.join(wc_dir, "A_COPY", "mu")
+  A_path        = sbox.ospath('A')
+  A_MOVED_path  = sbox.ospath('A_MOVED')
+  mu_path       = sbox.ospath('A/mu')
+  mu_MOVED_path = sbox.ospath('A_MOVED/mu')
+  A_COPY_path   = sbox.ospath('A_COPY')
+  mu_COPY_path  = sbox.ospath('A_COPY/mu')
 
   # Merge r3 from 'A' to 'A_COPY', make a text mod to 'A_COPY/mu' and
   # commit both as r7.  This results in mergeinfo of '/A:3' on 'A_COPY'.
@@ -10338,50 +10350,50 @@ def dont_add_mergeinfo_from_own_history(
   #
   # Create the new 'A' by exporting the old 'A@1'.
   expected_output = svntest.verify.UnorderedOutput(
-      ["A    " + os.path.join(wc_dir, "A") + "\n",
-       "A    " + os.path.join(wc_dir, "A", "B") + "\n",
-       "A    " + os.path.join(wc_dir, "A", "B", "lambda") + "\n",
-       "A    " + os.path.join(wc_dir, "A", "B", "E") + "\n",
-       "A    " + os.path.join(wc_dir, "A", "B", "E", "alpha") + "\n",
-       "A    " + os.path.join(wc_dir, "A", "B", "E", "beta") + "\n",
-       "A    " + os.path.join(wc_dir, "A", "B", "F") + "\n",
-       "A    " + os.path.join(wc_dir, "A", "mu") + "\n",
-       "A    " + os.path.join(wc_dir, "A", "C") + "\n",
-       "A    " + os.path.join(wc_dir, "A", "D") + "\n",
-       "A    " + os.path.join(wc_dir, "A", "D", "gamma") + "\n",
-       "A    " + os.path.join(wc_dir, "A", "D", "G") + "\n",
-       "A    " + os.path.join(wc_dir, "A", "D", "G", "pi") + "\n",
-       "A    " + os.path.join(wc_dir, "A", "D", "G", "rho") + "\n",
-       "A    " + os.path.join(wc_dir, "A", "D", "G", "tau") + "\n",
-       "A    " + os.path.join(wc_dir, "A", "D", "H") + "\n",
-       "A    " + os.path.join(wc_dir, "A", "D", "H", "chi") + "\n",
-       "A    " + os.path.join(wc_dir, "A", "D", "H", "omega") + "\n",
-       "A    " + os.path.join(wc_dir, "A", "D", "H", "psi") + "\n",
+      ["A    " + sbox.ospath('A') + "\n",
+       "A    " + sbox.ospath('A/B') + "\n",
+       "A    " + sbox.ospath('A/B/lambda') + "\n",
+       "A    " + sbox.ospath('A/B/E') + "\n",
+       "A    " + sbox.ospath('A/B/E/alpha') + "\n",
+       "A    " + sbox.ospath('A/B/E/beta') + "\n",
+       "A    " + sbox.ospath('A/B/F') + "\n",
+       "A    " + sbox.ospath('A/mu') + "\n",
+       "A    " + sbox.ospath('A/C') + "\n",
+       "A    " + sbox.ospath('A/D') + "\n",
+       "A    " + sbox.ospath('A/D/gamma') + "\n",
+       "A    " + sbox.ospath('A/D/G') + "\n",
+       "A    " + sbox.ospath('A/D/G/pi') + "\n",
+       "A    " + sbox.ospath('A/D/G/rho') + "\n",
+       "A    " + sbox.ospath('A/D/G/tau') + "\n",
+       "A    " + sbox.ospath('A/D/H') + "\n",
+       "A    " + sbox.ospath('A/D/H/chi') + "\n",
+       "A    " + sbox.ospath('A/D/H/omega') + "\n",
+       "A    " + sbox.ospath('A/D/H/psi') + "\n",
        "Exported revision 1.\n",]
        )
   svntest.actions.run_and_verify_svn(None, expected_output, [],
                                      'export', sbox.repo_url + '/A@1',
                                      A_path)
   expected_output = svntest.verify.UnorderedOutput(
-      ["A         " + os.path.join(wc_dir, "A") + "\n",
-       "A         " + os.path.join(wc_dir, "A", "B") + "\n",
-       "A         " + os.path.join(wc_dir, "A", "B", "lambda") + "\n",
-       "A         " + os.path.join(wc_dir, "A", "B", "E") + "\n",
-       "A         " + os.path.join(wc_dir, "A", "B", "E", "alpha") + "\n",
-       "A         " + os.path.join(wc_dir, "A", "B", "E", "beta") + "\n",
-       "A         " + os.path.join(wc_dir, "A", "B", "F") + "\n",
-       "A         " + os.path.join(wc_dir, "A", "mu") + "\n",
-       "A         " + os.path.join(wc_dir, "A", "C") + "\n",
-       "A         " + os.path.join(wc_dir, "A", "D") + "\n",
-       "A         " + os.path.join(wc_dir, "A", "D", "gamma") + "\n",
-       "A         " + os.path.join(wc_dir, "A", "D", "G") + "\n",
-       "A         " + os.path.join(wc_dir, "A", "D", "G", "pi") + "\n",
-       "A         " + os.path.join(wc_dir, "A", "D", "G", "rho") + "\n",
-       "A         " + os.path.join(wc_dir, "A", "D", "G", "tau") + "\n",
-       "A         " + os.path.join(wc_dir, "A", "D", "H") + "\n",
-       "A         " + os.path.join(wc_dir, "A", "D", "H", "chi") + "\n",
-       "A         " + os.path.join(wc_dir, "A", "D", "H", "omega") + "\n",
-       "A         " + os.path.join(wc_dir, "A", "D", "H", "psi") + "\n",]
+      ["A         " + sbox.ospath('A') + "\n",
+       "A         " + sbox.ospath('A/B') + "\n",
+       "A         " + sbox.ospath('A/B/lambda') + "\n",
+       "A         " + sbox.ospath('A/B/E') + "\n",
+       "A         " + sbox.ospath('A/B/E/alpha') + "\n",
+       "A         " + sbox.ospath('A/B/E/beta') + "\n",
+       "A         " + sbox.ospath('A/B/F') + "\n",
+       "A         " + sbox.ospath('A/mu') + "\n",
+       "A         " + sbox.ospath('A/C') + "\n",
+       "A         " + sbox.ospath('A/D') + "\n",
+       "A         " + sbox.ospath('A/D/gamma') + "\n",
+       "A         " + sbox.ospath('A/D/G') + "\n",
+       "A         " + sbox.ospath('A/D/G/pi') + "\n",
+       "A         " + sbox.ospath('A/D/G/rho') + "\n",
+       "A         " + sbox.ospath('A/D/G/tau') + "\n",
+       "A         " + sbox.ospath('A/D/H') + "\n",
+       "A         " + sbox.ospath('A/D/H/chi') + "\n",
+       "A         " + sbox.ospath('A/D/H/omega') + "\n",
+       "A         " + sbox.ospath('A/D/H/psi') + "\n",]
       )
   svntest.actions.run_and_verify_svn(None, expected_output, [],
                                      'add', A_path)
@@ -10508,12 +10520,12 @@ def merge_range_predates_history(sbox):
   sbox.build()
   wc_dir = sbox.wc_dir
 
-  iota_path = os.path.join(wc_dir, "iota")
-  trunk_file_path = os.path.join(wc_dir, "trunk", "file")
+  iota_path = sbox.ospath('iota')
+  trunk_file_path = sbox.ospath('trunk/file')
   trunk_url = sbox.repo_url + "/trunk"
   branches_url = sbox.repo_url + "/branches"
-  branch_path = os.path.join(wc_dir, "branches", "branch")
-  branch_file_path = os.path.join(wc_dir, "branches", "branch", "file")
+  branch_path = sbox.ospath('branches/branch')
+  branch_file_path = sbox.ospath('branches/branch/file')
   branch_url = sbox.repo_url + "/branches/branch"
 
   # Tweak a file and commit. (r2)
@@ -10559,15 +10571,15 @@ def foreign_repos(sbox):
   wc_dir2 = sbox2.wc_dir
 
   # Convenience variables for working copy paths.
-  Z_path = os.path.join(wc_dir, 'A', 'D', 'G', 'Z')
-  B_path = os.path.join(wc_dir, 'A', 'B')
-  Q_path = os.path.join(wc_dir, 'Q')
-  H_path = os.path.join(wc_dir, 'A', 'D', 'H')
-  iota_path = os.path.join(wc_dir, 'iota')
-  beta_path = os.path.join(wc_dir, 'A', 'B', 'E', 'beta')
-  alpha_path = os.path.join(wc_dir, 'A', 'B', 'E', 'alpha')
-  zeta_path = os.path.join(wc_dir, 'A', 'D', 'G', 'Z', 'zeta')
-  fred_path = os.path.join(wc_dir, 'A', 'C', 'fred')
+  Z_path = sbox.ospath('A/D/G/Z')
+  B_path = sbox.ospath('A/B')
+  Q_path = sbox.ospath('Q')
+  H_path = sbox.ospath('A/D/H')
+  iota_path = sbox.ospath('iota')
+  beta_path = sbox.ospath('A/B/E/beta')
+  alpha_path = sbox.ospath('A/B/E/alpha')
+  zeta_path = sbox.ospath('A/D/G/Z/zeta')
+  fred_path = sbox.ospath('A/C/fred')
 
   # Add new directories, with and without properties.
   svntest.main.run_svn(None, 'mkdir', Q_path, Z_path)
@@ -10672,8 +10684,8 @@ def foreign_repos_uuid(sbox):
   wc2_uuid = svntest.actions.get_wc_uuid(wc_dir2)
 
   # Convenience variables for working copy paths.
-  zeta_path = os.path.join(wc_dir, 'A', 'D', 'G', 'zeta')
-  Z_path = os.path.join(wc_dir, 'A', 'Z')
+  zeta_path = sbox.ospath('A/D/G/zeta')
+  Z_path = sbox.ospath('A/Z')
 
   # Add new file and directory.
   zeta_contents = "This is the file 'zeta'.\n"
@@ -10745,13 +10757,13 @@ def foreign_repos_2_url(sbox):
   wc_dir2 = sbox2.wc_dir
 
   # Convenience variables for working copy paths.
-  Z_path = os.path.join(wc_dir, 'A', 'D', 'G', 'Z')
-  Q_path = os.path.join(wc_dir, 'A', 'Q')
-  H_path = os.path.join(wc_dir, 'A', 'D', 'H')
-  beta_path = os.path.join(wc_dir, 'A', 'B', 'E', 'beta')
-  alpha_path = os.path.join(wc_dir, 'A', 'B', 'E', 'alpha')
-  zeta_path = os.path.join(wc_dir, 'A', 'D', 'G', 'Z', 'zeta')
-  fred_path = os.path.join(wc_dir, 'A', 'C', 'fred')
+  Z_path = sbox.ospath('A/D/G/Z')
+  Q_path = sbox.ospath('A/Q')
+  H_path = sbox.ospath('A/D/H')
+  beta_path = sbox.ospath('A/B/E/beta')
+  alpha_path = sbox.ospath('A/B/E/alpha')
+  zeta_path = sbox.ospath('A/D/G/Z/zeta')
+  fred_path = sbox.ospath('A/C/fred')
 
   # First, "tag" the current state of the repository.
   svntest.main.run_svn(None, 'copy', sbox.repo_url + '/A',
@@ -10847,7 +10859,7 @@ def merge_added_subtree(sbox):
   # svn cp A A_COPY
   A_url = url + "/A"
   A_COPY_url = url + "/A_COPY"
-  A_path = os.path.join(wc_dir, "A")
+  A_path = sbox.ospath('A')
 
   svntest.actions.run_and_verify_svn("",["\n", "Committed revision 2.\n"], [],
                                      "cp", "-m", "", A_url, A_COPY_url)
@@ -10939,7 +10951,7 @@ def merge_unknown_url(sbox):
   wc_dir = sbox.wc_dir
 
   # remove a path from the repo and commit.
-  iota_path = os.path.join(wc_dir, 'iota')
+  iota_path = sbox.ospath('iota')
   svntest.actions.run_and_verify_svn(None, None, [], 'rm', iota_path)
   svntest.actions.run_and_verify_svn("", None, [],
                                      "ci", wc_dir, "-m", "log message")
@@ -10960,7 +10972,7 @@ def reverse_merge_away_all_mergeinfo(sbo
   wc_disk, wc_status = set_up_branch(sbox)
 
   # Some paths we'll care about
-  A_COPY_H_path = os.path.join(wc_dir, "A_COPY", "D", "H")
+  A_COPY_H_path = sbox.ospath('A_COPY/D/H')
 
   # Merge r4:8 from A/D/H into A_COPY/D/H.
   expected_output = wc.State(A_COPY_H_path, {
@@ -11050,19 +11062,31 @@ def reverse_merge_away_all_mergeinfo(sbo
 # merge'.  Specifically see
 # http://subversion.tigris.org/issues/show_bug.cgi?id=3067#desc5
 @SkipUnless(server_has_mergeinfo)
-@Issues(3138,3067)
+@Issues(3138,3067,4217)
 def dont_merge_revs_into_subtree_that_predate_it(sbox):
   "dont merge revs into a subtree that predate it"
 
+  #                              +-> merge -c7 A/D/H/nu@7 H_COPY/nu
+  #                              | +-> merge -c2 A/D/H H_COPY
+  #                              | | +-> merge A/D/H H_COPY
+  #                              | | |
+  # A/D/H      A----------------------
+  #     +-psi  +-M-------------M------
+  #     +-nu       A-D C---M-D
+  # H_COPY               C---------G-G
+  #     +-psi            +---------+-.
+  #     +-nu             +-------G---.
+  #            1 2 3 4 5 6 7 8 9 w w w
+
   # Create our good 'ole greek tree.
   sbox.build()
   wc_dir = sbox.wc_dir
 
   # Some paths we'll care about
-  psi_path     = os.path.join(wc_dir, "A", "D", "H", "psi")
-  nu_path      = os.path.join(wc_dir, "A", "D", "H", "nu")
-  H_COPY_path  = os.path.join(wc_dir, "H_COPY")
-  nu_COPY_path = os.path.join(wc_dir, "H_COPY", "nu")
+  psi_path     = sbox.ospath('A/D/H/psi')
+  nu_path      = sbox.ospath('A/D/H/nu')
+  H_COPY_path  = sbox.ospath('H_COPY')
+  nu_COPY_path = sbox.ospath('H_COPY/nu')
 
   expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
   expected_disk = svntest.main.greek_state.copy()
@@ -11168,13 +11192,12 @@ def dont_merge_revs_into_subtree_that_pr
                                      H_COPY_path)
 
   # H_COPY needs r6-9 applied while H_COPY/nu needs only 6,8-9.
-  # This means r6 will be done as a separate editor drive targeted
-  # on H_COPY.  But r6 was only the copy of A/D/H to H_COPY and
-  # so is a no-op and there will no notification for r6.
   svntest.actions.run_and_verify_svn(
     None,
     expected_merge_output(
-      [[6,9]], ['U    ' + os.path.join(H_COPY_path, "psi") + '\n',
+      [[7,9],  # Merge notification
+       [6,9]], # Mergeinfo notification
+               ['U    ' + os.path.join(H_COPY_path, "psi") + '\n',
                 'D    ' + os.path.join(H_COPY_path, "nu") + '\n',
                 ' U   ' + H_COPY_path + '\n',]),
     [], 'merge', sbox.repo_url + '/A/D/H', H_COPY_path, '--force')
@@ -11205,11 +11228,11 @@ def set_up_renamed_subtree(sbox):
   wc_dir = sbox.wc_dir
 
   # Some paths we'll care about
-  psi_path            = os.path.join(wc_dir, "A", "D", "H", "psi")
-  omega_path            = os.path.join(wc_dir, "A", "D", "H", "omega")
-  psi_moved_path      = os.path.join(wc_dir, "A", "D", "H", "psi_moved")
-  psi_COPY_moved_path = os.path.join(wc_dir, "H_COPY", "psi_moved")
-  H_COPY_path    = os.path.join(wc_dir, "H_COPY")
+  psi_path            = sbox.ospath('A/D/H/psi')
+  omega_path            = sbox.ospath('A/D/H/omega')
+  psi_moved_path      = sbox.ospath('A/D/H/psi_moved')
+  psi_COPY_moved_path = sbox.ospath('H_COPY/psi_moved')
+  H_COPY_path    = sbox.ospath('H_COPY')
 
   expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
   expected_disk = svntest.main.greek_state.copy()
@@ -11298,7 +11321,7 @@ def merge_chokes_on_renamed_subtrees(sbo
   wc_dir, expected_disk, expected_status = set_up_renamed_subtree(sbox)
 
   # Some paths we'll care about
-  psi_COPY_moved_path = os.path.join(wc_dir, "H_COPY", "psi_moved")
+  psi_COPY_moved_path = sbox.ospath('H_COPY/psi_moved')
 
 
   # Cherry harvest all available revsions from 'A/D/H/psi_moved' to
@@ -11330,13 +11353,13 @@ def dont_explicitly_record_implicit_merg
   sbox.build()
   wc_dir = sbox.wc_dir
 
-  A_path = os.path.join(sbox.wc_dir, 'A')
-  A_copy_path = os.path.join(sbox.wc_dir, 'A_copy')
-  A_copy2_path = os.path.join(sbox.wc_dir, 'A_copy2')
-  A_copy_mu_path = os.path.join(sbox.wc_dir, 'A_copy', 'mu')
-  A_copy2_mu_path = os.path.join(sbox.wc_dir, 'A_copy2', 'mu')
-  nu_path = os.path.join(sbox.wc_dir, 'A', 'D', 'H', 'nu')
-  nu_copy_path = os.path.join(sbox.wc_dir, 'A_copy', 'D', 'H', 'nu')
+  A_path = sbox.ospath('A')
+  A_copy_path = sbox.ospath('A_copy')
+  A_copy2_path = sbox.ospath('A_copy2')
+  A_copy_mu_path = sbox.ospath('A_copy/mu')
+  A_copy2_mu_path = sbox.ospath('A_copy2/mu')
+  nu_path = sbox.ospath('A/D/H/nu')
+  nu_copy_path = sbox.ospath('A_copy/D/H/nu')
 
   def _commit_and_update(rev, action):
     svntest.actions.run_and_verify_svn(None, None, [],
@@ -11681,8 +11704,8 @@ def merge_broken_link(sbox):
   # Create our good 'ole greek tree.
   sbox.build()
   wc_dir = sbox.wc_dir
-  src_path = os.path.join(wc_dir, 'A', 'B', 'E')
-  copy_path = os.path.join(wc_dir, 'A', 'B', 'E_COPY')
+  src_path = sbox.ospath('A/B/E')
+  copy_path = sbox.ospath('A/B/E_COPY')
   link_path = os.path.join(src_path, 'beta_link')
 
   os.symlink('beta_broken', link_path)
@@ -11716,16 +11739,16 @@ def subtree_merges_dont_intersect_with_t
   wc_disk, wc_status = set_up_branch(sbox, False, 2)
 
   # Some paths we'll care about.
-  A_COPY_path     = os.path.join(wc_dir, "A_COPY")
-  A_COPY_2_path   = os.path.join(wc_dir, "A_COPY_2")
-  H_COPY_2_path   = os.path.join(wc_dir, "A_COPY_2", "D", "H")
-  gamma_path      = os.path.join(wc_dir, "A", "D", "gamma")
-  psi_path        = os.path.join(wc_dir, "A", "D", "H", "psi")
-  psi_COPY_path   = os.path.join(wc_dir, "A_COPY", "D", "H", "psi")
-  gamma_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "gamma")
-  psi_COPY_path   = os.path.join(wc_dir, "A_COPY", "D", "H", "psi")
-  psi_COPY_2_path = os.path.join(wc_dir, "A_COPY_2", "D", "H", "psi")
-  rho_COPY_2_path = os.path.join(wc_dir, "A_COPY_2", "D", "G", "rho")
+  A_COPY_path     = sbox.ospath('A_COPY')
+  A_COPY_2_path   = sbox.ospath('A_COPY_2')
+  H_COPY_2_path   = sbox.ospath('A_COPY_2/D/H')
+  gamma_path      = sbox.ospath('A/D/gamma')
+  psi_path        = sbox.ospath('A/D/H/psi')
+  psi_COPY_path   = sbox.ospath('A_COPY/D/H/psi')
+  gamma_COPY_path = sbox.ospath('A_COPY/D/gamma')
+  psi_COPY_path   = sbox.ospath('A_COPY/D/H/psi')
+  psi_COPY_2_path = sbox.ospath('A_COPY_2/D/H/psi')
+  rho_COPY_2_path = sbox.ospath('A_COPY_2/D/G/rho')
 
   # Make a tweak to A/D/gamma and A/D/H/psi in r8.
   svntest.main.file_write(gamma_path, "New content")
@@ -12032,11 +12055,11 @@ def subtree_source_missing_in_requested_
   wc_disk, wc_status = set_up_branch(sbox, False, 1)
 
   # Some paths we'll care about.
-  psi_path        = os.path.join(wc_dir, "A", "D", "H", "psi")
-  omega_path      = os.path.join(wc_dir, "A", "D", "H", "omega")
-  A_COPY_path     = os.path.join(wc_dir, "A_COPY")
-  psi_COPY_path   = os.path.join(wc_dir, "A_COPY", "D", "H", "psi")
-  omega_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "H", "omega")
+  psi_path        = sbox.ospath('A/D/H/psi')
+  omega_path      = sbox.ospath('A/D/H/omega')
+  A_COPY_path     = sbox.ospath('A_COPY')
+  psi_COPY_path   = sbox.ospath('A_COPY/D/H/psi')
+  omega_COPY_path = sbox.ospath('A_COPY/D/H/omega')
 
   # r7 Delete A/D/H/psi.
   svntest.actions.run_and_verify_svn(None, None, [],
@@ -12353,7 +12376,7 @@ def subtrees_with_empty_mergeinfo(sbox):
   wc_dir, expected_disk, expected_status = set_up_renamed_subtree(sbox)
 
   # Some paths we'll care about
-  H_COPY_path = os.path.join(wc_dir, "H_COPY")
+  H_COPY_path = sbox.ospath('H_COPY')
 
   # Cherry harvest all available revsions from 'A/D/H' to 'H_COPY'.
   #
@@ -12406,10 +12429,10 @@ def commit_to_subtree_added_by_merge(sbo
   wc_dir = sbox.wc_dir
 
   # Some paths we'll care about
-  N_path        = os.path.join(wc_dir, "A", "D", "H", "N")
-  nu_path       = os.path.join(wc_dir, "A", "D", "H", "N", "nu")
-  nu_COPY_path  = os.path.join(wc_dir, "A_COPY", "D", "H", "N", "nu")
-  H_COPY_path   = os.path.join(wc_dir, "A_COPY", "D", "H")
+  N_path        = sbox.ospath('A/D/H/N')
+  nu_path       = sbox.ospath('A/D/H/N/nu')
+  nu_COPY_path  = sbox.ospath('A_COPY/D/H/N/nu')
+  H_COPY_path   = sbox.ospath('A_COPY/D/H')
 
   # Copy 'A' to 'A_COPY' in r2.
   wc_disk, wc_status = set_up_branch(sbox, True)
@@ -12532,7 +12555,8 @@ def svn_copy(s_rev, path1, path2):
                                      '-r', s_rev, path1, path2)
 
 def svn_merge(rev_range, source, target, lines=None, elides=[],
-              text_conflicts=0, prop_conflicts=0, tree_conflicts=0, args=[]):
+              text_conflicts=0, prop_conflicts=0, tree_conflicts=0, args=[],
+              resolved=[]):
   """Merge a single change from path SOURCE to path TARGET and verify the
   output and that there is no error.  (The changes made are not verified.)
 
@@ -12547,7 +12571,10 @@ def svn_merge(rev_range, source, target,
   TEXT_CONFLICTS, PROP_CONFLICTS and TREE_CONFLICTS specify the number of
   each kind of conflict to expect.
 
-  ARGS are additional arguments passed to svn merge."""
+  ARGS are additional arguments passed to svn merge.
+
+  RESOLVED contains a list of targets of which conflicts are resolved
+  during merging"""
 
   source = local_path(source)
   target = local_path(target)
@@ -12568,7 +12595,8 @@ def svn_merge(rev_range, source, target,
                                   elides=elides,
                                   text_conflicts=text_conflicts,
                                   prop_conflicts=prop_conflicts,
-                                  tree_conflicts=tree_conflicts)
+                                  tree_conflicts=tree_conflicts,
+                                  resolved=resolved)
   svntest.actions.run_and_verify_svn(None, exp_out, [],
                                      'merge', rev_arg, source, target, *args)
 
@@ -12665,9 +12693,9 @@ def subtree_merges_dont_cause_spurious_c
   wc_dir = sbox.wc_dir
 
   # Some paths we'll care about
-  rho_path      = os.path.join(wc_dir, "A", "D", "G", "rho")
-  A_COPY_path   = os.path.join(wc_dir, "A_COPY")
-  psi_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "H", "psi")
+  rho_path      = sbox.ospath('A/D/G/rho')
+  A_COPY_path   = sbox.ospath('A_COPY')
+  psi_COPY_path = sbox.ospath('A_COPY/D/H/psi')
 
   # Make a branch to merge to.
   wc_disk, wc_status = set_up_branch(sbox, False, 1)
@@ -12885,13 +12913,13 @@ def merge_target_and_subtrees_need_nonin
   wc_dir = sbox.wc_dir
 
   # Some paths we'll care about
-  nu_path          = os.path.join(wc_dir, "A", "D", "G", "nu")
-  A_COPY_path      = os.path.join(wc_dir, "A_COPY")
-  nu_COPY_path     = os.path.join(wc_dir, "A_COPY", "D", "G", "nu")
-  omega_COPY_path  = os.path.join(wc_dir, "A_COPY", "D", "H", "omega")
-  beta_COPY_path   = os.path.join(wc_dir, "A_COPY", "B", "E", "beta")
-  rho_COPY_path    = os.path.join(wc_dir, "A_COPY", "D", "G", "rho")
-  psi_COPY_path    = os.path.join(wc_dir, "A_COPY", "D", "H", "psi")
+  nu_path          = sbox.ospath('A/D/G/nu')
+  A_COPY_path      = sbox.ospath('A_COPY')
+  nu_COPY_path     = sbox.ospath('A_COPY/D/G/nu')
+  omega_COPY_path  = sbox.ospath('A_COPY/D/H/omega')
+  beta_COPY_path   = sbox.ospath('A_COPY/B/E/beta')
+  rho_COPY_path    = sbox.ospath('A_COPY/D/G/rho')
+  psi_COPY_path    = sbox.ospath('A_COPY/D/H/psi')
 
   # Make a branch to merge to.
   wc_disk, wc_status = set_up_branch(sbox, False, 1)
@@ -13110,7 +13138,10 @@ def merge_two_edits_to_same_prop(sbox):
   # Merge the first change, then the second, to source.
   svn_merge(rev3, A_COPY_path, A_path, [
       " C   %s\n" % mu_path,
-      ], prop_conflicts=1, args=['--allow-mixed-revisions'])
+      ], prop_conflicts=1,
+      args=['--allow-mixed-revisions',
+            '--accept=working'],
+      resolved=[mu_path])
   svn_merge(rev4, A_COPY_path, A_path, [
       " C   %s\n" % mu_path,
       ], prop_conflicts=1, args=['--allow-mixed-revisions'])
@@ -13195,10 +13226,10 @@ def merge_adds_mergeinfo_correctly(sbox)
   wc_disk, wc_status = set_up_branch(sbox, False, 2)
 
   # Some paths we'll care about
-  A_COPY_path   = os.path.join(wc_dir, "A_COPY")
-  D_COPY_path   = os.path.join(wc_dir, "A_COPY", "D")
-  A_COPY_2_path = os.path.join(wc_dir, "A_COPY_2")
-  D_COPY_2_path = os.path.join(wc_dir, "A_COPY_2", "D")
+  A_COPY_path   = sbox.ospath('A_COPY')
+  D_COPY_path   = sbox.ospath('A_COPY/D')
+  A_COPY_2_path = sbox.ospath('A_COPY_2')
+  D_COPY_2_path = sbox.ospath('A_COPY_2/D')
 
   # Update working copy to allow full inheritance and elision.
   svntest.actions.run_and_verify_svn(None, exp_noop_up_out(7), [],
@@ -13476,9 +13507,9 @@ def natural_history_filtering(sbox):
   wc_dir = sbox.wc_dir
 
   # Some paths we'll care about
-  A_COPY_path   = os.path.join(wc_dir, "A_COPY")
-  A_COPY_2_path = os.path.join(wc_dir, "A_COPY_2")
-  chi_path      = os.path.join(wc_dir, "A", "D", "H", "chi")
+  A_COPY_path   = sbox.ospath('A_COPY')
+  A_COPY_2_path = sbox.ospath('A_COPY_2')
+  chi_path      = sbox.ospath('A/D/H/chi')
 
   # r1-r6: Setup a 'trunk' (A) and a 'branch' (A_COPY).
   wc_disk, wc_status = set_up_branch(sbox, False, 1)
@@ -13751,9 +13782,9 @@ def subtree_gets_changes_even_if_ultimat
   wc_dir = sbox.wc_dir
 
   # Some paths we'll care about
-  H_COPY_path   = os.path.join(wc_dir, "A_COPY", "D", "H")
-  psi_path      = os.path.join(wc_dir, "A", "D", "H", "psi")
-  psi_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "H", "psi")
+  H_COPY_path   = sbox.ospath('A_COPY/D/H')
+  psi_path      = sbox.ospath('A/D/H/psi')
+  psi_COPY_path = sbox.ospath('A_COPY/D/H/psi')
 
   # r2 - r6: Copy A to A_COPY and then make some text changes under A.
   set_up_branch(sbox)
@@ -13864,10 +13895,10 @@ def no_self_referential_filtering_on_add
   wc_dir = sbox.wc_dir
 
   # Some paths we'll care about
-  C_COPY_path   = os.path.join(wc_dir, "A_COPY", "C")
-  A_path        = os.path.join(wc_dir, "A")
-  C_path        = os.path.join(wc_dir, "A", "C")
-  A_COPY_2_path = os.path.join(wc_dir, "A_COPY_2")
+  C_COPY_path   = sbox.ospath('A_COPY/C')
+  A_path        = sbox.ospath('A')
+  C_path        = sbox.ospath('A/C')
+  A_COPY_2_path = sbox.ospath('A_COPY_2')
 
   # r1-r7: Setup a 'trunk' and two 'branches'.
   wc_disk, wc_status = set_up_branch(sbox, False, 2)
@@ -14020,21 +14051,21 @@ def merge_range_prior_to_rename_source_e
   wc_dir = sbox.wc_dir
 
   # Some paths we'll care about
-  nu_path         = os.path.join(wc_dir, "A", "D", "H", "nu")
-  nu_moved_path   = os.path.join(wc_dir, "A", "D", "H", "nu_moved")
-  A_path          = os.path.join(wc_dir, "A")
-  alpha_path      = os.path.join(wc_dir, "A", "B", "E", "alpha")
-  A_COPY_path     = os.path.join(wc_dir, "A_COPY")
-  A_COPY_2_path   = os.path.join(wc_dir, "A_COPY_2")
-  B_COPY_path     = os.path.join(wc_dir, "A_COPY", "B")
-  B_COPY_2_path   = os.path.join(wc_dir, "A_COPY_2", "B")
-  alpha_COPY_path = os.path.join(wc_dir, "A_COPY", "B", "E", "alpha")
-  beta_COPY_path  = os.path.join(wc_dir, "A_COPY", "B", "E", "beta")
-  gamma_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "gamma")
-  rho_COPY_path   = os.path.join(wc_dir, "A_COPY", "D", "G", "rho")
-  omega_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "H", "omega")
-  psi_COPY_path   = os.path.join(wc_dir, "A_COPY", "D", "H", "psi")
-  nu_COPY_path    = os.path.join(wc_dir, "A_COPY", "D", "H", "nu")
+  nu_path         = sbox.ospath('A/D/H/nu')
+  nu_moved_path   = sbox.ospath('A/D/H/nu_moved')
+  A_path          = sbox.ospath('A')
+  alpha_path      = sbox.ospath('A/B/E/alpha')
+  A_COPY_path     = sbox.ospath('A_COPY')
+  A_COPY_2_path   = sbox.ospath('A_COPY_2')
+  B_COPY_path     = sbox.ospath('A_COPY/B')
+  B_COPY_2_path   = sbox.ospath('A_COPY_2/B')
+  alpha_COPY_path = sbox.ospath('A_COPY/B/E/alpha')
+  beta_COPY_path  = sbox.ospath('A_COPY/B/E/beta')
+  gamma_COPY_path = sbox.ospath('A_COPY/D/gamma')
+  rho_COPY_path   = sbox.ospath('A_COPY/D/G/rho')
+  omega_COPY_path = sbox.ospath('A_COPY/D/H/omega')
+  psi_COPY_path   = sbox.ospath('A_COPY/D/H/psi')
+  nu_COPY_path    = sbox.ospath('A_COPY/D/H/nu')
 
   # Setup our basic 'trunk' and 'branch':
   # r2 - Copy A to A_COPY
@@ -14364,8 +14395,8 @@ def set_up_natural_history_gap(sbox):
   wc_disk, wc_status = set_up_branch(sbox, False, 0)
 
   # Some paths we'll care about.
-  A_COPY_path = os.path.join(wc_dir, "A_COPY")
-  gamma_path  = os.path.join(wc_dir, "A", "D", "gamma")
+  A_COPY_path = sbox.ospath('A_COPY')
+  gamma_path  = sbox.ospath('A/D/gamma')
 
   # r6: Delete 'A'
   exit_code, out, err = svntest.actions.run_and_verify_svn(
@@ -14434,7 +14465,7 @@ def dont_merge_gaps_in_history(sbox):
   set_up_natural_history_gap(sbox)
 
   # Some paths we'll care about.
-  A_COPY_path = os.path.join(wc_dir, "A_COPY")
+  A_COPY_path = sbox.ospath('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
@@ -14541,7 +14572,7 @@ def handle_gaps_in_implicit_mergeinfo(sb
   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")
+  A_COPY_path = sbox.ospath('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, {
@@ -14664,9 +14695,9 @@ def mergeinfo_deleted_by_a_merge_should_
   wc_dir = sbox.wc_dir
 
   # Some paths we'll care about
-  D_COPY_path   = os.path.join(wc_dir, "A_COPY", "D")
-  A_COPY_path   = os.path.join(wc_dir, "A_COPY")
-  A_COPY_2_path = os.path.join(wc_dir, "A_COPY_2")
+  D_COPY_path   = sbox.ospath('A_COPY/D')
+  A_COPY_path   = sbox.ospath('A_COPY')
+  A_COPY_2_path = sbox.ospath('A_COPY_2')
 
   # r2 - r6: Copy A to A_COPY and then make some text changes under A.
   wc_disk, wc_status = set_up_branch(sbox)
@@ -14786,9 +14817,9 @@ def noop_file_merge(sbox):
   wc_dir = sbox.wc_dir
 
   # Some paths we'll care about
-  A_COPY_path    = os.path.join(wc_dir, "A_COPY")
-  beta_COPY_path = os.path.join(wc_dir, "A_COPY", "B", "E", "beta")
-  chi_COPY_path  = os.path.join(wc_dir, "A_COPY", "D", "H", "chi")
+  A_COPY_path    = sbox.ospath('A_COPY')
+  beta_COPY_path = sbox.ospath('A_COPY/B/E/beta')
+  chi_COPY_path  = sbox.ospath('A_COPY/D/H/chi')
 
   # r2 - r6: Copy A to A_COPY and then make some text changes under A.
   wc_disk, wc_status = set_up_branch(sbox)
@@ -14935,15 +14966,15 @@ def record_only_merge(sbox):
   wc_disk, wc_status = set_up_branch(sbox)
 
   # Some paths we'll care about
-  nu_path         = os.path.join(wc_dir, "A", "C", "nu")
-  A_COPY_path     = os.path.join(wc_dir, "A_COPY")
-  A2_path         = os.path.join(wc_dir, "A2")
-  Z_path          = os.path.join(wc_dir, "A", "B", "Z")
-  Z_COPY_path     = os.path.join(wc_dir, "A_COPY", "B", "Z")
-  rho_COPY_path   = os.path.join(wc_dir, "A_COPY", "D", "G", "rho")
-  omega_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "H", "omega")
-  H_COPY_path     = os.path.join(wc_dir, "A_COPY", "D", "H")
-  nu_COPY_path    = os.path.join(wc_dir, "A_COPY", "C", "nu")
+  nu_path         = sbox.ospath('A/C/nu')
+  A_COPY_path     = sbox.ospath('A_COPY')
+  A2_path         = sbox.ospath('A2')
+  Z_path          = sbox.ospath('A/B/Z')
+  Z_COPY_path     = sbox.ospath('A_COPY/B/Z')
+  rho_COPY_path   = sbox.ospath('A_COPY/D/G/rho')
+  omega_COPY_path = sbox.ospath('A_COPY/D/H/omega')
+  H_COPY_path     = sbox.ospath('A_COPY/D/H')
+  nu_COPY_path    = sbox.ospath('A_COPY/C/nu')
 
   # r7 - Copy the branch A_COPY@2 to A2 and update the WC.
   svntest.actions.run_and_verify_svn(None, None, [],
@@ -15129,8 +15160,8 @@ def merge_automatic_conflict_resolution(
 
 
   # Some paths we'll care about
-  A_COPY_path   = os.path.join(wc_dir, "A_COPY")
-  psi_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "H", "psi")
+  A_COPY_path   = sbox.ospath('A_COPY')
+  psi_COPY_path = sbox.ospath('A_COPY/D/H/psi')
 
   # r7 - Make a change on A_COPY that will conflict with r3 on A
   svntest.main.file_write(psi_COPY_path, "BASE.\n")
@@ -15216,7 +15247,7 @@ def merge_automatic_conflict_resolution(
                                      'revert', '--recursive', wc_dir)
 
   # Test --accept mine-conflict and mine-full
-  expected_output = wc.State(A_COPY_path, {'D/H/psi' : Item(status='U ')})
+  expected_output = wc.State(A_COPY_path, {'D/H/psi' : Item(status='C ')})
   expected_disk.tweak('D/H/psi', contents="BASE.\n")
   expected_status.tweak('D/H/psi', status='  ')
   svntest.actions.run_and_verify_merge(A_COPY_path, '2', '3',
@@ -15251,7 +15282,7 @@ def merge_automatic_conflict_resolution(
                                      'revert', '--recursive', wc_dir)
 
   # Test --accept theirs-conflict and theirs-full
-  expected_output = wc.State(A_COPY_path, {'D/H/psi' : Item(status='U ')})
+  expected_output = wc.State(A_COPY_path, {'D/H/psi' : Item(status='C ')})
   expected_disk.tweak('D/H/psi', contents="New content")
   expected_status.tweak('D/H/psi', status='M ')
   svntest.actions.run_and_verify_merge(A_COPY_path, '2', '3',
@@ -15285,7 +15316,7 @@ def merge_automatic_conflict_resolution(
   svntest.actions.run_and_verify_svn(None, None, [],
                                      'revert', '--recursive', wc_dir)
   # Test --accept base
-  expected_output = wc.State(A_COPY_path, {'D/H/psi' : Item(status='U ')})
+  expected_output = wc.State(A_COPY_path, {'D/H/psi' : Item(status='C ')})
   expected_elision_output = wc.State(A_COPY_path, {
     })
   expected_disk.tweak('D/H/psi', contents="This is the file 'psi'.\n")
@@ -15315,10 +15346,10 @@ def skipped_files_get_correct_mergeinfo(
   wc_dir = sbox.wc_dir
 
   # Some paths we'll care about
-  A_COPY_path   = os.path.join(wc_dir, "A_COPY")
-  H_COPY_path   = os.path.join(wc_dir, "A_COPY", "D", "H")
-  psi_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "H", "psi")
-  psi_path      = os.path.join(wc_dir, "A", "D", "H", "psi")
+  A_COPY_path   = sbox.ospath('A_COPY')
+  H_COPY_path   = sbox.ospath('A_COPY/D/H')
+  psi_COPY_path = sbox.ospath('A_COPY/D/H/psi')
+  psi_path      = sbox.ospath('A/D/H/psi')
 
   # Setup our basic 'trunk' and 'branch':
   # r2 - Copy A to A_COPY
@@ -15432,7 +15463,7 @@ def committed_case_only_move_and_revert(
   wc_disk, wc_status = set_up_branch(sbox, True)
 
   # Some paths we'll care about
-  A_COPY_path = os.path.join(wc_dir, "A_COPY")
+  A_COPY_path = sbox.ospath('A_COPY')
 
   # r3: A case-only file rename on the server
   svntest.actions.run_and_verify_svn(None,
@@ -15592,8 +15623,8 @@ def merge_into_wc_for_deleted_branch(sbo
   wc_disk, wc_status = set_up_branch(sbox)
 
   # Some paths we'll care about
-  A_COPY_path = os.path.join(wc_dir, "A_COPY")
-  gamma_path  = os.path.join(wc_dir, "A", "D", "gamma")
+  A_COPY_path = sbox.ospath('A_COPY')
+  gamma_path  = sbox.ospath('A/D/gamma')
 
   # r7 - Delete the branch on the repository, obviously it still
   # exists in our WC.
@@ -15704,17 +15735,17 @@ def foreign_repos_del_and_props(sbox):
 
   svntest.actions.run_and_verify_svn(None, None, [], 'propset',
                                       'svn:eol-style', 'native',
-                                      os.path.join(wc_dir, 'iota'))
+                                      sbox.ospath('iota'))
 
   svntest.actions.run_and_verify_svn(None, None, [], 'cp',
-                                      os.path.join(wc_dir, 'A/D'),
-                                      os.path.join(wc_dir, 'D'))
+                                      sbox.ospath('A/D'),
+                                      sbox.ospath('D'))
 
   svntest.actions.run_and_verify_svn(None, None, [], 'rm',
-                                      os.path.join(wc_dir, 'A/D'),
-                                      os.path.join(wc_dir, 'D/G'))
+                                      sbox.ospath('A/D'),
+                                      sbox.ospath('D/G'))
 
-  new_file = os.path.join(wc_dir, 'new-file')
+  new_file = sbox.ospath('new-file')
   svntest.main.file_write(new_file, 'new-file')
   svntest.actions.run_and_verify_svn(None, None, [], 'add', new_file)
 
@@ -15784,8 +15815,8 @@ def immediate_depth_merge_creates_minima
   wc_dir = sbox.wc_dir
   wc_disk, wc_status = set_up_branch(sbox)
 
-  B_path      = os.path.join(wc_dir, "A", "B")
-  B_COPY_path = os.path.join(wc_dir, "A_COPY", "B")
+  B_path      = sbox.ospath('A/B')
+  B_COPY_path = sbox.ospath('A_COPY/B')
 
 
   svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
@@ -15856,9 +15887,9 @@ def record_only_merge_creates_self_refer
   wc_dir = sbox.wc_dir
 
   # Some paths we'll care about
-  mu_path       = os.path.join(wc_dir, 'A', 'mu')
-  A_path        = os.path.join(wc_dir, 'A')
-  A_branch_path = os.path.join(wc_dir, 'A-branch')
+  mu_path       = sbox.ospath('A/mu')
+  A_path        = sbox.ospath('A')
+  A_branch_path = sbox.ospath('A-branch')
 
   # Make a change to A/mu in r2.
   svntest.main.file_write(mu_path, "Trunk edit\n")
@@ -15945,11 +15976,11 @@ def dav_skelta_mode_causes_spurious_conf
   wc_dir = sbox.wc_dir
 
   # Some paths we'll care about
-  mu_path       = os.path.join(wc_dir, "A", "mu")
-  A_path        = os.path.join(wc_dir, "A")
-  C_path        = os.path.join(wc_dir, "A", "C")
-  A_branch_path = os.path.join(wc_dir, "A-branch")
-  C_branch_path = os.path.join(wc_dir, "A-branch", "C")
+  mu_path       = sbox.ospath('A/mu')
+  A_path        = sbox.ospath('A')
+  C_path        = sbox.ospath('A/C')
+  A_branch_path = sbox.ospath('A-branch')
+  C_branch_path = sbox.ospath('A-branch/C')
 
   # r2 - Set some intial properties:
   #
@@ -16205,11 +16236,11 @@ def merge_with_os_deleted_subtrees(sbox)
   set_up_branch(sbox)
 
   # Some paths we'll care about
-  A_COPY_path   = os.path.join(wc_dir, "A_COPY")
-  C_COPY_path   = os.path.join(wc_dir, "A_COPY", "C")
-  psi_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "H", "psi")
-  mu_COPY_path  = os.path.join(wc_dir, "A_COPY", "mu")
-  G_COPY_path   = os.path.join(wc_dir, "A_COPY", "D", "G")
+  A_COPY_path   = sbox.ospath('A_COPY')
+  C_COPY_path   = sbox.ospath('A_COPY/C')
+  psi_COPY_path = sbox.ospath('A_COPY/D/H/psi')
+  mu_COPY_path  = sbox.ospath('A_COPY/mu')
+  G_COPY_path   = sbox.ospath('A_COPY/D/G')
 
   # Remove several subtrees from disk.
   svntest.main.safe_rmtree(C_COPY_path)
@@ -16289,12 +16320,12 @@ def no_self_referential_or_nonexistent_i
   set_up_branch(sbox, nbr_of_branches=1)
 
   # Some paths we'll care about
-  nu_path      = os.path.join(wc_dir, "A", "C", "nu")
-  nu_COPY_path = os.path.join(wc_dir, "A_COPY", "C", "nu")
-  J_path       = os.path.join(wc_dir, "A", "D", "J")
-  J_COPY_path  = os.path.join(wc_dir, "A_COPY", "D", "J")
-  zeta_path    = os.path.join(wc_dir, "A", "D", "J", "zeta")
-  A_COPY_path  = os.path.join(wc_dir, "A_COPY")
+  nu_path      = sbox.ospath('A/C/nu')
+  nu_COPY_path = sbox.ospath('A_COPY/C/nu')
+  J_path       = sbox.ospath('A/D/J')
+  J_COPY_path  = sbox.ospath('A_COPY/D/J')
+  zeta_path    = sbox.ospath('A/D/J/zeta')
+  A_COPY_path  = sbox.ospath('A_COPY')
 
   # r7 - Add the file A/C/nu
   svntest.main.file_write(nu_path, "This is the file 'nu'.\n")
@@ -16421,9 +16452,9 @@ def subtree_merges_inherit_invalid_worki
   set_up_branch(sbox, nbr_of_branches=1)
 
   # Some paths we'll care about
-  nu_path      = os.path.join(wc_dir, "A", "C", "nu")
-  nu_COPY_path = os.path.join(wc_dir, "A_COPY", "C", "nu")
-  A_COPY_path  = os.path.join(wc_dir, "A_COPY")
+  nu_path      = sbox.ospath('A/C/nu')
+  nu_COPY_path = sbox.ospath('A_COPY/C/nu')
+  A_COPY_path  = sbox.ospath('A_COPY')
 
   # r7 - Add the file A/C/nu
   svntest.main.file_write(nu_path, "This is the file 'nu'.\n")
@@ -16487,8 +16518,8 @@ def merge_change_to_file_with_executable
   wc_dir = sbox.wc_dir
   trunk_url = sbox.repo_url + '/A/B/E'
 
-  alpha_path = os.path.join(wc_dir, "A", "B", "E", "alpha")
-  beta_path = os.path.join(wc_dir, "A", "B", "E", "beta")
+  alpha_path = sbox.ospath('A/B/E/alpha')
+  beta_path = sbox.ospath('A/B/E/beta')
 
   # Force one of the files to be a binary type
   svntest.actions.run_and_verify_svn(None, None, [],
@@ -16537,8 +16568,8 @@ def merge_change_to_file_with_executable
                                      sbox.repo_url + '/branch', wc_dir)
 
   # Recalculate the paths
-  alpha_path = os.path.join(wc_dir, "alpha")
-  beta_path = os.path.join(wc_dir, "beta")
+  alpha_path = sbox.ospath('alpha')
+  beta_path = sbox.ospath('beta')
 
   expected_output = wc.State(wc_dir, {
     'beta'              : Item(status='U '),
@@ -16604,7 +16635,7 @@ def dry_run_merge_conflicting_binary(sbo
   # Add a binary file to the project
   theta_contents = open(os.path.join(sys.path[0], "theta.bin"), 'rb').read()
   # Write PNG file data into 'A/theta'.
-  theta_path = os.path.join(wc_dir, 'A', 'theta')
+  theta_path = sbox.ospath('A/theta')
   svntest.main.file_write(theta_path, theta_contents, 'wb')
 
   svntest.main.run_svn(None, 'add', theta_path)
@@ -16740,10 +16771,10 @@ def merge_adds_subtree_with_mergeinfo(sb
   wc_dir = sbox.wc_dir
   wc_disk, wc_status = set_up_branch(sbox, False, 2)
 
-  A_path       = os.path.join(wc_dir, 'A')
-  nu_path      = os.path.join(wc_dir, 'A', 'C', 'nu')
-  nu_COPY_path = os.path.join(wc_dir, 'A_COPY', 'C', 'nu')
-  A_COPY2_path = os.path.join(wc_dir, 'A_COPY_2')
+  A_path       = sbox.ospath('A')
+  nu_path      = sbox.ospath('A/C/nu')
+  nu_COPY_path = sbox.ospath('A_COPY/C/nu')
+  A_COPY2_path = sbox.ospath('A_COPY_2')
 
   # r8 - Add the file A_COPY/C/nu.
   svntest.main.file_write(nu_COPY_path, "This is the file 'nu'.\n")
@@ -16868,10 +16899,10 @@ def reverse_merge_adds_subtree(sbox):
   wc_dir = sbox.wc_dir
   wc_disk, wc_status = set_up_branch(sbox)
 
-  A_path       = os.path.join(wc_dir, 'A')
-  chi_path     = os.path.join(wc_dir, 'A', 'D', 'H', 'chi')
-  A_COPY_path  = os.path.join(wc_dir, 'A_COPY')
-  H_COPY_path  = os.path.join(wc_dir, 'A_COPY', 'D', 'H')
+  A_path       = sbox.ospath('A')
+  chi_path     = sbox.ospath('A/D/H/chi')
+  A_COPY_path  = sbox.ospath('A_COPY')
+  H_COPY_path  = sbox.ospath('A_COPY/D/H')
 
   # r7 - Delete A\D\H\chi
   svntest.actions.run_and_verify_svn(None, None, [], 'delete', chi_path)
@@ -17002,9 +17033,9 @@ def merged_deletion_causes_tree_conflict
   sbox.build()
   wc_dir = sbox.wc_dir
 
-  A_path        = os.path.join(wc_dir, 'A')
-  psi_path      = os.path.join(wc_dir, 'A', 'D', 'H', 'psi')
-  H_branch_path = os.path.join(wc_dir, 'branch', 'D', 'H')
+  A_path        = sbox.ospath('A')
+  psi_path      = sbox.ospath('A/D/H/psi')
+  H_branch_path = sbox.ospath('branch/D/H')
 
   # r2 - Set svn:eol-style native on A/D/H/psi
   svntest.actions.run_and_verify_svn(None, None, [], 'ps', 'svn:eol-style',
@@ -17075,9 +17106,9 @@ def record_only_merge_adds_new_subtree_m
   wc_dir = sbox.wc_dir
   wc_disk, wc_status = set_up_branch(sbox)
 
-  psi_path      = os.path.join(wc_dir, 'A', 'D', 'H', 'psi')
-  psi_COPY_path = os.path.join(wc_dir, 'A_COPY', 'D', 'H', 'psi')
-  H_COPY2_path  = os.path.join(wc_dir, 'A_COPY_2', 'D', 'H')
+  psi_path      = sbox.ospath('A/D/H/psi')
+  psi_COPY_path = sbox.ospath('A_COPY/D/H/psi')
+  H_COPY2_path  = sbox.ospath('A_COPY_2/D/H')
 
   # r7 - Copy ^/A_COPY to ^/A_COPY_2
   svntest.actions.run_and_verify_svn(None, None, [],
@@ -17160,8 +17191,8 @@ def noninheritable_mergeinfo_test_set_up
   sbox.build()
   wc_dir = sbox.wc_dir
 
-  lambda_path   = os.path.join(wc_dir, 'A', 'B', 'lambda')
-  B_branch_path = os.path.join(wc_dir, 'branch', 'B')
+  lambda_path   = sbox.ospath('A/B/lambda')
+  B_branch_path = sbox.ospath('branch/B')
 
   # r2 - Branch ^/A to ^/branch.
   svntest.main.run_svn(None, 'copy', sbox.repo_url + '/A',
@@ -17213,7 +17244,7 @@ def noninheritable_mergeinfo_test_set_up
 def unnecessary_noninheritable_mergeinfo_missing_subtrees(sbox):
   "missing subtrees untouched by infinite depth merge"
 
-  B_branch_path = os.path.join(sbox.wc_dir, 'branch', 'B')
+  B_branch_path = sbox.ospath('branch/B')
 
   # Setup a simple branch to which
   expected_output, expected_mergeinfo_output, expected_elision_output, \
@@ -17257,8 +17288,8 @@ def unnecessary_noninheritable_mergeinfo
 def unnecessary_noninheritable_mergeinfo_shallow_merge(sbox):
   "shallow merge reaches all necessary subtrees"
 
-  B_branch_path = os.path.join(sbox.wc_dir, 'branch', 'B')
-  E_path        = os.path.join(sbox.wc_dir, 'A', 'B', 'E')
+  B_branch_path = sbox.ospath('branch/B')
+  E_path        = sbox.ospath('A/B/E')
 
   # Setup a simple branch to which
   expected_output, expected_mergeinfo_output, expected_elision_output, \
@@ -17417,13 +17448,13 @@ def merge_source_with_replacement(sbox):
   wc_dir = sbox.wc_dir
 
   # Some paths we'll care about.
-  A_path          = os.path.join(sbox.wc_dir, 'A')
-  omega_path      = os.path.join(sbox.wc_dir, 'A', 'D', 'H', 'omega')
-  A_COPY_path     = os.path.join(sbox.wc_dir, 'A_COPY')

[... 297 lines stripped ...]