From fddeb158b550a938358ee8251741514b362c68b6 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 30 Oct 2021 10:20:29 +0200 Subject: runner: allow passing a map of pins with a task submission Pins allow to use fixed versions of dependencies. They are stored separately from regular dependency archives. --- crates/runner/src/task.rs | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'crates/runner/src/task.rs') 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>(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>(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>(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>(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 { @@ -313,7 +321,7 @@ fn unpack_dependencies(input_hash: &InputHash, task: &Task) -> Result )?; } Dependency::Task { output, path } => { - unpack_dependency(paths::archive_filename(output), output)?; + unpack_dependency(task, output)?; ret.entry(path.clone()).or_default().push(*output); } } -- cgit v1.2.3