Skip to content

Commit e70eeb8

Browse files
author
Peter Amstutz
committed
Update scandeps to produce nested directory listing to correctly capture file
structure.
1 parent 229565c commit e70eeb8

File tree

2 files changed

+51
-11
lines changed

2 files changed

+51
-11
lines changed

cwltool/main.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
from . import workflow
2727
from .errors import WorkflowException, UnsupportedRequirement
2828
from .cwlrdf import printrdf, printdot
29-
from .process import shortname, Process, getListing, relocateOutputs, cleanIntermediate
29+
from .process import shortname, Process, getListing, relocateOutputs, cleanIntermediate, scandeps
3030
from .load_tool import fetch_document, validate_document, make_tool
3131
from . import draft2tool
3232
from .builder import adjustFileObjs, adjustDirObjs
@@ -423,29 +423,29 @@ def pathToLoc(p):
423423
return (job_order_object, input_basedir)
424424

425425

426-
def printdeps(obj, document_loader, stdout, relative_deps, basedir=None):
426+
def printdeps(obj, document_loader, stdout, relative_deps, uri, basedir=None):
427427
# type: (Dict[unicode, Any], Loader, IO[Any], bool, str) -> None
428428
deps = {"class": "File",
429-
"path": obj.get("id", "#")}
429+
"location": uri}
430430

431431
def loadref(b, u):
432432
return document_loader.resolve_ref(u, base_url=b)[0]
433433

434-
sf = scandeps(basedir if basedir else obj["id"], obj,
434+
sf = scandeps(basedir if basedir else uri, obj,
435435
set(("$import", "run")),
436-
set(("$include", "$schemas", "path")), loadref)
436+
set(("$include", "$schemas", "path", "location")), loadref)
437437
if sf:
438438
deps["secondaryFiles"] = sf
439439

440440
if relative_deps:
441441
if relative_deps == "primary":
442-
base = basedir if basedir else os.path.dirname(obj["id"])
442+
base = basedir if basedir else os.path.dirname(uri)
443443
elif relative_deps == "cwd":
444444
base = "file://" + os.getcwd()
445445
else:
446446
raise Exception(u"Unknown relative_deps %s" % relative_deps)
447447
def makeRelative(ob):
448-
u = ob["location"]
448+
u = ob.get("location", ob.get("path"))
449449
if ":" in u.split("/")[0] and not u.startswith("file://"):
450450
pass
451451
else:
@@ -604,7 +604,7 @@ def main(argsl=None,
604604
document_loader, workflowobj, uri = fetch_document(args.workflow)
605605

606606
if args.print_deps:
607-
printdeps(workflowobj, document_loader, stdout, args.relative_deps)
607+
printdeps(workflowobj, document_loader, stdout, args.relative_deps, uri)
608608
return 0
609609

610610
document_loader, avsc_names, processobj, metadata, uri \

cwltool/process.py

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,41 @@ def uniquename(stem): # type: (unicode) -> unicode
549549
_names.add(u)
550550
return u
551551

552+
def nestdir(base, deps):
553+
dirname = os.path.dirname(base) + "/"
554+
subid = deps["location"]
555+
if subid.startswith(dirname):
556+
s2 = subid[len(dirname):]
557+
sp = s2.split('/')
558+
sp.pop()
559+
while sp:
560+
nx = sp.pop()
561+
deps = {
562+
"entryname": nx,
563+
"entry": {
564+
"class": "Directory",
565+
"listing": [deps]
566+
}
567+
}
568+
return deps
569+
570+
def mergedirs(listing):
571+
r = []
572+
ents = {}
573+
for e in listing:
574+
if "entryname" in e:
575+
if e["entryname"] not in ents:
576+
ents[e["entryname"]] = e
577+
elif e["entry"]["class"] == "Directory":
578+
ents[e["entryname"]]["entry"]["listing"].extend(e["entry"]["listing"])
579+
else:
580+
r.append(e)
581+
for e in ents.itervalues():
582+
if e["entry"]["class"] == "Directory":
583+
e["entry"]["listing"] = mergedirs(e["entry"]["listing"])
584+
r.extend(ents.itervalues())
585+
return r
586+
552587
def scandeps(base, doc, reffields, urlfields, loadref):
553588
# type: (unicode, Any, Set[str], Set[str], Callable[[unicode, str], Any]) -> List[Dict[str, str]]
554589
r = []
@@ -574,20 +609,25 @@ def scandeps(base, doc, reffields, urlfields, loadref):
574609
deps = {
575610
"class": "File",
576611
"location": subid
577-
} # type: Dict[str, Any]
612+
} # type: Dict[str, Any]
578613
sf = scandeps(subid, sub, reffields, urlfields, loadref)
579614
if sf:
580615
deps["secondaryFiles"] = sf
616+
deps = nestdir(base, deps)
581617
r.append(deps)
582618
elif k in urlfields:
583619
for u in aslist(v):
584-
r.append({
620+
deps = {
585621
"class": "File",
586622
"location": urlparse.urljoin(base, u)
587-
})
623+
}
624+
deps = nestdir(base, deps)
625+
r.append(deps)
588626
else:
589627
r.extend(scandeps(base, v, reffields, urlfields, loadref))
590628
elif isinstance(doc, list):
591629
for d in doc:
592630
r.extend(scandeps(base, d, reffields, urlfields, loadref))
631+
632+
r = mergedirs(r)
593633
return r

0 commit comments

Comments
 (0)