Hi Stefan! This is supposed to be a backport. It is diffed against 1.6.x.
make check passed. [[[ Fix issue #3390, relative externals not updated during switch. * subversion/libsvn_client/switch.c (svn_client__switch_internal): Pass in a traversal_info to svn_wc_crawl_revision4(). * subversion/tests/cmdline/externals_tests.py (switch_relative_external): New. (test_list): Add new test. Patch by: Daniel Näslund <daniel{_AT_}longitudo.com> ]]] Daniel
Index: subversion/tests/cmdline/externals_tests.py =================================================================== --- subversion/tests/cmdline/externals_tests.py (revision 902095) +++ subversion/tests/cmdline/externals_tests.py (arbetskopia) @@ -18,6 +18,7 @@ # General modules import sys +import re import os import warnings @@ -1198,7 +1199,52 @@ None, None, None, None, None, True) +######################################################################## +# Issue #3351. +def switch_relative_external(sbox): + "switch a relative external" + + sbox.build() + wc_dir = sbox.wc_dir + repo_url = sbox.repo_url + + # Create a relative external in A/D on ../B + A_path = os.path.join(wc_dir, 'A') + A_copy_path = os.path.join(wc_dir, 'A_copy') + A_copy_url = repo_url + '/A_copy' + D_path = os.path.join(A_path, 'D') + ext_path = os.path.join(D_path, 'ext') + externals_prop = "../B ext\n" + change_external(D_path, externals_prop) + svntest.actions.run_and_verify_svn(None, None, [], + 'ci', '-m', 'log msg', + '--quiet', wc_dir) + + # Update our working copy, and create a "branch" (A => A_copy) + svntest.actions.run_and_verify_svn(None, None, [], 'up', + '--quiet', wc_dir) + svntest.actions.run_and_verify_svn(None, None, [], 'cp', + '--quiet', A_path, A_copy_path) + svntest.actions.run_and_verify_svn(None, None, [], + 'ci', '-m', 'log msg', + '--quiet', wc_dir) + + # Okay. We now want to switch A to A_copy, which *should* cause + # A/D/ext to point to the URL for A_copy/D/ext. + svntest.actions.run_and_verify_svn(None, None, [], 'sw', + '--quiet', A_copy_url, A_path) + + expected_infos = [ + { 'Path' : re.escape(D_path), + 'URL' : sbox.repo_url + '/A_copy/D', + }, + { 'Path' : re.escape(ext_path), + 'URL' : sbox.repo_url + '/A_copy/B', + }, + ] + svntest.actions.run_and_verify_info(expected_infos, D_path, ext_path) + ######################################################################## # Run the tests @@ -1223,6 +1269,7 @@ can_place_file_external_into_dir_external, external_into_path_with_spaces, binary_file_externals, + switch_relative_external, ] if __name__ == '__main__': Index: subversion/libsvn_client/switch.c =================================================================== --- subversion/libsvn_client/switch.c (revision 902095) +++ subversion/libsvn_client/switch.c (arbetskopia) @@ -218,15 +218,16 @@ PATH. When we call reporter->finish_report, the update_editor will be driven by svn_repos_dir_delta2. - We pass NULL for traversal_info because this is a switch, not an - update, and therefore we don't want to handle any externals - except the ones directly affected by the switch. */ + We pass in a traversal_info for recording all externals. It + shouldn't be needed for a switch if it wasn't for the relative + externals of type '../path'. All of those must be resolved to + the new location. */ err = svn_wc_crawl_revisions4(path, dir_access, reporter, report_baton, TRUE, depth, (! depth_is_sticky), (! server_supports_depth), use_commit_times, ctx->notify_func2, ctx->notify_baton2, - NULL, /* no traversal info */ + traversal_info, pool); if (err)