Skip to content

Commit 23acadf

Browse files
authored
better handle symlinks in Directories (#1462)
1 parent 0e89055 commit 23acadf

File tree

3 files changed

+45
-10
lines changed

3 files changed

+45
-10
lines changed

cwltool/process.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -356,19 +356,28 @@ def _relocate(src: str, dst: str) -> None:
356356
return
357357

358358
# If the source is not contained in source_directories we're not allowed to delete it
359-
src = fs_access.realpath(src)
359+
real_src = fs_access.realpath(src)
360360
src_can_deleted = any(
361-
os.path.commonprefix([p, src]) == p for p in source_directories
361+
os.path.commonprefix([p, real_src]) == p for p in source_directories
362362
)
363363

364364
_action = "move" if action == "move" and src_can_deleted else "copy"
365365

366366
if _action == "move":
367367
_logger.debug("Moving %s to %s", src, dst)
368-
if fs_access.isdir(src) and fs_access.isdir(dst):
369-
# merge directories
370-
for dir_entry in scandir(src):
371-
_relocate(dir_entry.path, fs_access.join(dst, dir_entry.name))
368+
if fs_access.isdir(src):
369+
if fs_access.isdir(dst):
370+
if len(fs_access.listdir(dst)) > 0:
371+
# merge directories
372+
for dir_entry in scandir(src):
373+
_relocate(
374+
dir_entry.path, fs_access.join(dst, dir_entry.name)
375+
)
376+
else:
377+
os.rmdir(dst)
378+
shutil.move(src, dst)
379+
else:
380+
shutil.move(src, dst)
372381
else:
373382
shutil.move(src, dst)
374383

tests/symlinks.cwl

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#!/usr/bin/env cwl-runner
2+
cwlVersion: v1.0
3+
class: CommandLineTool
4+
inputs: []
5+
baseCommand: [ bash, -c ]
6+
arguments:
7+
# - "mkdir foo; echo 42 > foo/bar; ln -s bar foo/baz"
8+
- "mkdir foo; echo 42 > foo/bar; ln -s $PWD/foo/bar foo/baz"
9+
# - "mkdir foo; ln -s $PWD/foo/bar foo/baz ; echo 42 > foo/bar"
10+
outputs:
11+
result:
12+
type: Directory
13+
outputBinding:
14+
glob: foo

tests/test_relocate.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@
66

77
from .util import get_data, needs_docker
88

9-
if sys.version_info[0] < 3:
10-
from StringIO import StringIO
11-
else:
12-
from io import StringIO
9+
from io import StringIO
1310

1411

1512
@needs_docker
@@ -18,6 +15,21 @@ def test_for_910() -> None:
1815
assert main([get_data("tests/wf/910.cwl")]) == 0
1916

2017

18+
def test_symlinks_with_absolute_paths(tmp_path: Path) -> None:
19+
"""Confirm that absolute paths in Directory types don't cause problems."""
20+
assert (
21+
main(
22+
[
23+
"--debug",
24+
f"--outdir={tmp_path}/result",
25+
f"--tmpdir-prefix={tmp_path}/tmp",
26+
get_data("tests/symlinks.cwl"),
27+
]
28+
)
29+
== 0
30+
)
31+
32+
2133
@needs_docker
2234
def test_for_conflict_file_names(tmp_path: Path) -> None:
2335
stream = StringIO()

0 commit comments

Comments
 (0)