subversion-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From hwri...@apache.org
Subject svn commit: r1331076 [6/8] - in /subversion/branches/ev2-export: ./ build/generator/ build/generator/templates/ notes/ notes/merge-tracking/ subversion/bindings/javahl/src/org/apache/subversion/javahl/ subversion/include/ subversion/include/private/ su...
Date Thu, 26 Apr 2012 20:37:20 GMT
Modified: subversion/branches/ev2-export/subversion/tests/cmdline/merge_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/merge_tests.py?rev=1331076&r1=1331075&r2=1331076&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/tests/cmdline/merge_tests.py (original)
+++ subversion/branches/ev2-export/subversion/tests/cmdline/merge_tests.py Thu Apr 26 20:37:17 2012
@@ -205,8 +205,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 +234,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 +440,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 +569,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 +642,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 +760,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 +795,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 +872,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 +1014,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 +1145,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 +1153,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 +1248,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 +1342,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 +1351,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 +1418,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 +1539,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 +1603,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 +1723,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 +1891,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 +1911,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 +1951,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 +1980,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 +1999,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 +2050,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 +2169,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 +2315,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 +2364,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 +2477,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 +2591,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 +2708,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 +2743,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 +2764,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 +2798,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 +2852,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 +2865,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 +2929,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 +2976,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 +2996,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 +3058,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 +3149,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 +3259,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 +3351,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 +3628,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 +3767,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 +3981,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 +4100,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 +4362,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)
 
@@ -4587,7 +4587,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 +4596,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 +4605,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 +4614,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 +4650,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 +4988,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 +5242,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 +5355,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 +5441,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 +5471,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 +5634,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 +6129,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 +6182,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 +6320,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 +6411,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 +6423,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 +6492,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 +6514,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')
 
@@ -6772,7 +6772,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 +6892,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 +7005,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 +7052,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 +7161,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 +7290,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 +7725,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)
@@ -8019,9 +8019,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 +8184,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 +8434,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 +8502,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 +8628,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 +8815,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 +8929,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 +9041,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 +9153,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 +9233,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 +9349,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 +9443,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 +9486,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 +9598,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 +10030,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 +10338,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 +10508,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 +10559,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 +10672,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 +10745,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 +10847,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 +10939,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 +10960,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, {
@@ -11059,10 +11059,10 @@ def dont_merge_revs_into_subtree_that_pr
   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()
@@ -11205,11 +11205,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 +11298,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 +11330,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 +11681,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 +11716,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 +12032,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 +12353,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 +12406,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)
@@ -12665,9 +12665,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 +12885,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)
@@ -13195,10 +13195,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 +13476,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 +13751,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 +13864,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 +14020,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 +14364,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 +14434,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 +14541,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 +14664,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 +14786,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 +14935,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 +15129,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")
@@ -15315,10 +15315,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 +15432,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 +15592,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 +15704,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 +15784,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 +15856,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 +15945,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 +16205,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 +16289,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 +16421,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 +16487,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 +16537,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 +16604,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 +16740,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 +16868,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 +17002,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 +17075,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 +17160,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 +17213,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 +17257,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 +17417,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')
-  beta_COPY_path  = os.path.join(sbox.wc_dir, 'A_COPY', 'B', 'E', 'beta')
-  psi_COPY_path   = os.path.join(sbox.wc_dir, 'A_COPY', 'D', 'H', 'psi')
-  rho_COPY_path   = os.path.join(sbox.wc_dir, 'A_COPY', 'D', 'G', 'rho')
-  omega_COPY_path = os.path.join(sbox.wc_dir, 'A_COPY', 'D', 'H', 'omega')
+  A_path          = sbox.ospath('A')
+  omega_path      = sbox.ospath('A/D/H/omega')
+  A_COPY_path     = sbox.ospath('A_COPY')
+  beta_COPY_path  = sbox.ospath('A_COPY/B/E/beta')
+  psi_COPY_path   = sbox.ospath('A_COPY/D/H/psi')
+  rho_COPY_path   = sbox.ospath('A_COPY/D/G/rho')
+  omega_COPY_path = sbox.ospath('A_COPY/D/H/omega')
   
   # branch A@1 to A_COPY in r2, then make a few edits under A in r3-6:  
   wc_disk, wc_status = set_up_branch(sbox)
