summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/executor.rs15
-rw-r--r--src/runner/mod.rs2
-rw-r--r--src/runner/runc.rs4
-rw-r--r--src/runner/runc/run.rs6
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")?;