diff options
-rw-r--r-- | src/executor.rs | 15 | ||||
-rw-r--r-- | src/runner/mod.rs | 2 | ||||
-rw-r--r-- | src/runner/runc.rs | 4 | ||||
-rw-r--r-- | src/runner/runc/run.rs | 6 |
4 files changed, 14 insertions, 13 deletions
diff --git a/src/executor.rs b/src/executor.rs index 0d1a5a2..f3c5993 100644 --- a/src/executor.rs +++ b/src/executor.rs @@ -42,7 +42,7 @@ struct TaskMeta { pub inherit: Vec<InputHash>, pub depends: BTreeSet<OutputHash>, pub input_hash: InputHash, - pub output_hash: OutputHash, + pub output_hash: Option<OutputHash>, } impl TaskMeta { @@ -117,17 +117,18 @@ impl<'a> Executor<'a> { fn task_deps(&self, task: &Task) -> BTreeSet<OutputHash> { task.depends .iter() - .map(|dep| self.tasks_done[dep].output_hash) + .filter_map(|dep| self.tasks_done[dep].output_hash) .collect() } fn task_deps_with_actions(&self, task: &Task) -> HashMap<OutputHash, TaskAction> { task.depends .iter() - .map(|dep| { - let task = &self.tasks[&dep.id]; - let meta = &self.tasks_done[dep]; - (meta.output_hash, task.action.clone()) + .filter_map(|dep| { + self.tasks_done[dep].output_hash.map(|output_hash| { + let task = &self.tasks[&dep.id]; + (output_hash, task.action.clone()) + }) }) .collect() } @@ -162,7 +163,7 @@ impl<'a> Executor<'a> { TaskAction::Fetch { .. } => { // Fetch tasks are not implemented yet, // we just return the input hash - OutputHash(input_hash.0) + Some(OutputHash(input_hash.0)) } TaskAction::Run(run) => { let task = runner::Task { diff --git a/src/runner/mod.rs b/src/runner/mod.rs index 4710552..aff1d3e 100644 --- a/src/runner/mod.rs +++ b/src/runner/mod.rs @@ -16,5 +16,5 @@ pub struct Task { } pub trait Runner { - fn run(&self, task: &Task) -> Result<OutputHash>; + fn run(&self, task: &Task) -> Result<Option<OutputHash>>; } diff --git a/src/runner/runc.rs b/src/runner/runc.rs index 756fc28..98fee2a 100644 --- a/src/runner/runc.rs +++ b/src/runner/runc.rs @@ -20,7 +20,7 @@ use crate::{ }; #[derive(Debug, Deserialize, Serialize)] -struct Request(runner::Task, ipc::IpcSender<Result<OutputHash>>); +struct Request(runner::Task, ipc::IpcSender<Result<Option<OutputHash>>>); fn runner(idmap_finished: ipc::IpcReceiver<()>, channel: ipc::IpcReceiver<Request>) -> ! { idmap_finished @@ -95,7 +95,7 @@ impl RuncRunner { } impl super::Runner for RuncRunner { - fn run(&self, task: &runner::Task) -> Result<OutputHash> { + fn run(&self, task: &runner::Task) -> Result<Option<OutputHash>> { let (reply_tx, reply_rx) = ipc::channel().expect("IPC channel creation failed"); self.channel diff --git a/src/runner/runc/run.rs b/src/runner/runc/run.rs index 3a1d9fc..bd32bdb 100644 --- a/src/runner/runc/run.rs +++ b/src/runner/runc/run.rs @@ -124,7 +124,7 @@ fn unpack_dependencies(task: &runner::Task) -> Result<()> { Ok(()) } -fn collect_output(task: &runner::Task) -> Result<OutputHash> { +fn collect_output(task: &runner::Task) -> Result<Option<OutputHash>> { let source = paths::join(&[ &paths::task_tmp_dir(&task.input_hash), paths::TASK_TMP_DEST_SUBDIR, @@ -147,10 +147,10 @@ fn collect_output(task: &runner::Task) -> Result<OutputHash> { util::fs::rename(filename, paths::output_filename(&hash))?; - Ok(hash) + Ok(Some(hash)) } -pub fn handle_task(task: runner::Task) -> Result<OutputHash> { +pub fn handle_task(task: runner::Task) -> Result<Option<OutputHash>> { init_task(&task).context("Failed to initialize task")?; unpack_dependencies(&task).context("Failed to unpack dependencies")?; |