Skip to content

Commit 01ea0a1

Browse files
authored
Revert #769, fix mergedirs instead (#770)
* Revert #769, solve the dependencies name collision problem in mergedirs(),
1 parent b58c668 commit 01ea0a1

File tree

3 files changed

+60
-6
lines changed

3 files changed

+60
-6
lines changed

cwltool/pathmapper.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,7 @@ def addLocation(d):
7272
d["location"] = urllib.parse.urlunparse((parse.scheme, parse.netloc, path, parse.params, parse.query, parse.fragment))
7373

7474
if "basename" not in d:
75-
if parse.scheme and parse.scheme != "file":
76-
d["basename"] = urllib.parse.quote(parse.netloc + parse.path, safe="")
77-
if parse.query:
78-
d["basename"] += urllib.parse.quote("?"+parse.query, safe="")
79-
else:
80-
d["basename"] = os.path.basename(urllib.request.url2pathname(path))
75+
d["basename"] = os.path.basename(urllib.request.url2pathname(path))
8176

8277
if d["class"] == "File":
8378
d["nameroot"], d["nameext"] = os.path.splitext(d["basename"])

cwltool/process.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -822,6 +822,7 @@ def mergedirs(listing):
822822
# type: (List[Dict[Text, Any]]) -> List[Dict[Text, Any]]
823823
r = [] # type: List[Dict[Text, Any]]
824824
ents = {} # type: Dict[Text, Any]
825+
collided = set() # type: Set[Text]
825826
for e in listing:
826827
if e["basename"] not in ents:
827828
ents[e["basename"]] = e
@@ -830,6 +831,23 @@ def mergedirs(listing):
830831
ents[e["basename"]].setdefault("listing", []).extend(e["listing"])
831832
if ents[e["basename"]]["location"].startswith("_:"):
832833
ents[e["basename"]]["location"] = e["location"]
834+
elif e["location"] != ents[e["basename"]]["location"]:
835+
# same basename, different location, collision,
836+
# rename both.
837+
collided.add(e["basename"])
838+
e2 = ents[e["basename"]]
839+
840+
e["basename"] = urllib.parse.quote(e["location"], safe="")
841+
e2["basename"] = urllib.parse.quote(e2["location"], safe="")
842+
843+
e["nameroot"], e["nameext"] = os.path.splitext(e["basename"])
844+
e2["nameroot"], e2["nameext"] = os.path.splitext(e2["basename"])
845+
846+
ents[e["basename"]] = e
847+
ents[e2["basename"]] = e2
848+
for c in collided:
849+
print(ents)
850+
del ents[c]
833851
for e in six.itervalues(ents):
834852
if e["class"] == "Directory" and "listing" in e:
835853
e["listing"] = mergedirs(e["listing"])
@@ -859,6 +877,8 @@ def scandeps(base, doc, reffields, urlfields, loadref, urljoin=urllib.parse.urlj
859877
"class": doc["class"],
860878
"location": urljoin(base, u)
861879
}
880+
if "basename" in doc:
881+
deps["basename"] = doc["basename"]
862882
if doc["class"] == "Directory" and "listing" in doc:
863883
deps["listing"] = doc["listing"]
864884
if doc["class"] == "File" and "secondaryFiles" in doc:

tests/test_pathmapper.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,42 @@ def test_basename_field_generation(self):
5454
normalizeFilesDirs(file)
5555
self.assertEqual(file, expected)
5656

57+
def test_normalizeFilesDirs(self):
58+
n = {
59+
"class": "File",
60+
"location": "file1.txt"
61+
}
62+
normalizeFilesDirs(n)
63+
self.assertEqual(n, {
64+
"class": "File",
65+
"location": "file1.txt",
66+
'basename': 'file1.txt',
67+
'nameext': '.txt',
68+
'nameroot': 'file1'
69+
})
70+
71+
n = {
72+
"class": "File",
73+
"location": "file:///foo/file1.txt"
74+
}
75+
normalizeFilesDirs(n)
76+
self.assertEqual(n, {
77+
"class": "File",
78+
"location": "file:///foo/file1.txt",
79+
'basename': 'file1.txt',
80+
'nameext': '.txt',
81+
'nameroot': 'file1'
82+
})
83+
84+
n = {
85+
"class": "File",
86+
"location": "http://example.com/file1.txt"
87+
}
88+
normalizeFilesDirs(n)
89+
self.assertEqual(n, {
90+
"class": "File",
91+
"location": "http://example.com/file1.txt",
92+
'basename': 'file1.txt',
93+
'nameext': '.txt',
94+
'nameroot': 'file1'
95+
})

0 commit comments

Comments
 (0)