fix(driver): keep custom store paths consistent

This commit is contained in:
t8y2 committed 2026-06-20 23:58:38 +08:00
1 parent a1e39333a3
commit f32298743d
5 files changed
+131 -16

No files matched your search

+114 -3
View File
@@ -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, &current_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, &current_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)
}
}