Skip to content

Commit 6276549

Browse files
committed
stage correctly if Dirent.entry_name is None
1 parent 5e75ad8 commit 6276549

7 files changed

Lines changed: 50 additions & 13 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
- fixed a bug with Dockerfile path resolution
1010
- handle NetworkAccess Requirment in runner
1111
- inherit parents requirements correclty
12-
- ramping up runner conformance from 160/378 to 199/378
12+
- ramping up runner conformance from 160/378 to 202/378
1313

1414
# v0.5.2
1515
## 🐛 Bugfixes

crates/cwl-execution/src/expression.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,9 @@ pub(crate) fn process_expressions(tool: &mut CWLDocument, input_values: &mut Inp
197197
if let Requirement::InitialWorkDirRequirement(wd_req) = requirement {
198198
for listing in &mut wd_req.listing {
199199
if let WorkDirItem::Dirent(dirent) = listing {
200-
dirent.entryname = replace_expressions(&dirent.entryname)?;
200+
if let Some(entryname) = &mut dirent.entryname {
201+
*entryname = replace_expressions(entryname)?;
202+
}
201203
dirent.entry = match &mut dirent.entry {
202204
Entry::Source(src) => {
203205
*src = replace_expressions(src)?;

crates/cwl-execution/src/staging.rs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,17 @@ fn stage_requirements(requirements: &[Requirement], tool_path: &Path, path: &Pat
5555
if let Requirement::InitialWorkDirRequirement(iwdr) = requirement {
5656
for listing in &iwdr.listing {
5757
let into_path = match listing {
58-
WorkDirItem::Dirent(dirent) => path.join(&dirent.entryname),
58+
WorkDirItem::Dirent(dirent) => {
59+
if let Some(entryname) = &dirent.entryname {
60+
path.join(entryname)
61+
} else {
62+
let eval = match &dirent.entry {
63+
Entry::Source(src) => Path::new(src),
64+
Entry::Include(include) => &get_iwdr_src(tool_path, &include.include)?,
65+
};
66+
path.join(eval.file_name().unwrap())
67+
}
68+
}
5969
WorkDirItem::FileOrDirectory(val) => match &**val {
6070
DefaultValue::File(file) => {
6171
let location = Path::new(file.location.as_ref().unwrap());
@@ -75,7 +85,12 @@ fn stage_requirements(requirements: &[Requirement], tool_path: &Path, path: &Pat
7585
WorkDirItem::Dirent(dirent) => match &dirent.entry {
7686
Entry::Source(src) => {
7787
if fs::exists(src).unwrap_or(false) {
78-
copy_file(src, &into_path).map_err(|e| format!("Failed to copy file from {} to {}: {}", src, path_str, e))?;
88+
let src = Path::new(src); //is safer ;)
89+
if src.is_file() {
90+
copy_file(src, &into_path).map_err(|e| format!("Failed to copy file from {:?} to {}: {}", src, path_str, e))?;
91+
} else {
92+
copy_dir(src, &into_path).map_err(|e| format!("Failed to copy dir from {:?} to {}: {}", src, path_str, e))?;
93+
}
7994
} else {
8095
create_and_write_file(&into_path, src).map_err(|e| format!("Failed to create file {:?}: {}", into_path, e))?;
8196
}
@@ -251,7 +266,7 @@ fn stage_secondary_inputs(incoming_data: &DefaultValue, path: &Path, input: &Com
251266
&file_dir.join(format!("*{}", item.pattern)).to_string_lossy().into_owned()
252267
};
253268
let pattern = pattern.trim();
254-
269+
255270
for res in glob(pattern)? {
256271
let res = res?;
257272
let dest = path.join(&res);

crates/cwl-execution/src/validate.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,9 @@ pub(crate) fn set_placeholder_values_requirements(
111111
if let Requirement::InitialWorkDirRequirement(wd_req) = requirement {
112112
for listing in &mut wd_req.listing {
113113
if let WorkDirItem::Dirent(dirent) = listing {
114-
dirent.entryname = set_placeholder_values_in_string(&dirent.entryname, runtime, inputs);
114+
if let Some(entryname) = &mut dirent.entryname {
115+
*entryname = set_placeholder_values_in_string(entryname, runtime, inputs);
116+
}
115117
dirent.entry = match &mut dirent.entry {
116118
Entry::Source(src) => {
117119
*src = set_placeholder_values_in_string(src, runtime, inputs);

crates/cwl/src/requirements.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,9 @@ impl InitialWorkDirRequirement {
147147
pub fn from_file(filename: &str) -> Self {
148148
InitialWorkDirRequirement {
149149
listing: vec![WorkDirItem::Dirent(Dirent {
150-
entryname: filename.to_string(),
150+
entryname: Some(filename.to_string()),
151151
entry: Entry::from_file(filename),
152+
..Default::default()
152153
})],
153154
}
154155
}
@@ -158,8 +159,9 @@ impl InitialWorkDirRequirement {
158159
.iter()
159160
.map(|&filename| {
160161
WorkDirItem::Dirent(Dirent {
161-
entryname: filename.to_string(),
162+
entryname: Some(filename.to_string()),
162163
entry: Entry::Source(get_entry_name(filename)),
164+
..Default::default()
163165
})
164166
})
165167
.collect(),
@@ -168,17 +170,19 @@ impl InitialWorkDirRequirement {
168170
pub fn from_contents(entryname: &str, contents: &str) -> Self {
169171
InitialWorkDirRequirement {
170172
listing: vec![WorkDirItem::Dirent(Dirent {
171-
entryname: entryname.to_string(),
173+
entryname: Some(entryname.to_string()),
172174
entry: Entry::Source(contents.to_string()),
175+
..Default::default()
173176
})],
174177
}
175178
}
176179

177180
pub fn add_files(&mut self, filenames: &[&str]) {
178181
self.listing.extend(filenames.iter().map(|&f| {
179182
WorkDirItem::Dirent(Dirent {
180-
entryname: f.to_string(),
183+
entryname: Some(f.to_string()),
181184
entry: Entry::Source(get_entry_name(f)),
185+
..Default::default()
182186
})
183187
}));
184188
}
@@ -275,7 +279,7 @@ mod tests {
275279
assert_eq!(req.listing.len(), 1);
276280
assert!(matches!(req.listing[0], WorkDirItem::Dirent(_)));
277281
if let WorkDirItem::Dirent(dirent) = &req.listing[0] {
278-
assert_eq!(dirent.entryname, "../../tests/test_data/echo.py".to_string());
282+
assert_eq!(dirent.entryname, Some("../../tests/test_data/echo.py".to_string()));
279283
}
280284
}
281285

crates/cwl/src/types.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -604,9 +604,22 @@ pub enum EnviromentDefs {
604604
#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
605605
#[serde(rename_all = "camelCase")]
606606
pub struct Dirent {
607-
pub entryname: String,
607+
pub entryname: Option<String>,
608608
pub entry: Entry,
609+
#[serde(skip_serializing_if = "Option::is_none")]
610+
pub writeable: Option<bool>,
611+
}
612+
613+
impl Default for Dirent {
614+
fn default() -> Self {
615+
Self {
616+
entryname: None,
617+
entry: Entry::Source(String::new()),
618+
writeable: None,
619+
}
620+
}
609621
}
622+
610623
#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
611624
#[serde(untagged)]
612625
pub enum Entry {

src/cwl.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,8 @@ mod tests {
339339
Requirement::InitialWorkDirRequirement(InitialWorkDirRequirement {
340340
listing: vec![WorkDirItem::Dirent(Dirent {
341341
entry: Entry::from_file(os_path("../../test/script.py")),
342-
entryname: "test/script.py".to_string()
342+
entryname: Some("test/script.py".to_string()),
343+
..Default::default()
343344
})]
344345
})
345346
);

0 commit comments

Comments
 (0)