summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/runner/runc.rs3
-rw-r--r--src/runner/runc/run.rs16
2 files changed, 16 insertions, 3 deletions
diff --git a/src/runner/runc.rs b/src/runner/runc.rs
index ded73fa..0964ee9 100644
--- a/src/runner/runc.rs
+++ b/src/runner/runc.rs
@@ -7,11 +7,14 @@ use std::{io, process};
use ipc_channel::ipc;
use nix::{sys::signal, unistd};
use serde::{Deserialize, Serialize};
+use sha2::Sha256;
use crate::types::*;
use crate::unshare;
use crate::util::ipc::CheckDisconnect;
+pub type OutputHash = Sha256;
+
#[derive(Debug, Deserialize, Serialize)]
struct Request(TaskRef, Task, ipc::IpcSender<run::Error>);
diff --git a/src/runner/runc/run.rs b/src/runner/runc/run.rs
index 3fe51e1..14149d2 100644
--- a/src/runner/runc/run.rs
+++ b/src/runner/runc/run.rs
@@ -11,6 +11,8 @@ use nix::{
unistd,
};
use serde::{Deserialize, Serialize};
+use sha2::{digest, Digest};
+use tee_readwrite::TeeWriter;
use crate::{
types::*,
@@ -18,7 +20,7 @@ use crate::{
util::{self, ToIOResult},
};
-use super::spec;
+use super::{spec, OutputHash};
#[derive(Debug, Deserialize, Serialize)]
pub enum Error {
@@ -67,13 +69,21 @@ fn output_filename(task: TaskRef) -> PathBuf {
Path::new("build/state").join(format!("{}.tar", task))
}
-fn collect_output(task: TaskRef, task_def: Task) -> Result<(), io::Error> {
+fn collect_output(task: TaskRef, task_def: Task) -> Result<digest::Output<OutputHash>, io::Error> {
let file = util::unix::create_as(
output_filename(task),
Some(unshare::BUILD_UID),
Some(unshare::BUILD_GID),
)?;
- util::tar::pack(file, "build/tmp/runc/workdir", task_def.output.iter())?.sync_all()
+ let hasher = OutputHash::default();
+ let writer = TeeWriter::new(file, hasher);
+
+ let writer = util::tar::pack(writer, "build/tmp/runc/workdir", task_def.output.iter())?;
+ let (file, hasher) = writer.into_inner();
+
+ file.sync_all()?;
+
+ Ok(hasher.finalize())
}
pub fn handle_task(task: TaskRef, task_def: Task) -> Result<(), Error> {