Index: subversion/tests/cmdline/merge_tests.py =================================================================== --- subversion/tests/cmdline/merge_tests.py (revision 32959) +++ subversion/tests/cmdline/merge_tests.py (working copy) @@ -12636,6 +12636,37 @@ # Surprise: if we don't merge the file's 'rev1' state first, it doesn't fail # nor even raise a conflict. +def merge_file_with_space_in_its_path(sbox): + "merge a file with space in its path" + + sbox.build() + wc_dir = sbox.wc_dir + some_dir = os.path.join(wc_dir, "some dir") + file1 = os.path.join(some_dir, "file1") + file2 = os.path.join(some_dir, "file2") + + # Make r2. + os.mkdir(some_dir) + svntest.main.file_append(file1, "Initial text in the file.\n") + svntest.main.run_svn(None, "add", some_dir) + svntest.actions.run_and_verify_svn(None, None, [], + "ci", "-m", "r2", wc_dir) + + # Make r3. + svntest.main.run_svn(None, "copy", file1, file2) + svntest.actions.run_and_verify_svn(None, None, [], + "ci", "-m", "r3", wc_dir) + + # Make r4. + svntest.main.file_append(file2, "Next line of text in the file.\n") + svntest.actions.run_and_verify_svn(None, None, [], + "ci", "-m", "r4", wc_dir) + + target_url = sbox.repo_url + '/some%20dir/file2' + svntest.actions.run_and_verify_svn(None, None, [], + "merge", "--reintegrate", target_url, + file1) + ######################################################################## # Run the tests @@ -12819,6 +12850,7 @@ server_has_mergeinfo), XFail(merge_two_edits_to_same_prop), merge_an_eol_unification_and_set_svn_eol_style, + merge_file_with_space_in_its_path, ] if __name__ == '__main__': Index: subversion/libsvn_client/merge.c =================================================================== --- subversion/libsvn_client/merge.c (revision 32959) +++ subversion/libsvn_client/merge.c (working copy) @@ -6309,10 +6309,12 @@ over and over. */ /* We never merged to the source. Just return the branch point. */ const char *yc_ancestor_path, - *source_url = svn_path_join(source_repos_root, source_repos_rel_path, - subpool), - *target_url = svn_path_join(source_repos_root, target_repos_rel_path, - subpool); + *source_url = svn_path_url_add_component(source_repos_root, + source_repos_rel_path, + subpool), + *target_url = svn_path_url_add_component(source_repos_root, + target_repos_rel_path, + subpool); SVN_ERR(svn_client__get_youngest_common_ancestor(&yc_ancestor_path, rev_left, @@ -6324,7 +6326,8 @@ _("'%s@%ld' must be ancestrally related to " "'%s@%ld'"), source_url, source_rev, target_url, target_rev); - *url_left = svn_path_join(source_repos_root, yc_ancestor_path, pool); + *url_left = svn_path_url_add_component(source_repos_root, + yc_ancestor_path, pool); *source_mergeinfo_p = apr_hash_make(pool); svn_pool_destroy(subpool);