X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/456dde006228871c522597abbc5fe8006e44ad4d..6f6ce90eb894bde190fd7522cbec037fe61fc25c:/sdk/cwl/arvados_cwl/pathmapper.py diff --git a/sdk/cwl/arvados_cwl/pathmapper.py b/sdk/cwl/arvados_cwl/pathmapper.py index 52a65ff580..c8ae77a8b6 100644 --- a/sdk/cwl/arvados_cwl/pathmapper.py +++ b/sdk/cwl/arvados_cwl/pathmapper.py @@ -1,3 +1,7 @@ +# Copyright (C) The Arvados Authors. All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + import re import logging import uuid @@ -61,7 +65,8 @@ class ArvPathMapper(PathMapper): ab = abspath(src, self.input_basedir) st = arvados.commands.run.statfile("", ab, fnPattern="keep:%s/%s", - dirPattern="keep:%s/%s") + dirPattern="keep:%s/%s", + raiseOSError=True) with SourceLine(srcobj, "location", WorkflowException): if isinstance(st, arvados.commands.run.UploadFile): uploadfiles.add((src, ab, st)) @@ -190,20 +195,34 @@ class ArvPathMapper(PathMapper): self.keepdir = None def reversemap(self, target): - if target.startswith("keep:"): + p = super(ArvPathMapper, self).reversemap(target) + if p: + return p + elif target.startswith("keep:"): return (target, target) elif self.keepdir and target.startswith(self.keepdir): - return (target, "keep:" + target[len(self.keepdir)+1:]) + kp = "keep:" + target[len(self.keepdir)+1:] + return (kp, kp) else: - return super(ArvPathMapper, self).reversemap(target) + return None class StagingPathMapper(PathMapper): _follow_dirs = True + def __init__(self, referenced_files, basedir, stagedir, separateDirs=True): + self.targets = set() + super(StagingPathMapper, self).__init__(referenced_files, basedir, stagedir, separateDirs) + def visit(self, obj, stagedir, basedir, copy=False, staged=False): # type: (Dict[unicode, Any], unicode, unicode, bool) -> None loc = obj["location"] tgt = os.path.join(stagedir, obj["basename"]) + basetgt, baseext = os.path.splitext(tgt) + n = 1 + while tgt in self.targets: + n += 1 + tgt = "%s_%i%s" % (basetgt, n, baseext) + self.targets.add(tgt) if obj["class"] == "Directory": self._pathmap[loc] = MapperEnt(loc, tgt, "Directory", staged) if loc.startswith("_:") or self._follow_dirs: