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);
}
let git_sha = std::process::Command::new("git")
.args(["rev-parse", "--short", "HEAD"])
.output()
.ok()
.filter(|o| o.status.success())
.and_then(|o| String::from_utf8(o.stdout).ok())
.map(|s| s.trim().to_string())
.filter(|s| !s.is_empty())
.unwrap_or_else(|| "unknown".to_string());
println!("cargo:rustc-env=REFLEX_GIT_SHA={}", git_sha);
for p in [".git/HEAD", ".git/logs/HEAD"] {
if Path::new(p).exists() {
println!("cargo:rerun-if-changed={}", p);
}
}
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>()
}