use std::path::{Path, PathBuf};
use std::process::Command;
pub fn resolve_git_local_path() -> Option<PathBuf> {
let output = Command::new("git")
.args(["rev-parse", "--git-dir"])
.output()
.ok()?;
if !output.status.success() {
return None;
}
let git_dir = String::from_utf8_lossy(&output.stdout).trim().to_string();
if git_dir.is_empty() {
return None;
}
let git_dir_path = PathBuf::from(&git_dir);
let absolute_git_dir = if git_dir_path.is_absolute() {
git_dir_path
} else {
std::env::current_dir()
.ok()?
.join(git_dir_path)
.canonicalize()
.ok()?
};
let memory_index_dir = absolute_git_dir.join("memory-index");
let db_path = memory_index_dir.join("csm.db");
Some(db_path)
}
pub fn ensure_git_local_dir(path: &Path) -> std::io::Result<()> {
if let Some(parent) = path.parent() {
if !parent.exists() {
std::fs::create_dir_all(parent)?;
}
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
use std::env;
#[test]
fn test_resolve_git_local_path_in_git_repo() {
let path = resolve_git_local_path();
if path.is_none() {
eprintln!(
"Skipping path assertions - git-local path not available (sandboxed environment)"
);
return;
}
let path = path.unwrap();
assert!(
path.ends_with("csm.db"),
"Path should end with csm.db: {:?}",
path
);
assert!(
path.to_string_lossy().contains("memory-index"),
"Path should contain memory-index: {:?}",
path
);
}
#[test]
fn test_resolve_git_local_path_outside_git_repo() {
let original_dir = env::current_dir().unwrap();
let temp_dir = tempfile::tempdir().unwrap();
env::set_current_dir(temp_dir.path()).unwrap();
let path = resolve_git_local_path();
if let Some(path) = path {
assert!(
path.ends_with("csm.db"),
"If path is returned, it should end with csm.db: {:?}",
path
);
}
env::set_current_dir(original_dir).unwrap();
}
#[test]
fn test_ensure_git_local_dir() {
let temp_dir = tempfile::tempdir().unwrap();
let db_path = temp_dir
.path()
.join(".git")
.join("memory-index")
.join("csm.db");
assert!(!db_path.exists());
ensure_git_local_dir(&db_path).unwrap();
assert!(db_path.parent().unwrap().exists());
}
#[test]
fn test_resolve_git_local_path_structure() {
let test_git_dir = PathBuf::from("/tmp/test/.git");
let memory_index_dir = test_git_dir.join("memory-index");
let db_path = memory_index_dir.join("csm.db");
assert!(db_path.ends_with("csm.db"));
assert!(db_path.to_string_lossy().contains("memory-index"));
assert!(db_path.to_string_lossy().contains(".git"));
}
}