use std::collections::BTreeSet;
use std::fs;
use std::path::Path;
const CACHE_CRITICAL_FILES: &[&str] = &[
"src/cache.rs",
"src/content_store.rs",
"src/trigram.rs",
"src/indexer.rs",
"src/symbol_cache.rs",
"src/models.rs",
"src/dependency.rs",
];
fn main() {
let schema_hash = compute_schema_hash();
println!("cargo:rustc-env=CACHE_SCHEMA_HASH={}", schema_hash);
for file in CACHE_CRITICAL_FILES {
println!("cargo:rerun-if-changed={}", file);
}
println!("cargo:warning=Cache schema hash: {}", schema_hash);
}
fn compute_schema_hash() -> String {
let mut hasher = blake3::Hasher::new();
let files: BTreeSet<String> = CACHE_CRITICAL_FILES.iter().map(|s| s.to_string()).collect();
for file_path in &files {
let path = Path::new(file_path);
if !path.exists() {
panic!("Cache-critical file not found: {}", file_path);
}
let content =
fs::read(path).unwrap_or_else(|e| panic!("Failed to read {}: {}", file_path, e));
hasher.update(file_path.as_bytes());
hasher.update(&content);
}
let hash = hasher.finalize();
hash.as_bytes()[..8]
.iter()
.map(|b| format!("{:02x}", b))
.collect::<String>()
}