@@ -17479,13 +17479,13 @@ def reverse_merge_with_rename(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, 'trunk', 'D', 'H', 'omega')
-  A_COPY_path     = os.path.join(sbox.wc_dir, 'A_COPY')
-  beta_COPY_path  = os.path.join(sbox.wc_dir, 'A_COPY', 'B', 'E', 'beta')
-  psi_COPY_path   = os.path.join(sbox.wc_dir, 'A_COPY', 'D', 'H', 'psi')
-  rho_COPY_path   = os.path.join(sbox.wc_dir, 'A_COPY', 'D', 'G', 'rho')
-  omega_COPY_path = os.path.join(sbox.wc_dir, 'A_COPY', 'D', 'H', 'omega')
+  A_path          = sbox.ospath('A')
+  omega_path      = sbox.ospath('trunk/D/H/omega')
+  A_COPY_path     = sbox.ospath('A_COPY')
+  beta_COPY_path  = sbox.ospath('A_COPY/B/E/beta')
+  psi_COPY_path   = sbox.ospath('A_COPY/D/H/psi')
+  rho_COPY_path   = sbox.ospath('A_COPY/D/G/rho')
+  omega_COPY_path = sbox.ospath('A_COPY/D/H/omega')
 
   # branch A@1 to A_COPY in r2, then make a few edits under A in r3-6:  
   wc_disk, wc_status = set_up_branch(sbox)
@@ -17550,6 +17550,251 @@ def reverse_merge_with_rename(sbox):
                                      'merge', sbox.repo_url + '/trunk',
                                      A_COPY_path, '-r9:1')
 
