Merge 196238d03e
into 0e575b2809
This commit is contained in:
commit
b546a0c875
1 changed files with 86 additions and 31 deletions
|
@ -6,6 +6,26 @@ use std::sync::OnceLock;
|
||||||
|
|
||||||
pub use util::paths::home_dir;
|
pub use util::paths::home_dir;
|
||||||
|
|
||||||
|
/// Macro to DRY up portable directory logic.
|
||||||
|
/// Usage: portable_dir!("dirname", fallback_expr)
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! portable_dir {
|
||||||
|
($name:expr, $fallback:expr) => {{
|
||||||
|
use std::fs;
|
||||||
|
if let Ok(exe_path) = std::env::current_exe() {
|
||||||
|
if let Some(exe_dir) = exe_path.parent() {
|
||||||
|
let portable_path = exe_dir.join($name);
|
||||||
|
if fs::metadata(&portable_path)
|
||||||
|
.map(|m| m.is_dir())
|
||||||
|
.unwrap_or(false)
|
||||||
|
{
|
||||||
|
return portable_path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$fallback
|
||||||
|
}};
|
||||||
|
}
|
||||||
/// A default editorconfig file name to use when resolving project settings.
|
/// A default editorconfig file name to use when resolving project settings.
|
||||||
pub const EDITORCONFIG_NAME: &str = ".editorconfig";
|
pub const EDITORCONFIG_NAME: &str = ".editorconfig";
|
||||||
|
|
||||||
|
@ -195,10 +215,30 @@ pub fn crashes_retired_dir() -> &'static Option<PathBuf> {
|
||||||
CRASHES_RETIRED_DIR.get_or_init(|| crashes_dir().as_ref().map(|dir| dir.join("Retired")))
|
CRASHES_RETIRED_DIR.get_or_init(|| crashes_dir().as_ref().map(|dir| dir.join("Retired")))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the path to the `settings.json` file.
|
/// Returns the path to the `settings.json` file, preferring a portable ./settings.json next to the executable if present.
|
||||||
|
|
||||||
pub fn settings_file() -> &'static PathBuf {
|
pub fn settings_file() -> &'static PathBuf {
|
||||||
|
use std::fs;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
static SETTINGS_FILE: OnceLock<PathBuf> = OnceLock::new();
|
static SETTINGS_FILE: OnceLock<PathBuf> = OnceLock::new();
|
||||||
SETTINGS_FILE.get_or_init(|| config_dir().join("settings.json"))
|
|
||||||
|
SETTINGS_FILE.get_or_init(|| {
|
||||||
|
// Try portable mode: ./settings.json next to the executable
|
||||||
|
if let Ok(exe_path) = std::env::current_exe() {
|
||||||
|
if let Some(exe_dir) = exe_path.parent() {
|
||||||
|
let portable_path = exe_dir.join("settings.json");
|
||||||
|
if fs::metadata(&portable_path)
|
||||||
|
.map(|m| m.is_file())
|
||||||
|
.unwrap_or(false)
|
||||||
|
{
|
||||||
|
return portable_path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Fallback to config dir
|
||||||
|
config_dir().join("settings.json")
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the path to the global settings file.
|
/// Returns the path to the global settings file.
|
||||||
|
@ -242,7 +282,7 @@ pub fn debug_scenarios_file() -> &'static PathBuf {
|
||||||
/// This is where installed extensions are stored.
|
/// This is where installed extensions are stored.
|
||||||
pub fn extensions_dir() -> &'static PathBuf {
|
pub fn extensions_dir() -> &'static PathBuf {
|
||||||
static EXTENSIONS_DIR: OnceLock<PathBuf> = OnceLock::new();
|
static EXTENSIONS_DIR: OnceLock<PathBuf> = OnceLock::new();
|
||||||
EXTENSIONS_DIR.get_or_init(|| data_dir().join("extensions"))
|
EXTENSIONS_DIR.get_or_init(|| portable_dir!("extensions", data_dir().join("extensions")))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the path to the extensions directory.
|
/// Returns the path to the extensions directory.
|
||||||
|
@ -250,7 +290,8 @@ pub fn extensions_dir() -> &'static PathBuf {
|
||||||
/// This is where installed extensions are stored on a remote.
|
/// This is where installed extensions are stored on a remote.
|
||||||
pub fn remote_extensions_dir() -> &'static PathBuf {
|
pub fn remote_extensions_dir() -> &'static PathBuf {
|
||||||
static EXTENSIONS_DIR: OnceLock<PathBuf> = OnceLock::new();
|
static EXTENSIONS_DIR: OnceLock<PathBuf> = OnceLock::new();
|
||||||
EXTENSIONS_DIR.get_or_init(|| data_dir().join("remote_extensions"))
|
EXTENSIONS_DIR
|
||||||
|
.get_or_init(|| portable_dir!("remote_extensions", data_dir().join("remote_extensions")))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the path to the extensions directory.
|
/// Returns the path to the extensions directory.
|
||||||
|
@ -258,7 +299,12 @@ pub fn remote_extensions_dir() -> &'static PathBuf {
|
||||||
/// This is where installed extensions are stored on a remote.
|
/// This is where installed extensions are stored on a remote.
|
||||||
pub fn remote_extensions_uploads_dir() -> &'static PathBuf {
|
pub fn remote_extensions_uploads_dir() -> &'static PathBuf {
|
||||||
static UPLOAD_DIR: OnceLock<PathBuf> = OnceLock::new();
|
static UPLOAD_DIR: OnceLock<PathBuf> = OnceLock::new();
|
||||||
UPLOAD_DIR.get_or_init(|| remote_extensions_dir().join("uploads"))
|
UPLOAD_DIR.get_or_init(|| {
|
||||||
|
portable_dir!(
|
||||||
|
"remote_extensions/uploads",
|
||||||
|
remote_extensions_dir().join("uploads")
|
||||||
|
)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the path to the themes directory.
|
/// Returns the path to the themes directory.
|
||||||
|
@ -266,13 +312,13 @@ pub fn remote_extensions_uploads_dir() -> &'static PathBuf {
|
||||||
/// This is where themes that are not provided by extensions are stored.
|
/// This is where themes that are not provided by extensions are stored.
|
||||||
pub fn themes_dir() -> &'static PathBuf {
|
pub fn themes_dir() -> &'static PathBuf {
|
||||||
static THEMES_DIR: OnceLock<PathBuf> = OnceLock::new();
|
static THEMES_DIR: OnceLock<PathBuf> = OnceLock::new();
|
||||||
THEMES_DIR.get_or_init(|| config_dir().join("themes"))
|
THEMES_DIR.get_or_init(|| portable_dir!("themes", config_dir().join("themes")))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the path to the snippets directory.
|
/// Returns the path to the snippets directory.
|
||||||
pub fn snippets_dir() -> &'static PathBuf {
|
pub fn snippets_dir() -> &'static PathBuf {
|
||||||
static SNIPPETS_DIR: OnceLock<PathBuf> = OnceLock::new();
|
static SNIPPETS_DIR: OnceLock<PathBuf> = OnceLock::new();
|
||||||
SNIPPETS_DIR.get_or_init(|| config_dir().join("snippets"))
|
SNIPPETS_DIR.get_or_init(|| portable_dir!("snippets", config_dir().join("snippets")))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the path to the contexts directory.
|
/// Returns the path to the contexts directory.
|
||||||
|
@ -281,11 +327,13 @@ pub fn snippets_dir() -> &'static PathBuf {
|
||||||
pub fn contexts_dir() -> &'static PathBuf {
|
pub fn contexts_dir() -> &'static PathBuf {
|
||||||
static CONTEXTS_DIR: OnceLock<PathBuf> = OnceLock::new();
|
static CONTEXTS_DIR: OnceLock<PathBuf> = OnceLock::new();
|
||||||
CONTEXTS_DIR.get_or_init(|| {
|
CONTEXTS_DIR.get_or_init(|| {
|
||||||
if cfg!(target_os = "macos") {
|
portable_dir!("conversations", {
|
||||||
config_dir().join("conversations")
|
if cfg!(target_os = "macos") {
|
||||||
} else {
|
config_dir().join("conversations")
|
||||||
data_dir().join("conversations")
|
} else {
|
||||||
}
|
data_dir().join("conversations")
|
||||||
|
}
|
||||||
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -295,11 +343,13 @@ pub fn contexts_dir() -> &'static PathBuf {
|
||||||
pub fn prompts_dir() -> &'static PathBuf {
|
pub fn prompts_dir() -> &'static PathBuf {
|
||||||
static PROMPTS_DIR: OnceLock<PathBuf> = OnceLock::new();
|
static PROMPTS_DIR: OnceLock<PathBuf> = OnceLock::new();
|
||||||
PROMPTS_DIR.get_or_init(|| {
|
PROMPTS_DIR.get_or_init(|| {
|
||||||
if cfg!(target_os = "macos") {
|
portable_dir!("prompts", {
|
||||||
config_dir().join("prompts")
|
if cfg!(target_os = "macos") {
|
||||||
} else {
|
config_dir().join("prompts")
|
||||||
data_dir().join("prompts")
|
} else {
|
||||||
}
|
data_dir().join("prompts")
|
||||||
|
}
|
||||||
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -321,11 +371,13 @@ pub fn prompt_overrides_dir(repo_path: Option<&Path>) -> PathBuf {
|
||||||
static PROMPT_TEMPLATES_DIR: OnceLock<PathBuf> = OnceLock::new();
|
static PROMPT_TEMPLATES_DIR: OnceLock<PathBuf> = OnceLock::new();
|
||||||
PROMPT_TEMPLATES_DIR
|
PROMPT_TEMPLATES_DIR
|
||||||
.get_or_init(|| {
|
.get_or_init(|| {
|
||||||
if cfg!(target_os = "macos") {
|
portable_dir!("prompt_overrides", {
|
||||||
config_dir().join("prompt_overrides")
|
if cfg!(target_os = "macos") {
|
||||||
} else {
|
config_dir().join("prompt_overrides")
|
||||||
data_dir().join("prompt_overrides")
|
} else {
|
||||||
}
|
data_dir().join("prompt_overrides")
|
||||||
|
}
|
||||||
|
})
|
||||||
})
|
})
|
||||||
.clone()
|
.clone()
|
||||||
}
|
}
|
||||||
|
@ -336,11 +388,13 @@ pub fn prompt_overrides_dir(repo_path: Option<&Path>) -> PathBuf {
|
||||||
pub fn embeddings_dir() -> &'static PathBuf {
|
pub fn embeddings_dir() -> &'static PathBuf {
|
||||||
static EMBEDDINGS_DIR: OnceLock<PathBuf> = OnceLock::new();
|
static EMBEDDINGS_DIR: OnceLock<PathBuf> = OnceLock::new();
|
||||||
EMBEDDINGS_DIR.get_or_init(|| {
|
EMBEDDINGS_DIR.get_or_init(|| {
|
||||||
if cfg!(target_os = "macos") {
|
portable_dir!("embeddings", {
|
||||||
config_dir().join("embeddings")
|
if cfg!(target_os = "macos") {
|
||||||
} else {
|
config_dir().join("embeddings")
|
||||||
data_dir().join("embeddings")
|
} else {
|
||||||
}
|
data_dir().join("embeddings")
|
||||||
|
}
|
||||||
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -349,7 +403,7 @@ pub fn embeddings_dir() -> &'static PathBuf {
|
||||||
/// This is where language servers are downloaded to for languages built-in to Zed.
|
/// This is where language servers are downloaded to for languages built-in to Zed.
|
||||||
pub fn languages_dir() -> &'static PathBuf {
|
pub fn languages_dir() -> &'static PathBuf {
|
||||||
static LANGUAGES_DIR: OnceLock<PathBuf> = OnceLock::new();
|
static LANGUAGES_DIR: OnceLock<PathBuf> = OnceLock::new();
|
||||||
LANGUAGES_DIR.get_or_init(|| data_dir().join("languages"))
|
LANGUAGES_DIR.get_or_init(|| portable_dir!("languages", data_dir().join("languages")))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the path to the debug adapters directory
|
/// Returns the path to the debug adapters directory
|
||||||
|
@ -365,19 +419,20 @@ pub fn debug_adapters_dir() -> &'static PathBuf {
|
||||||
/// This is where agent servers are downloaded to
|
/// This is where agent servers are downloaded to
|
||||||
pub fn agent_servers_dir() -> &'static PathBuf {
|
pub fn agent_servers_dir() -> &'static PathBuf {
|
||||||
static AGENT_SERVERS_DIR: OnceLock<PathBuf> = OnceLock::new();
|
static AGENT_SERVERS_DIR: OnceLock<PathBuf> = OnceLock::new();
|
||||||
AGENT_SERVERS_DIR.get_or_init(|| data_dir().join("agent_servers"))
|
AGENT_SERVERS_DIR
|
||||||
|
.get_or_init(|| portable_dir!("agent_servers", data_dir().join("agent_servers")))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the path to the Copilot directory.
|
/// Returns the path to the Copilot directory.
|
||||||
pub fn copilot_dir() -> &'static PathBuf {
|
pub fn copilot_dir() -> &'static PathBuf {
|
||||||
static COPILOT_DIR: OnceLock<PathBuf> = OnceLock::new();
|
static COPILOT_DIR: OnceLock<PathBuf> = OnceLock::new();
|
||||||
COPILOT_DIR.get_or_init(|| data_dir().join("copilot"))
|
COPILOT_DIR.get_or_init(|| portable_dir!("copilot", data_dir().join("copilot")))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the path to the Supermaven directory.
|
/// Returns the path to the Supermaven directory.
|
||||||
pub fn supermaven_dir() -> &'static PathBuf {
|
pub fn supermaven_dir() -> &'static PathBuf {
|
||||||
static SUPERMAVEN_DIR: OnceLock<PathBuf> = OnceLock::new();
|
static SUPERMAVEN_DIR: OnceLock<PathBuf> = OnceLock::new();
|
||||||
SUPERMAVEN_DIR.get_or_init(|| data_dir().join("supermaven"))
|
SUPERMAVEN_DIR.get_or_init(|| portable_dir!("supermaven", data_dir().join("supermaven")))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the path to the default Prettier directory.
|
/// Returns the path to the default Prettier directory.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue