lib.util.copy(): Add parents flag parameter
copy() lands a source below the destination root, taking at most the source's basename, so there is no way to land it at its source path, as cp --parents does. Add a parents flag that requests just that. Signed-off-by: Jan Lindemann <jan@janware.com> Assisted-by: unsloth/Qwen3.8-27B-GGUF:Q4_K_M with pi.dev v1.1.0
This commit is contained in:
parent
482daa17e7
commit
0ca539dc0f
1 changed files with 68 additions and 3 deletions
|
|
@ -123,6 +123,48 @@ async def run_tests() -> None:
|
|||
assert isinstance(ret, list), ret
|
||||
assert os.path.join(tmp, 'dst/slash/a/f1') in ret, ret
|
||||
|
||||
# -- parents lands the object at its source path below the
|
||||
# destination root, like cp --parents
|
||||
dst_parents = os.path.join(tmp, 'dst/parents')
|
||||
os.makedirs(dst_parents)
|
||||
src_single = os.path.join(tmp, 'src/single')
|
||||
ret = await copy(uri(src_single), uri(dst_parents), parents = True)
|
||||
assert ret == dst_parents + src_single, ret
|
||||
with open(dst_parents + src_single) as f:
|
||||
assert f.read() == 'solo\n'
|
||||
|
||||
# -- parents on a tree lands the tree at its source path
|
||||
dst_ptree = os.path.join(tmp, 'dst/ptree')
|
||||
os.makedirs(dst_ptree)
|
||||
src_tree = os.path.join(tmp, 'src/a')
|
||||
ret = await copy(
|
||||
uri(src_tree), uri(dst_ptree), recursive = True, parents = True
|
||||
)
|
||||
assert isinstance(ret, list), ret
|
||||
expected = dst_ptree + src_tree
|
||||
assert sorted(ret) == sorted([
|
||||
os.path.join(expected, 'f1'),
|
||||
os.path.join(expected, 'sub/f2'),
|
||||
os.path.join(expected, 'sub/subsub/f3'),
|
||||
]), ret
|
||||
assert os.path.isdir(os.path.join(expected, 'empty')), ret
|
||||
|
||||
# -- a chrooted context source lands at its URI path
|
||||
dst_pchroot = os.path.join(tmp, 'dst/pchroot')
|
||||
os.makedirs(dst_pchroot)
|
||||
src_fc = Local(uri(src_tree), chroot = True)
|
||||
ret = await copy(src_fc, uri(dst_pchroot), recursive = True, parents = True)
|
||||
assert isinstance(ret, list), ret
|
||||
assert os.path.isfile(os.path.join(dst_pchroot + src_tree, 'f1')), ret
|
||||
|
||||
# -- re-copying with parents replaces content, not layout
|
||||
with open(dst_parents + src_single, 'w') as f:
|
||||
f.write('replaced\n')
|
||||
ret = await copy(uri(src_single), uri(dst_parents), parents = True)
|
||||
assert ret == dst_parents + src_single, ret
|
||||
with open(dst_parents + src_single) as f:
|
||||
assert f.read() == 'solo\n'
|
||||
|
||||
# -- A missing source fails loudly
|
||||
try:
|
||||
await copy(
|
||||
|
|
|
|||
Loading…
Reference in a new issue