fix(driver): keep custom store paths consistent
This commit is contained in:
1 parent
a1e39333a3
commit
f32298743d
5 files changed
+131
-16
No files matched your search
@@ -14,6 +14,8 @@ pub struct DriverStoreMigrationResult {
|
||||
pub driver_store_dir: Option<String>,
|
||||
pub plugin_store_dir: Option<String>,
|
||||
pub agent_store_dir: Option<String>,
|
||||
pub plugins_dir: String,
|
||||
pub agents_dir: String,
|
||||
pub migrated_plugins: bool,
|
||||
pub migrated_agents: bool,
|
||||
}
|
||||
@@ -103,7 +105,13 @@ pub async fn set_driver_store_dir(
|
||||
settings.agent_store_dir = None;
|
||||
state.storage.save_desktop_settings(&settings).await?;
|
||||
|
||||
Ok(driver_store_migration_result(settings, migrated_plugins, migrated_agents))
|
||||
Ok(driver_store_migration_result(
|
||||
settings,
|
||||
&target_plugins_dir,
|
||||
&target_agents_dir,
|
||||
migrated_plugins,
|
||||
migrated_agents,
|
||||
))
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
@@ -127,7 +135,7 @@ pub async fn set_plugin_store_dir(
|
||||
settings.plugin_store_dir = new_dir;
|
||||
state.storage.save_desktop_settings(&settings).await?;
|
||||
|
||||
Ok(driver_store_migration_result(settings, migrated_plugins, false))
|
||||
Ok(driver_store_migration_result(settings, &target_plugins_dir, ¤t_agents_dir, migrated_plugins, false))
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
@@ -152,7 +160,7 @@ pub async fn set_agent_store_dir(
|
||||
settings.agent_store_dir = new_dir;
|
||||
state.storage.save_desktop_settings(&settings).await?;
|
||||
|
||||
Ok(driver_store_migration_result(settings, false, migrated_agents))
|
||||
Ok(driver_store_migration_result(settings, ¤t_plugins_dir, &target_agents_dir, false, migrated_agents))
|
||||
}
|
||||
|
||||
fn normalize_store_dir(dir: Option<String>) -> Option<String> {
|
||||
@@ -181,6 +189,31 @@ fn default_agent_store_dir(app: &AppHandle) -> Result<PathBuf, String> {
|
||||
})
|
||||
}
|
||||
|
||||
pub(crate) fn resolve_driver_store_dirs_from_settings(
|
||||
settings: &DesktopSettings,
|
||||
data_dir: &Path,
|
||||
default_agent_dir: Option<PathBuf>,
|
||||
) -> (PathBuf, Option<PathBuf>) {
|
||||
let legacy_driver_base =
|
||||
settings.driver_store_dir.as_ref().filter(|value| !value.trim().is_empty()).map(PathBuf::from);
|
||||
let plugin_dir = settings
|
||||
.plugin_store_dir
|
||||
.as_ref()
|
||||
.filter(|value| !value.trim().is_empty())
|
||||
.map(PathBuf::from)
|
||||
.or_else(|| legacy_driver_base.as_ref().map(|base| base.join("plugins")))
|
||||
.unwrap_or_else(|| data_dir.join("plugins"));
|
||||
let agent_dir = settings
|
||||
.agent_store_dir
|
||||
.as_ref()
|
||||
.filter(|value| !value.trim().is_empty())
|
||||
.map(PathBuf::from)
|
||||
.or_else(|| legacy_driver_base.as_ref().map(|base| base.join("agents")))
|
||||
.or(default_agent_dir);
|
||||
|
||||
(plugin_dir, agent_dir)
|
||||
}
|
||||
|
||||
fn convert_legacy_driver_store(settings: &mut DesktopSettings, current_plugins_dir: &Path, current_agents_dir: &Path) {
|
||||
if settings.driver_store_dir.is_none() {
|
||||
return;
|
||||
@@ -196,6 +229,8 @@ fn convert_legacy_driver_store(settings: &mut DesktopSettings, current_plugins_d
|
||||
|
||||
fn driver_store_migration_result(
|
||||
settings: DesktopSettings,
|
||||
plugins_dir: &Path,
|
||||
agents_dir: &Path,
|
||||
migrated_plugins: bool,
|
||||
migrated_agents: bool,
|
||||
) -> DriverStoreMigrationResult {
|
||||
@@ -203,6 +238,8 @@ fn driver_store_migration_result(
|
||||
driver_store_dir: settings.driver_store_dir,
|
||||
plugin_store_dir: settings.plugin_store_dir,
|
||||
agent_store_dir: settings.agent_store_dir,
|
||||
plugins_dir: plugins_dir.to_string_lossy().to_string(),
|
||||
agents_dir: agents_dir.to_string_lossy().to_string(),
|
||||
migrated_plugins,
|
||||
migrated_agents,
|
||||
}
|
||||
@@ -352,3 +389,77 @@ fn load_native_debug_logs_from_dir(log_dir: PathBuf) -> Result<String, String> {
|
||||
}
|
||||
Ok(output)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::{driver_store_migration_result, resolve_driver_store_dirs_from_settings, DesktopSettings};
|
||||
use std::path::PathBuf;
|
||||
|
||||
#[test]
|
||||
fn plugin_store_result_uses_selected_directory_without_agent_prefix() {
|
||||
let settings = DesktopSettings {
|
||||
plugin_store_dir: Some(path("D:/develop/DBX")),
|
||||
agent_store_dir: Some(path("D:/develop/DBX/agents")),
|
||||
..Default::default()
|
||||
};
|
||||
let plugins_dir = PathBuf::from(path("D:/develop/DBX"));
|
||||
let agents_dir = PathBuf::from(path("D:/develop/DBX/agents"));
|
||||
|
||||
let result = driver_store_migration_result(settings, &plugins_dir, &agents_dir, true, false);
|
||||
|
||||
assert_eq!(result.plugin_store_dir.as_deref(), Some(path("D:/develop/DBX").as_str()));
|
||||
assert_eq!(result.plugins_dir, path("D:/develop/DBX"));
|
||||
assert_eq!(result.agents_dir, path("D:/develop/DBX/agents"));
|
||||
assert!(!result.plugins_dir.contains(&path("agents/com.dbx.app/plugins")));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn legacy_driver_store_result_keeps_plugins_and_agents_as_siblings() {
|
||||
let settings = DesktopSettings { driver_store_dir: Some(path("D:/develop/DBX")), ..Default::default() };
|
||||
let plugins_dir = PathBuf::from(path("D:/develop/DBX/plugins"));
|
||||
let agents_dir = PathBuf::from(path("D:/develop/DBX/agents"));
|
||||
|
||||
let result = driver_store_migration_result(settings, &plugins_dir, &agents_dir, true, true);
|
||||
|
||||
assert_eq!(result.driver_store_dir.as_deref(), Some(path("D:/develop/DBX").as_str()));
|
||||
assert_eq!(result.plugins_dir, path("D:/develop/DBX/plugins"));
|
||||
assert_eq!(result.agents_dir, path("D:/develop/DBX/agents"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn resolves_separate_plugin_store_dir_as_exact_selected_dir() {
|
||||
let settings = DesktopSettings {
|
||||
driver_store_dir: Some(path("D:/legacy-base")),
|
||||
plugin_store_dir: Some(path("D:/develop/DBX")),
|
||||
agent_store_dir: Some(path("D:/develop/DBX/agents")),
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
let (plugins_dir, agents_dir) = resolve_driver_store_dirs_from_settings(
|
||||
&settings,
|
||||
&PathBuf::from(path("C:/Users/lenovo/AppData/Roaming/com.dbx.app")),
|
||||
Some(PathBuf::from(path("C:/Users/lenovo/.dbx/agents"))),
|
||||
);
|
||||
|
||||
assert_eq!(plugins_dir, PathBuf::from(path("D:/develop/DBX")));
|
||||
assert_eq!(agents_dir, Some(PathBuf::from(path("D:/develop/DBX/agents"))));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn resolves_legacy_driver_store_dir_to_sibling_plugins_and_agents() {
|
||||
let settings = DesktopSettings { driver_store_dir: Some(path("D:/develop/DBX")), ..Default::default() };
|
||||
|
||||
let (plugins_dir, agents_dir) = resolve_driver_store_dirs_from_settings(
|
||||
&settings,
|
||||
&PathBuf::from(path("C:/Users/lenovo/AppData/Roaming/com.dbx.app")),
|
||||
Some(PathBuf::from(path("C:/Users/lenovo/.dbx/agents"))),
|
||||
);
|
||||
|
||||
assert_eq!(plugins_dir, PathBuf::from(path("D:/develop/DBX/plugins")));
|
||||
assert_eq!(agents_dir, Some(PathBuf::from(path("D:/develop/DBX/agents"))));
|
||||
}
|
||||
|
||||
fn path(value: &str) -> String {
|
||||
value.replace('/', std::path::MAIN_SEPARATOR_STR)
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user