summaryrefslogtreecommitdiffstats
path: root/crates/runner/src/task.rs
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2021-10-30 10:20:29 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2021-11-01 19:01:09 +0100
commitfddeb158b550a938358ee8251741514b362c68b6 (patch)
treec4dfe6f1500dd3ad159c3f45b7e975e5d5b03dd4 /crates/runner/src/task.rs
parent7a0bf8027b93e7e3f4e6887c0d116f471629cacd (diff)
downloadrebel-fddeb158b550a938358ee8251741514b362c68b6.tar
rebel-fddeb158b550a938358ee8251741514b362c68b6.zip
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.
Diffstat (limited to 'crates/runner/src/task.rs')
-rw-r--r--crates/runner/src/task.rs22
1 files changed, 15 insertions, 7 deletions
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);
}
}