[feat] enhance models_dir_path
with XDG and HOME fallbacks; improve related tests
This commit is contained in:
44
src/main.rs
44
src/main.rs
@@ -17,17 +17,34 @@ mod models;
|
|||||||
static LAST_MODEL_WRITTEN: AtomicBool = AtomicBool::new(false);
|
static LAST_MODEL_WRITTEN: AtomicBool = AtomicBool::new(false);
|
||||||
|
|
||||||
fn models_dir_path() -> PathBuf {
|
fn models_dir_path() -> PathBuf {
|
||||||
|
// Highest priority: explicit override
|
||||||
if let Ok(p) = env::var("POLYSCRIBE_MODELS_DIR") {
|
if let Ok(p) = env::var("POLYSCRIBE_MODELS_DIR") {
|
||||||
let pb = PathBuf::from(p);
|
let pb = PathBuf::from(p);
|
||||||
if !pb.as_os_str().is_empty() {
|
if !pb.as_os_str().is_empty() {
|
||||||
return pb;
|
return pb;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// In debug builds, keep local ./models for convenience
|
||||||
if cfg!(debug_assertions) {
|
if cfg!(debug_assertions) {
|
||||||
PathBuf::from("models")
|
return PathBuf::from("models");
|
||||||
} else {
|
|
||||||
PathBuf::from("/usr/share/polyscribe/models")
|
|
||||||
}
|
}
|
||||||
|
// In release builds, choose a user-writable data directory
|
||||||
|
if let Ok(xdg) = env::var("XDG_DATA_HOME") {
|
||||||
|
if !xdg.is_empty() {
|
||||||
|
return PathBuf::from(xdg).join("polyscribe").join("models");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if let Ok(home) = env::var("HOME") {
|
||||||
|
if !home.is_empty() {
|
||||||
|
return PathBuf::from(home)
|
||||||
|
.join(".local")
|
||||||
|
.join("share")
|
||||||
|
.join("polyscribe")
|
||||||
|
.join("models");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Last resort fallback
|
||||||
|
PathBuf::from("models")
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Parser, Debug)]
|
#[derive(Parser, Debug)]
|
||||||
@@ -714,7 +731,26 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
#[cfg(not(debug_assertions))]
|
#[cfg(not(debug_assertions))]
|
||||||
fn test_models_dir_path_default_release() {
|
fn test_models_dir_path_default_release() {
|
||||||
|
// Ensure override is cleared
|
||||||
unsafe { std_env::remove_var("POLYSCRIBE_MODELS_DIR"); }
|
unsafe { std_env::remove_var("POLYSCRIBE_MODELS_DIR"); }
|
||||||
assert_eq!(models_dir_path(), PathBuf::from("/usr/share/polyscribe/models"));
|
// Prefer XDG_DATA_HOME when set
|
||||||
|
let tmp_xdg = tempfile::tempdir().unwrap();
|
||||||
|
unsafe {
|
||||||
|
std_env::set_var("XDG_DATA_HOME", tmp_xdg.path());
|
||||||
|
std_env::remove_var("HOME");
|
||||||
|
}
|
||||||
|
assert_eq!(models_dir_path(), tmp_xdg.path().join("polyscribe").join("models"));
|
||||||
|
// Else fall back to HOME/.local/share
|
||||||
|
let tmp_home = tempfile::tempdir().unwrap();
|
||||||
|
unsafe {
|
||||||
|
std_env::remove_var("XDG_DATA_HOME");
|
||||||
|
std_env::set_var("HOME", tmp_home.path());
|
||||||
|
}
|
||||||
|
assert_eq!(models_dir_path(), tmp_home.path().join(".local").join("share").join("polyscribe").join("models"));
|
||||||
|
// Cleanup
|
||||||
|
unsafe {
|
||||||
|
std_env::remove_var("XDG_DATA_HOME");
|
||||||
|
std_env::remove_var("HOME");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -341,15 +341,32 @@ fn compute_file_sha256_hex(path: &Path) -> Result<String> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn models_dir_path() -> std::path::PathBuf {
|
fn models_dir_path() -> std::path::PathBuf {
|
||||||
|
// Highest priority: explicit override
|
||||||
if let Ok(p) = env::var("POLYSCRIBE_MODELS_DIR") {
|
if let Ok(p) = env::var("POLYSCRIBE_MODELS_DIR") {
|
||||||
let pb = std::path::PathBuf::from(p);
|
let pb = std::path::PathBuf::from(p);
|
||||||
if !pb.as_os_str().is_empty() { return pb; }
|
if !pb.as_os_str().is_empty() { return pb; }
|
||||||
}
|
}
|
||||||
|
// In debug builds, keep local ./models for convenience
|
||||||
if cfg!(debug_assertions) {
|
if cfg!(debug_assertions) {
|
||||||
std::path::PathBuf::from("models")
|
return std::path::PathBuf::from("models");
|
||||||
} else {
|
|
||||||
std::path::PathBuf::from("/usr/share/polyscribe/models")
|
|
||||||
}
|
}
|
||||||
|
// In release builds, choose a user-writable data directory
|
||||||
|
if let Ok(xdg) = env::var("XDG_DATA_HOME") {
|
||||||
|
if !xdg.is_empty() {
|
||||||
|
return std::path::PathBuf::from(xdg).join("polyscribe").join("models");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if let Ok(home) = env::var("HOME") {
|
||||||
|
if !home.is_empty() {
|
||||||
|
return std::path::PathBuf::from(home)
|
||||||
|
.join(".local")
|
||||||
|
.join("share")
|
||||||
|
.join("polyscribe")
|
||||||
|
.join("models");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Last resort fallback
|
||||||
|
std::path::PathBuf::from("models")
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn run_interactive_model_downloader() -> Result<()> {
|
pub fn run_interactive_model_downloader() -> Result<()> {
|
||||||
@@ -689,6 +706,23 @@ mod tests {
|
|||||||
#[cfg(not(debug_assertions))]
|
#[cfg(not(debug_assertions))]
|
||||||
fn test_models_dir_path_default_release_models_mod() {
|
fn test_models_dir_path_default_release_models_mod() {
|
||||||
unsafe { std::env::remove_var("POLYSCRIBE_MODELS_DIR"); }
|
unsafe { std::env::remove_var("POLYSCRIBE_MODELS_DIR"); }
|
||||||
assert_eq!(super::models_dir_path(), std::path::PathBuf::from("/usr/share/polyscribe/models"));
|
// With XDG_DATA_HOME set
|
||||||
|
let tmp_xdg = tempfile::tempdir().unwrap();
|
||||||
|
unsafe {
|
||||||
|
std::env::set_var("XDG_DATA_HOME", tmp_xdg.path());
|
||||||
|
std::env::remove_var("HOME");
|
||||||
|
}
|
||||||
|
assert_eq!(super::models_dir_path(), std::path::PathBuf::from(tmp_xdg.path()).join("polyscribe").join("models"));
|
||||||
|
// With HOME fallback
|
||||||
|
let tmp_home = tempfile::tempdir().unwrap();
|
||||||
|
unsafe {
|
||||||
|
std::env::remove_var("XDG_DATA_HOME");
|
||||||
|
std::env::set_var("HOME", tmp_home.path());
|
||||||
|
}
|
||||||
|
assert_eq!(super::models_dir_path(), std::path::PathBuf::from(tmp_home.path()).join(".local").join("share").join("polyscribe").join("models"));
|
||||||
|
unsafe {
|
||||||
|
std::env::remove_var("XDG_DATA_HOME");
|
||||||
|
std::env::remove_var("HOME");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user