use anyhow::{Context, Result};
use std::path::{Path, PathBuf};
const SEEDS_TARZST: &[u8] = include_bytes!(concat!(env!("OUT_DIR"), "/setup-seeds.tar.zst"));
pub fn ensure_seeds_extracted(cache_root: &Path) -> Result<PathBuf> {
use sha2::{Digest, Sha256};
let mut h = Sha256::new();
h.update(SEEDS_TARZST);
let content_hash = format!("{:x}", h.finalize());
let short_hash = &content_hash[..12];
let cache_dir = cache_root
.join("seeds-cache")
.join(format!("{}-{}", env!("CARGO_PKG_VERSION"), short_hash));
let sentinel = cache_dir.join(".extracted");
if sentinel.exists() {
return Ok(cache_dir);
}
std::fs::create_dir_all(&cache_dir)
.with_context(|| format!("create_dir_all({})", cache_dir.display()))?;
let decoder = zstd::Decoder::new(SEEDS_TARZST)
.context("zstd decoder for embedded seeds")?;
let mut archive = tar::Archive::new(decoder);
archive
.unpack(&cache_dir)
.with_context(|| format!("unpack to {}", cache_dir.display()))?;
#[cfg(target_os = "macos")]
remove_quarantine_recursive(&cache_dir);
std::fs::write(&sentinel, b"").context("write sentinel")?;
Ok(cache_dir)
}
#[cfg(target_os = "macos")]
fn remove_quarantine_recursive(dir: &std::path::Path) {
use std::process::Command;
let _ = Command::new("xattr")
.args(["-rd", "com.apple.quarantine"])
.arg(dir)
.output();
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn first_call_extracts_and_creates_sentinel() {
let dir = tempfile::tempdir().unwrap();
let extracted = ensure_seeds_extracted(dir.path()).unwrap();
assert!(extracted.join(".extracted").exists());
assert!(
extracted.join("skills").join("README.md").exists()
|| extracted.join("README.md").exists()
|| extracted.read_dir().unwrap().count() > 0
);
}
#[test]
fn second_call_is_idempotent() {
let dir = tempfile::tempdir().unwrap();
let first = ensure_seeds_extracted(dir.path()).unwrap();
let second = ensure_seeds_extracted(dir.path()).unwrap();
assert_eq!(first, second);
}
}