diff --git a/src-tauri/src/commands/buff.rs b/src-tauri/src/commands/buff.rs index f961ddf..3272eb7 100644 --- a/src-tauri/src/commands/buff.rs +++ b/src-tauri/src/commands/buff.rs @@ -171,14 +171,45 @@ fn check_project(app: &AppHandle, project_path: &str) -> Result<(), String> { Ok(()) } +// ── 辅助:WSL 路径检测与转换 ───────────────────────────────────────────────── + +/// 判断路径是否为 WSL UNC 路径(\\wsl.localhost\... 或 \\wsl$\...) +fn is_wsl_path(path: &str) -> bool { + path.starts_with("\\\\wsl.localhost\\") || path.starts_with("\\\\wsl$\\") +} + +/// 将 WSL UNC 路径转为 Linux 绝对路径(去掉 \\wsl.localhost\Distro 前缀) +fn unc_to_linux(path: &str) -> Option { + let prefix = if path.starts_with("\\\\wsl.localhost\\") { + "\\\\wsl.localhost\\" + } else if path.starts_with("\\\\wsl$\\") { + "\\\\wsl$\\" + } else { + return None; + }; + let rest = &path[prefix.len()..]; + let slash_idx = rest.find('\\')?; + Some("/".to_string() + &rest[slash_idx + 1..].replace('\\', "/")) +} + // ── 辅助:git 操作 ──────────────────────────────────────────────────────────── fn get_head_commit(root: &Path) -> Result { - let out = std::process::Command::new("git") - .args(["rev-parse", "HEAD"]) - .current_dir(root) - .output() - .map_err(|e| e.to_string())?; + let path_str = root.to_string_lossy(); + let out = if is_wsl_path(&path_str) { + let linux = unc_to_linux(&path_str) + .ok_or_else(|| "无法转换 WSL 路径".to_string())?; + std::process::Command::new("wsl") + .args(["git", "-C", &linux, "rev-parse", "HEAD"]) + .output() + .map_err(|e| e.to_string())? + } else { + std::process::Command::new("git") + .args(["rev-parse", "HEAD"]) + .current_dir(root) + .output() + .map_err(|e| e.to_string())? + }; if out.status.success() { Ok(String::from_utf8_lossy(&out.stdout).trim().to_string()) @@ -188,19 +219,32 @@ fn get_head_commit(root: &Path) -> Result { } fn get_changed_files(root: &Path, last_commit: Option<&str>) -> Result, String> { - // 有上次 commit:diff two commits;无:取最新一次 commit 的变更文件 - let args: Vec<&str> = if let Some(prev) = last_commit { - vec!["diff", "--name-only", prev, "HEAD"] + let path_str = root.to_string_lossy(); + let out = if is_wsl_path(&path_str) { + let linux = unc_to_linux(&path_str) + .ok_or_else(|| "无法转换 WSL 路径".to_string())?; + let cmd = if let Some(prev) = last_commit { + format!("git -C {linux} diff --name-only {prev} HEAD") + } else { + format!("git -C {linux} diff-tree --no-commit-id -r --name-only HEAD") + }; + std::process::Command::new("wsl") + .args(["bash", "-c", &cmd]) + .output() + .map_err(|e| e.to_string())? } else { - vec!["diff-tree", "--no-commit-id", "-r", "--name-only", "HEAD"] + let args: Vec<&str> = if let Some(prev) = last_commit { + vec!["diff", "--name-only", prev, "HEAD"] + } else { + vec!["diff-tree", "--no-commit-id", "-r", "--name-only", "HEAD"] + }; + std::process::Command::new("git") + .args(&args) + .current_dir(root) + .output() + .map_err(|e| e.to_string())? }; - let out = std::process::Command::new("git") - .args(&args) - .current_dir(root) - .output() - .map_err(|e| e.to_string())?; - if out.status.success() { Ok(String::from_utf8_lossy(&out.stdout) .lines() diff --git a/src/lib/commands.ts b/src/lib/commands.ts index 3f47a73..3af44b9 100644 --- a/src/lib/commands.ts +++ b/src/lib/commands.ts @@ -1143,3 +1143,4 @@ export const getBuffStatus = (projectPath: string) => export const listBuffedProjects = () => invoke("list_buffed_projects"); + diff --git a/vite.config.ts b/vite.config.ts index 5c96a0a..98ed842 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -26,8 +26,8 @@ export default defineConfig(async () => ({ } : undefined, watch: { - // 3. tell Vite to ignore watching `src-tauri` - ignored: ["**/src-tauri/**"], + // 3. tell Vite to ignore watching `src-tauri` and blueprint files + ignored: ["**/src-tauri/**", "**/.blueprint/**", "**/CLAUDE.md"], }, }, }));