Merge branch '12195-nodemanager-quota-error'
[arvados.git] / sdk / cwl / arvados_cwl / pathmapper.py
index 1ab8e831f4c43019b8097eeb24d9b85ca7ab6500..c8ae77a8b69013718c51b6b579774b9d95d985ef 100644 (file)
@@ -1,3 +1,7 @@
+# Copyright (C) The Arvados Authors. All rights reserved.
+#
+# SPDX-License-Identifier: Apache-2.0
+
 import re
 import logging
 import uuid
@@ -191,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: