use std::path::Path;
use crate::cache_paths;
use crate::constants::LINTS_HISTORY_JSONL;
use crate::constants::LINTS_LATEST_JSON;
use crate::project::AbsolutePath;
pub fn cache_root() -> AbsolutePath { cache_paths::lint_runs_root() }
pub fn project_key(project_root: &Path) -> String {
use sha2::Digest as _;
let path_str = project_root.to_string_lossy();
let name = project_root
.file_name()
.and_then(|name| name.to_str())
.unwrap_or("project");
let digest = sha2::Sha256::digest(path_str.as_bytes());
let hex = digest
.iter()
.take(8)
.fold(String::with_capacity(16), |mut acc, b| {
use std::fmt::Write as _;
let _ = write!(acc, "{b:02x}");
acc
});
format!("{name}-{hex}")
}
pub fn project_dir(project_root: &Path) -> AbsolutePath {
cache_root().join(project_key(project_root)).into()
}
pub fn project_dir_under(cache_root: &Path, project_root: &Path) -> AbsolutePath {
cache_root.join(project_key(project_root)).into()
}
pub fn output_dir_under(cache_root: &Path, project_root: &Path) -> AbsolutePath {
project_dir_under(cache_root, project_root)
}
pub fn latest_path_under(cache_root: &Path, project_root: &Path) -> AbsolutePath {
project_dir_under(cache_root, project_root)
.join(LINTS_LATEST_JSON)
.into()
}
pub fn history_path_under(cache_root: &Path, project_root: &Path) -> AbsolutePath {
project_dir_under(cache_root, project_root)
.join(LINTS_HISTORY_JSONL)
.into()
}
#[cfg(test)]
#[allow(clippy::unwrap_used, reason = "tests")]
mod tests {
use super::*;
#[test]
fn project_key_matches_shasum_cli() {
let key = project_key(Path::new("/Users/natemccoy/rust/cargo-mend"));
assert_eq!(key, "cargo-mend-c76947976a369618");
}
}