diff options
Diffstat (limited to 'crates/runner/src')
-rw-r--r-- | crates/runner/src/paths.rs | 5 | ||||
-rw-r--r-- | crates/runner/src/task.rs | 22 |
2 files changed, 20 insertions, 7 deletions
diff --git a/crates/runner/src/paths.rs b/crates/runner/src/paths.rs index 2e174df..b46d1bb 100644 --- a/crates/runner/src/paths.rs +++ b/crates/runner/src/paths.rs @@ -43,6 +43,7 @@ use common::string_hash::*; pub const ROOTFS_ARCHIVE: &str = "build/rootfs.tar"; pub const DOWNLOADS_DIR: &str = "build/downloads"; +pub const PIN_DIR: &str = "build/pinned"; pub const TMP_DIR: &str = "build/tmp"; pub const DEV_DIR: &str = "build/tmp/dev"; @@ -116,3 +117,7 @@ pub fn archive_tmp_filename(hash: &InputHash) -> String { pub fn archive_filename(hash: &ArchiveHash) -> String { join(&[OUTPUT_STATE_DIR, &format!("{}.tar", hash)]) } + +pub fn pinned_archive_filename(name: &str) -> String { + join(&[PIN_DIR, &format!("{}.tar", name)]) +} diff --git a/crates/runner/src/task.rs b/crates/runner/src/task.rs index 174768c..c43fc2f 100644 --- a/crates/runner/src/task.rs +++ b/crates/runner/src/task.rs @@ -252,9 +252,19 @@ fn cleanup_task(input_hash: &InputHash) -> Result<()> { Ok(()) } -fn unpack_dependency<P: AsRef<Path>>(filename: P, hash: &ArchiveHash) -> Result<()> { +fn get_archive_filename(task: &Task, hash: &ArchiveHash) -> String { + if let Some(pinned_name) = task.pins.get(hash) { + paths::pinned_archive_filename(pinned_name) + } else { + paths::archive_filename(hash) + } +} + +fn unpack_dependency(task: &Task, hash: &ArchiveHash) -> Result<()> { let _lock = unix::lock(paths::depend_lock_filename(hash), true, true); + let filename = get_archive_filename(task, hash); + let dest = paths::depend_dir(hash); if Path::new(&dest).is_dir() { return Ok(()); @@ -264,7 +274,7 @@ fn unpack_dependency<P: AsRef<Path>>(filename: P, hash: &ArchiveHash) -> Result< let tmp_dest = paths::depend_tmp_dir(hash); fs::ensure_removed(&tmp_dest)?; - let file = fs::open(filename.as_ref())?; + let file = fs::open(&filename)?; let hasher = ArchiveHasher::new(); let buffered_hasher = BufWriter::with_capacity(16 * 1024 * 1024, hasher); let mut reader = TeeReader::new(file, buffered_hasher, false); @@ -282,9 +292,7 @@ fn unpack_dependency<P: AsRef<Path>>(filename: P, hash: &ArchiveHash) -> Result< if &actual_hash != hash { return Err(Error::new(format!( "Incorrect file hash for {:?} (expected: {}, actual: {})", - filename.as_ref(), - hash, - actual_hash + filename, hash, actual_hash, ))); } @@ -292,7 +300,7 @@ fn unpack_dependency<P: AsRef<Path>>(filename: P, hash: &ArchiveHash) -> Result< Ok(()) })() - .with_context(|| format!("Failed to unpack {:?}", filename.as_ref(),)) + .with_context(|| format!("Failed to unpack {:?}", filename)) } fn unpack_dependencies(input_hash: &InputHash, task: &Task) -> Result<DependMap> { @@ -313,7 +321,7 @@ fn unpack_dependencies(input_hash: &InputHash, task: &Task) -> Result<DependMap> )?; } Dependency::Task { output, path } => { - unpack_dependency(paths::archive_filename(output), output)?; + unpack_dependency(task, output)?; ret.entry(path.clone()).or_default().push(*output); } } |