diff --git a/src/cook/cook_build.rs b/src/cook/cook_build.rs index 5468451a3..e6fdf524d 100644 --- a/src/cook/cook_build.rs +++ b/src/cook/cook_build.rs @@ -518,9 +518,20 @@ fn build_deps_dir( let sysroot_modified = modified_dir(&tags_dir).unwrap_or(SystemTime::UNIX_EPOCH); if sysroot_modified < source_modified || sysroot_modified < deps_modified - || dep_pkgars - .iter() - .any(|(pkg, _)| !tags_dir.join(pkg.as_str()).is_file()) + || !check_files_present( + &tags_dir, + &dep_pkgars + .iter() + .map(|(name, _)| { + // TODO: without_host should just return as_str + if name.is_host() { + &name.as_str()["host:".len()..] + } else { + name.as_str() + } + }) + .collect(), + )? { log_to_pty!(logger, "DEBUG: updating '{}'", deps_dir.display()); remove_all(deps_dir)?; diff --git a/src/cook/fs.rs b/src/cook/fs.rs index a75c8bdab..3d81d77de 100644 --- a/src/cook/fs.rs +++ b/src/cook/fs.rs @@ -1,5 +1,6 @@ use serde::Serialize; use std::{ + collections::BTreeSet, fs, io::{self, Write}, path::{Path, PathBuf}, @@ -189,6 +190,32 @@ pub fn modified_dir_ignore_git(dir: &Path) -> Result { }) } +pub fn check_files_present(dir: &Path, expected_files: &BTreeSet<&str>) -> Result { + let entries = fs::read_dir(dir) + .map_err(|err| format!("failed to get list files of '{}': {:?}", dir.display(), err))?; + + let mut matches = 0; + for entry_res in entries { + let entry = entry_res + .map_err(|err| format!("failed to get file entry of '{}': {:?}", dir.display(), err))?; + + let filename = entry.file_name(); + let Some(filename) = filename.to_str() else { + continue; + }; + + if expected_files.contains(&filename) { + matches += 1 + } else if filename.starts_with('.') { + continue; + } else { + return Ok(false); + } + } + + Ok(matches == expected_files.len()) +} + pub fn rename(src: &Path, dst: &Path) -> Result<(), String> { fs::rename(src, dst).map_err(|err| { format!(