| 726 | 726 | | if let Some(home) = &home { |
| 727 | 727 | | folders.push(home.join(".g1t-runner")); |
| 728 | 728 | | } |
| 729 | | − | // The desktop app's data folder (its `app_data_dir`): runner/host. |
| 730 | | − | let data = match std::env::consts::OS { |
| 731 | | − | "windows" => std::env::var_os("APPDATA").map(PathBuf::from), |
| 732 | | − | "macos" => home.as_ref().map(|h| h.join("Library").join("Application Support")), |
| 733 | | − | _ => std::env::var_os("XDG_DATA_HOME").filter(|d| !d.is_empty()).map(PathBuf::from).or_else(|| home.as_ref().map(|h| h.join(".local").join("share"))), |
| 729 | + | // The desktop app's data folders: runner/host. On Windows it keeps its |
| 730 | + | // runner in local data (%LOCALAPPDATA%), and in roaming data |
| 731 | + | // (%APPDATA%) on a computer that set it up there before; elsewhere the |
| 732 | + | // two are one folder. |
| 733 | + | let data: Vec<PathBuf> = match std::env::consts::OS { |
| 734 | + | "windows" => ["LOCALAPPDATA", "APPDATA"].iter().filter_map(|var| std::env::var_os(var)).map(PathBuf::from).collect(), |
| 735 | + | "macos" => home.iter().map(|h| h.join("Library").join("Application Support")).collect(), |
| 736 | + | _ => std::env::var_os("XDG_DATA_HOME").filter(|d| !d.is_empty()).map(PathBuf::from).or_else(|| home.as_ref().map(|h| h.join(".local").join("share"))).into_iter().collect(), |
| 734 | 737 | | }; |
| 735 | | − | if let Some(data) = data { |
| 738 | + | for data in data { |
| 736 | 739 | | folders.push(data.join("sh.g1t.desktop").join("runner").join("host")); |
| 737 | 740 | | } |
| 738 | 741 | | folders.dedup(); |
| ⋯ |
| 1348 | 1351 | | assert!(said.contains("as you") && said.contains("g1t-runner remove --dir"), "{said}"); |
| 1349 | 1352 | | // The desktop app's folder for running jobs directly is looked at. |
| 1350 | 1353 | | assert!(host_runner_folders().iter().any(|f| f.ends_with(Path::new("sh.g1t.desktop").join("runner").join("host")))); |
| 1354 | + | // On Windows, both where it keeps it now (local data) and where it |
| 1355 | + | // kept it before (roaming data). |
| 1356 | + | if cfg!(windows) { |
| 1357 | + | let folders = host_runner_folders(); |
| 1358 | + | for var in ["LOCALAPPDATA", "APPDATA"] { |
| 1359 | + | if let Some(data) = std::env::var_os(var) { |
| 1360 | + | let expected = PathBuf::from(data).join("sh.g1t.desktop").join("runner").join("host"); |
| 1361 | + | assert!(folders.contains(&expected), "{var}: {folders:?}"); |
| 1362 | + | } |
| 1363 | + | } |
| 1364 | + | } |
| 1351 | 1365 | | // An older status, without warnings, still reads. |
| 1352 | 1366 | | let old: Status = serde_json::from_str(r#"{"schema":1,"state":"absent","backend":null,"runner_version":null,"launcher_version":"0.3.0","image_version":null,"isolation":null,"job":null,"error":null,"resources":{"cpus":0,"memory_mib":0,"disk_gib":0},"capabilities":[],"state_dir":"x"}"#).unwrap(); |
| 1353 | 1367 | | assert!(old.warnings.is_empty()); |