summaryrefslogtreecommitdiffstats
path: root/src/resolve.rs
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2021-09-17 21:10:04 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2021-09-17 21:52:43 +0200
commit1d340bbd261da57ca603c05e5b712c936efcc902 (patch)
tree762bbf58d35261a3bb66fa794f7c801cbde04e3f /src/resolve.rs
parentfef7265a2d0b3ca12f8d1c2c892c45cdd7e31781 (diff)
downloadrebel-1d340bbd261da57ca603c05e5b712c936efcc902.tar
rebel-1d340bbd261da57ca603c05e5b712c936efcc902.zip
Introduce runtime dependencies of outputs and add to resolver
Diffstat (limited to 'src/resolve.rs')
-rw-r--r--src/resolve.rs67
1 files changed, 65 insertions, 2 deletions
diff --git a/src/resolve.rs b/src/resolve.rs
index 14294d1..a01f5c5 100644
--- a/src/resolve.rs
+++ b/src/resolve.rs
@@ -64,6 +64,62 @@ enum ResolveState {
Resolved,
}
+pub fn runtime_depends<'a, I>(
+ tasks: &'a TaskMap,
+ deps: I,
+) -> Result<HashSet<&'a OutputRef>, Vec<Error>>
+where
+ I: IntoIterator<Item = &'a OutputRef>,
+{
+ fn add_dep<'a>(
+ ret: &mut HashSet<&'a OutputRef>,
+ tasks: &'a TaskMap,
+ dep: &'a OutputRef,
+ ) -> Vec<Error> {
+ if !ret.insert(dep) {
+ return Vec::new();
+ }
+
+ let task = &dep.task;
+ let task_def = match tasks.get(&task.id) {
+ Some(task) => task,
+ None => return vec![Error::TaskNotFound(DepChain(vec![task.clone()]))],
+ };
+
+ let output = match task_def.output.get(&dep.output) {
+ Some(output) => output,
+ None => {
+ return vec![Error::OutputNotFound(
+ DepChain(vec![task.clone()]),
+ dep.output.clone(),
+ )];
+ }
+ };
+
+ let mut errors = Vec::new();
+ for runtime_dep in &output.runtime_depends {
+ for mut error in add_dep(ret, tasks, runtime_dep) {
+ error.extend(task.clone());
+ errors.push(error);
+ }
+ }
+ errors
+ }
+
+ let mut ret = HashSet::new();
+ let mut errors = Vec::new();
+
+ for dep in deps {
+ errors.extend(add_dep(&mut ret, tasks, dep));
+ }
+
+ if !errors.is_empty() {
+ return Err(errors);
+ }
+
+ Ok(ret)
+}
+
#[derive(Debug)]
pub struct Resolver<'a> {
tasks: &'a TaskMap,
@@ -122,8 +178,15 @@ impl<'a> Resolver<'a> {
handle_errors(self.add_task(inherit, None));
}
- for dep in task_def.get_depend_outputs() {
- handle_errors(self.add_task(&dep.task, Some(&dep.output)));
+ match runtime_depends(self.tasks, task_def.get_depend_outputs()) {
+ Ok(rdeps) => {
+ for rdep in rdeps {
+ handle_errors(self.add_task(&rdep.task, Some(&rdep.output)));
+ }
+ }
+ Err(errors) => {
+ handle_errors(errors);
+ }
}
if ret.is_empty() {