mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-07-09 22:32:45 +02:00
Auto-detect WSL and resolve Windows data directory for CLI
When running the CLI in WSL, dirs::data_dir() returns the Linux path instead of the Windows host path where the Yaak desktop app stores data. This detects WSL via /proc/version, resolves %APPDATA% through cmd.exe, and converts it to a WSL mount path using wslpath. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -10,6 +10,7 @@ mod version_check;
|
|||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use cli::{Cli, Commands, PluginCommands, RequestCommands};
|
use cli::{Cli, Commands, PluginCommands, RequestCommands};
|
||||||
use context::{CliContext, CliExecutionContext};
|
use context::{CliContext, CliExecutionContext};
|
||||||
|
use std::path::PathBuf;
|
||||||
use yaak_models::queries::any_request::AnyRequest;
|
use yaak_models::queries::any_request::AnyRequest;
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
@@ -30,9 +31,7 @@ async fn main() {
|
|||||||
|
|
||||||
let app_id = if cfg!(debug_assertions) { "app.yaak.desktop.dev" } else { "app.yaak.desktop" };
|
let app_id = if cfg!(debug_assertions) { "app.yaak.desktop.dev" } else { "app.yaak.desktop" };
|
||||||
|
|
||||||
let data_dir = data_dir.unwrap_or_else(|| {
|
let data_dir = data_dir.unwrap_or_else(|| resolve_data_dir(app_id));
|
||||||
dirs::data_dir().expect("Could not determine data directory").join(app_id)
|
|
||||||
});
|
|
||||||
|
|
||||||
version_check::maybe_check_for_updates().await;
|
version_check::maybe_check_for_updates().await;
|
||||||
|
|
||||||
@@ -239,3 +238,46 @@ fn resolve_cookie_jar_id(
|
|||||||
.map(|jar| jar.id);
|
.map(|jar| jar.id);
|
||||||
Ok(default_cookie_jar)
|
Ok(default_cookie_jar)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn resolve_data_dir(app_id: &str) -> PathBuf {
|
||||||
|
if let Some(dir) = wsl_data_dir(app_id) {
|
||||||
|
return dir;
|
||||||
|
}
|
||||||
|
dirs::data_dir().expect("Could not determine data directory").join(app_id)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Detect WSL and resolve the Windows AppData\Roaming path for the Yaak data directory.
|
||||||
|
fn wsl_data_dir(app_id: &str) -> Option<PathBuf> {
|
||||||
|
if !cfg!(target_os = "linux") {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
let proc_version = std::fs::read_to_string("/proc/version").ok()?;
|
||||||
|
let is_wsl = proc_version.to_lowercase().contains("microsoft");
|
||||||
|
if !is_wsl {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We're in WSL, so try to resolve the Yaak app's data directory in Windows
|
||||||
|
|
||||||
|
// Get the Windows %APPDATA% path via cmd.exe
|
||||||
|
let appdata_output =
|
||||||
|
std::process::Command::new("cmd.exe").args(["/C", "echo", "%APPDATA%"]).output().ok()?;
|
||||||
|
|
||||||
|
let win_path = String::from_utf8(appdata_output.stdout).ok()?.trim().to_string();
|
||||||
|
if win_path.is_empty() || win_path == "%APPDATA%" {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert Windows path to WSL path using wslpath (handles custom mount points)
|
||||||
|
let wslpath_output = std::process::Command::new("wslpath").arg(&win_path).output().ok()?;
|
||||||
|
|
||||||
|
let wsl_appdata = String::from_utf8(wslpath_output.stdout).ok()?.trim().to_string();
|
||||||
|
if wsl_appdata.is_empty() {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
let wsl_path = PathBuf::from(wsl_appdata).join(app_id);
|
||||||
|
|
||||||
|
if wsl_path.exists() { Some(wsl_path) } else { None }
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user