For everyone's sanity I'd better not only bump the thread, but also resend the
patch and the log message I had prepared back then.
14.07.2018, 19:04, "Nikita Slyusarev" <[email protected]>:
> 14.07.2018, 17:18, "Daniel Shahaf" <[email protected]>:
>> It would help to add a regression test to subversion/tests/cmdline/ or
>> subversion/tests/libsvn_client/.
>
> Thanks for your advice. I've added cmdline tests to the patch and fixed the
> log
> message accordingly.
[[[
Correctly handle existing parent directories when performing repos-to-wc copy.
* subversion/libsvn_client/copy.c
(repos_to_wc_copy): If add_parents flag is set and destination parent
directory exists, but is unversioned, put it under version control. Wc-to-wc
copy behaves this way, and so should repos-to-wc copy do.
* subversion/tests/cmdline/copy_tests.py
(copy_make_parents_repo_wc,
copy_make_parents_wc_wc): Check behaviour with dst directory pre-creation
for both repo-to-wc and wc-to-wc test cases.
]]]
--
Nikita Slyusarev
Yandex
Index: subversion/libsvn_client/copy.c
===================================================================
--- subversion/libsvn_client/copy.c (revision 1835910)
+++ subversion/libsvn_client/copy.c (working copy)
@@ -2742,6 +2742,16 @@ repos_to_wc_copy(svn_boolean_t *timestamp_sleep,
SVN_ERR(svn_client__make_local_parents(dst_parent, TRUE, ctx,
iterpool));
}
+ else if (make_parents && dst_parent_kind == svn_node_dir)
+ {
+ SVN_ERR(svn_wc_read_kind2(&dst_parent_kind, ctx->wc_ctx, dst_parent,
+ FALSE, TRUE, iterpool));
+ if (dst_parent_kind == svn_node_none)
+ {
+ SVN_ERR(svn_client__make_local_parents(dst_parent, TRUE, ctx,
+ iterpool));
+ }
+ }
else if (dst_parent_kind != svn_node_dir)
{
return svn_error_createf(SVN_ERR_WC_NOT_WORKING_COPY, NULL,
Index: subversion/tests/cmdline/copy_tests.py
===================================================================
--- subversion/tests/cmdline/copy_tests.py (revision 1835910)
+++ subversion/tests/cmdline/copy_tests.py (working copy)
@@ -3477,10 +3477,19 @@ def copy_make_parents_wc_wc(sbox):
iota_path = sbox.ospath('iota')
new_iota_path = sbox.ospath('X/Y/Z/iota')
+ # Existing unversioned dst directory case
+ new_iota_path_eudst = sbox.ospath('X2/Y/Z/iota')
+ os.makedirs(os.path.dirname(new_iota_path_eudst))
+
# Copy iota
svntest.actions.run_and_verify_svn(None, [], 'cp', '--parents',
iota_path, new_iota_path)
+ # Copy iota to pre-created dst directory
+ svntest.actions.run_and_verify_svn(None, [],
+ 'cp', '--parents',
+ iota_path, new_iota_path_eudst)
+
# Create expected output
expected_output = svntest.wc.State(wc_dir, {
'X' : Item(verb='Adding'),
@@ -3487,6 +3496,10 @@ def copy_make_parents_wc_wc(sbox):
'X/Y' : Item(verb='Adding'),
'X/Y/Z' : Item(verb='Adding'),
'X/Y/Z/iota' : Item(verb='Adding'),
+ 'X2' : Item(verb='Adding'),
+ 'X2/Y' : Item(verb='Adding'),
+ 'X2/Y/Z' : Item(verb='Adding'),
+ 'X2/Y/Z/iota' : Item(verb='Adding'),
})
# Create expected status tree
@@ -3498,6 +3511,10 @@ def copy_make_parents_wc_wc(sbox):
'X/Y' : Item(status=' ', wc_rev=2),
'X/Y/Z' : Item(status=' ', wc_rev=2),
'X/Y/Z/iota' : Item(status=' ', wc_rev=2),
+ 'X2' : Item(status=' ', wc_rev=2),
+ 'X2/Y' : Item(status=' ', wc_rev=2),
+ 'X2/Y/Z' : Item(status=' ', wc_rev=2),
+ 'X2/Y/Z/iota' : Item(status=' ', wc_rev=2),
})
svntest.actions.run_and_verify_commit(wc_dir,
@@ -3516,11 +3533,20 @@ def copy_make_parents_repo_wc(sbox):
iota_url = sbox.repo_url + '/iota'
new_iota_path = sbox.ospath('X/Y/Z/iota')
+ # Existing unversioned dst directory case
+ new_iota_path_eudst = sbox.ospath('X2/Y/Z/iota')
+ os.makedirs(os.path.dirname(new_iota_path_eudst))
+
# Copy iota
svntest.actions.run_and_verify_svn(None, [],
'cp', '--parents',
iota_url, new_iota_path)
+ # Copy iota to pre-created dst directory
+ svntest.actions.run_and_verify_svn(None, [],
+ 'cp', '--parents',
+ iota_url, new_iota_path_eudst)
+
# Create expected output
expected_output = svntest.wc.State(wc_dir, {
'X' : Item(verb='Adding'),
@@ -3527,6 +3553,10 @@ def copy_make_parents_repo_wc(sbox):
'X/Y' : Item(verb='Adding'),
'X/Y/Z' : Item(verb='Adding'),
'X/Y/Z/iota' : Item(verb='Adding'),
+ 'X2' : Item(verb='Adding'),
+ 'X2/Y' : Item(verb='Adding'),
+ 'X2/Y/Z' : Item(verb='Adding'),
+ 'X2/Y/Z/iota' : Item(verb='Adding'),
})
# Create expected status tree
@@ -3538,6 +3568,10 @@ def copy_make_parents_repo_wc(sbox):
'X/Y' : Item(status=' ', wc_rev=2),
'X/Y/Z' : Item(status=' ', wc_rev=2),
'X/Y/Z/iota' : Item(status=' ', wc_rev=2),
+ 'X2' : Item(status=' ', wc_rev=2),
+ 'X2/Y' : Item(status=' ', wc_rev=2),
+ 'X2/Y/Z' : Item(status=' ', wc_rev=2),
+ 'X2/Y/Z/iota' : Item(status=' ', wc_rev=2),
})
svntest.actions.run_and_verify_commit(wc_dir,