+#----------------------------------------------------------------------
+# Test for issue #4166 'multiple merge editor drives which add then
+# delete a subtree fail'.
+@SkipUnless(server_has_mergeinfo)
+@Issue(4166)
+def merge_adds_then_deletes_subtree(sbox):
+  "merge adds then deletes subtree"
+
+  # Some paths we'll care about.
+  A_path         = sbox.ospath('A')
+  nu_path        = sbox.ospath('A/C/nu')
+  C_branch_path  = sbox.ospath('branch/C')
+  nu_branch_path = sbox.ospath('branch/C/nu')
+
+  sbox.build()
+  wc_dir = sbox.wc_dir
+
+  # Make a branch.
+  svntest.actions.run_and_verify_svn(None, None, [], 'copy',
+                                     sbox.repo_url + '/A',
+                                     sbox.repo_url + '/branch',
+                                     '-m', 'Make a branch.')
+
+  # On the branch parent: Add a file in r3 and then delete it in r4.
+  svntest.main.file_write(nu_path, "This is the file 'nu'.\n")
+  svntest.actions.run_and_verify_svn(None, None, [], 'add', nu_path)
+  svntest.actions.run_and_verify_svn(None, None, [], 'ci', wc_dir,
+                                     '-m', 'Add a file')
+  svntest.actions.run_and_verify_svn(None, None, [], 'delete', nu_path)
+  svntest.actions.run_and_verify_svn(None, None, [], 'ci', wc_dir,
+                                     '-m', 'Delete a file')
+
+  # Merge r3 and r4 from ^/A/C to branch/C as part of one merge
+  # command, but as separate editor drives, i.e. 'c3,4 vs. -r2:4.
+  # These should be equivalent but the former was failing with:
+  #
+  #   >svn merge ^/A/C branch\C -c3,4
+  #   --- Merging r3 into 'branch\C':
+  #   A    branch\C\nu
+  #   --- Recording mergeinfo for merge of r3 into 'branch\C':
+  #    U   branch\C
+  #   --- Merging r4 into 'branch\C':
+  #   D    branch\C\nu
+  #   --- Recording mergeinfo for merge of r4 into 'branch\C':
+  #    G   branch\C
+  #   ..\..\..\subversion\svn\util.c:913: (apr_err=155010)
+  #   ..\..\..\subversion\libsvn_client\merge.c:10873: (apr_err=155010)
+  #   ..\..\..\subversion\libsvn_client\merge.c:10837: (apr_err=155010)
+  #   ..\..\..\subversion\libsvn_client\merge.c:8994: (apr_err=155010)
+  #   ..\..\..\subversion\libsvn_client\merge.c:7923: (apr_err=155010)
+  #   ..\..\..\subversion\libsvn_client\mergeinfo.c:257: (apr_err=155010)
+  #   ..\..\..\subversion\libsvn_client\mergeinfo.c:97: (apr_err=155010)
+  #   ..\..\..\subversion\libsvn_wc\props.c:2003: (apr_err=155010)
+  #   ..\..\..\subversion\libsvn_wc\props.c:2024: (apr_err=155010)
+  #   ..\..\..\subversion\libsvn_wc\wc_db.c:11473: (apr_err=155010)
+  #   ..\..\..\subversion\libsvn_wc\wc_db.c:7247: (apr_err=155010)
+  #   ..\..\..\subversion\libsvn_wc\wc_db.c:7232: (apr_err=155010)
+  #   svn: E155010: The node 'C:\SVN\src-trunk\Debug\subversion\tests
+  #   \cmdline\svn-test-work\working_copies\merge_tests-128\branch\C\nu'
+  #   was not found.
+  svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+  svntest.actions.run_and_verify_svn(
+    None,
+    expected_merge_output([[3],[4]],
+                          ['A    ' + nu_branch_path + '\n',
+                           'D    ' + nu_branch_path + '\n',
+                           ' U   ' + C_branch_path + '\n',
+                           ' G   ' + C_branch_path + '\n',]),
+    [], 'merge', '-c3,4', sbox.repo_url + '/A/C', C_branch_path)
+
+#----------------------------------------------------------------------
+# Test for issue #4169 'added subtrees with non-inheritable mergeinfo
+# cause spurious subtree mergeinfo'.
+@SkipUnless(server_has_mergeinfo)
+@Issue(4169)
+def merge_with_added_subtrees_with_mergeinfo(sbox):
+  "merge with added subtrees with mergeinfo"
+
+  # Some paths we'll care about.
+  A_path      = sbox.ospath('A')
+  Y_path      = sbox.ospath('A/C/X/Y')
+  Z_path      = sbox.ospath('A/C/X/Y/Z')
+  nu_path     = sbox.ospath('A/C/X/Y/Z/nu')
+  A_COPY_path = sbox.ospath('A_COPY')
+  Y_COPY_path = sbox.ospath('A_COPY/C/X/Y')
+  W_COPY_path = sbox.ospath('A_COPY/C/X/Y/Z/W')
+  A_COPY2_path = sbox.ospath('A_COPY_2')
+
+  sbox.build()
+  wc_dir = sbox.wc_dir
+
+  # Make two branches of ^/A and then make a few edits under A in r4-7:
+  wc_disk, wc_status = set_up_branch(sbox, nbr_of_branches=2)
+
+  # r8 - Add a subtree under A.
+  svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', '--parents',
+                                     Z_path)
+  svntest.main.file_write(nu_path, "This is the file 'nu'.\n")
+  svntest.actions.run_and_verify_svn(None, None, [], 'add', nu_path)
+  svntest.actions.run_and_verify_svn(None, None, [], 'ci', wc_dir,
+                                     '-m', 'Add a subtree on our "trunk"')
+
+  # r9 - Sync ^/A to the first branch A_COPY.
+  svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+  svntest.actions.run_and_verify_svn(None, None, [], 'merge',
+                                     sbox.repo_url + '/A', A_COPY_path)
+  svntest.actions.run_and_verify_svn(None, None, [], 'ci', wc_dir,
+                                     '-m', 'Sync ^/A to ^/A_COPY')
+
+  # r10 - Make some edits on the first branch.
+  svntest.actions.run_and_verify_svn(None, None, [], 'ps', 'branch-prop-foo',
+                                     'bar', Y_COPY_path)
+  svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', W_COPY_path)
+  svntest.actions.run_and_verify_svn(None, None, [], 'ci', wc_dir,
+                                     '-m', 'Make some edits on "branch 1"')
+
+  # r11 - Cherry-pick r10 on the first branch back to A, but
+  # do so at depth=empty so non-inheritable mergeinfo is created.
+  svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+  svntest.actions.run_and_verify_svn(None, None, [],
+                                     'merge', '-c10', '--depth=empty',
+                                     sbox.repo_url + '/A_COPY/C/X/Y', Y_path)
+  svntest.actions.run_and_verify_svn(
+    None, None, [], 'ci', wc_dir,
+    '-m', 'Depth empty subtree cherry pick from "branch 1" to "trunk"')
+
+  # Sync ^/A to the second branch A_COPY_2.
+  #
+  # Previously this failed because spurious mergeinfo was created on
+  # A_COPY_2/C/X/Y/Z:
+  #
+  #   >svn merge ^^/A A_COPY_2
+  #   --- Merging r3 through r11 into 'A_COPY_2':
+  #   U    A_COPY_2\B\E\beta
+  #   A    A_COPY_2\C\X
+  #   A    A_COPY_2\C\X\Y
+  #   A    A_COPY_2\C\X\Y\Z
+  #   A    A_COPY_2\C\X\Y\Z\nu
+  #   U    A_COPY_2\D\G\rho
+  #   U    A_COPY_2\D\H\omega
+  #   U    A_COPY_2\D\H\psi
+  #   --- Recording mergeinfo for merge of r3 through r11 into 'A_COPY_2':
+  #    U   A_COPY_2
+  #   --- Recording mergeinfo for merge of r3 through r11 into 'A_COPY_2\C\X\Y':
+  #    G   A_COPY_2\C\X\Y
+  #    vvvvvvvvvvvvvvvvvvvv
+  #    U   A_COPY_2\C\X\Y\Z
+  #    ^^^^^^^^^^^^^^^^^^^^
+  #   
+  #   >svn pl -vR A_COPY_2
+  #   Properties on 'A_COPY_2':
+  #     svn:mergeinfo
+  #       /A:3-11
+  #   Properties on 'A_COPY_2\C\X\Y':
+  #     branch-prop-foo
+  #       bar
+  #     svn:mergeinfo
+  #       /A/C/X/Y:8-11
+  #       /A_COPY/C/X/Y:10*
+  #   vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+  #   Properties on 'A_COPY_2\C\X\Y\Z':
+  #     svn:mergeinfo
+  #       /A/C/X/Y/Z:8-11
+  #   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+  svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+  expected_output = wc.State(A_COPY2_path, {
+    'B/E/beta'   : Item(status='U '),
+    'D/G/rho'    : Item(status='U '),
+    'D/H/omega'  : Item(status='U '),
+    'D/H/psi'    : Item(status='U '),
+    'C/X'        : Item(status='A '),
+    'C/X/Y'      : Item(status='A '),
+    'C/X/Y/Z'    : Item(status='A '),
+    'C/X/Y/Z/nu' : Item(status='A '),
+    })
+  expected_mergeinfo_output = wc.State(A_COPY2_path, {
+    ''      : Item(status=' U'),
+    'C/X/Y' : Item(status=' G'), # Added with explicit mergeinfo so mergeinfo
+    })                           # describing the merge shows as mer'G'ed.
+  expected_elision_output = wc.State(A_COPY2_path, {
+    })
+  expected_status = wc.State(A_COPY2_path, {
+    ''           : Item(status=' M', wc_rev=11),
+    'B'          : Item(status='  ', wc_rev=11),
+    'mu'         : Item(status='  ', wc_rev=11),
+    'B/E'        : Item(status='  ', wc_rev=11),
+    'B/E/alpha'  : Item(status='  ', wc_rev=11),
+    'B/E/beta'   : Item(status='M ', wc_rev=11),
+    'B/lambda'   : Item(status='  ', wc_rev=11),
+    'B/F'        : Item(status='  ', wc_rev=11),
+    'C'          : Item(status='  ', wc_rev=11),
+    'C/X'        : Item(status='A ', wc_rev='-', copied='+'),
+    'C/X/Y'      : Item(status=' M', wc_rev='-', copied='+'),
+    'C/X/Y/Z'    : Item(status='  ', wc_rev='-', copied='+'),
+    'C/X/Y/Z/nu' : Item(status='  ', wc_rev='-', copied='+'),
+    'D'          : Item(status='  ', wc_rev=11),
+    'D/G'        : Item(status='  ', wc_rev=11),

[... 61 lines stripped ...]


Mime
View raw message