From 10bac339025e33e91122f196fdd9415cdd0e7c3a Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 29 Oct 2026 20:09:31 +0000 Subject: [PATCH 1/2] Set USERPROFILE in Maven home tests on Windows #1801 made the Maven local-repository lookup read user.home the way Java does: USERPROFILE on Windows, HOME elsewhere. The two crawler_maven_e2e home-fallback tests still pointed only HOME at their temp dir, so on Windows the crawler looked in the runner's real profile and get_maven_repo_paths_home_dot_m2_fallback failed in the Windows test shard on main. The no-.m2 test passed there only because the runner has no real ~/.m2. Point the platform's home variable at the temp dir instead, as #1814 did for the cargo home tests. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_011f9aePZNoNmNU3zNg5Latx --- .../tests/crawler_maven_e2e.rs | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/crates/socket-patch-core/tests/crawler_maven_e2e.rs b/crates/socket-patch-core/tests/crawler_maven_e2e.rs index 138f65d76..4eb3f941b 100644 --- a/crates/socket-patch-core/tests/crawler_maven_e2e.rs +++ b/crates/socket-patch-core/tests/crawler_maven_e2e.rs @@ -10,6 +10,10 @@ use socket_patch_core::crawlers::maven_crawler::parse_pom_group_artifact_version use socket_patch_core::crawlers::types::CrawlerOptions; use socket_patch_core::crawlers::MavenCrawler; +/// The variable Maven's `user.home` comes from: `HOME` on Unix, +/// `USERPROFILE` on Windows (the crawler prefers it over `HOME` there). +const HOME_VAR: &str = if cfg!(windows) { "USERPROFILE" } else { "HOME" }; + fn options_at(root: &Path) -> CrawlerOptions { CrawlerOptions { cwd: root.to_path_buf(), @@ -269,10 +273,10 @@ async fn get_maven_repo_paths_home_dot_m2_fallback() { let prev_local = std::env::var("MAVEN_REPO_LOCAL").ok(); let prev_m2 = std::env::var("M2_HOME").ok(); - let prev_home = std::env::var("HOME").ok(); + let prev_home = std::env::var(HOME_VAR).ok(); std::env::remove_var("MAVEN_REPO_LOCAL"); std::env::remove_var("M2_HOME"); - std::env::set_var("HOME", tmp.path()); + std::env::set_var(HOME_VAR, tmp.path()); let crawler = MavenCrawler; let paths = crawler @@ -287,9 +291,9 @@ async fn get_maven_repo_paths_home_dot_m2_fallback() { std::env::set_var("M2_HOME", v); } if let Some(v) = prev_home { - std::env::set_var("HOME", v); + std::env::set_var(HOME_VAR, v); } else { - std::env::remove_var("HOME"); + std::env::remove_var(HOME_VAR); } // Production returns exactly the single resolved repo path — assert the @@ -340,10 +344,10 @@ async fn get_maven_repo_paths_global_mode_no_m2_returns_empty() { let tmp = tempfile::tempdir().unwrap(); let prev_local = std::env::var("MAVEN_REPO_LOCAL").ok(); let prev_m2 = std::env::var("M2_HOME").ok(); - let prev_home = std::env::var("HOME").ok(); + let prev_home = std::env::var(HOME_VAR).ok(); std::env::remove_var("MAVEN_REPO_LOCAL"); std::env::remove_var("M2_HOME"); - std::env::set_var("HOME", tmp.path()); // No .m2/ inside + std::env::set_var(HOME_VAR, tmp.path()); // No .m2/ inside let crawler = MavenCrawler; let opts = CrawlerOptions { @@ -360,9 +364,9 @@ async fn get_maven_repo_paths_global_mode_no_m2_returns_empty() { std::env::set_var("M2_HOME", v); } if let Some(v) = prev_home { - std::env::set_var("HOME", v); + std::env::set_var(HOME_VAR, v); } else { - std::env::remove_var("HOME"); + std::env::remove_var(HOME_VAR); } assert!( From c8f23147814707ad374990fe5160b11ae9a245af Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 29 Oct 2026 20:46:33 +0000 Subject: [PATCH 2/2] Redirect HOME and USERPROFILE in Maven home tests The global-mode test also walks the Coursier and Ivy caches, which read HOME first on every OS. Redirecting only USERPROFILE on Windows would let the runner's real HOME leak into its empty-list assertion. Point both variables at the temp dir in both home tests, and restore both afterwards. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_011f9aePZNoNmNU3zNg5Latx --- .../tests/crawler_maven_e2e.rs | 39 ++++++++++++------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/crates/socket-patch-core/tests/crawler_maven_e2e.rs b/crates/socket-patch-core/tests/crawler_maven_e2e.rs index 4eb3f941b..785e9b9f4 100644 --- a/crates/socket-patch-core/tests/crawler_maven_e2e.rs +++ b/crates/socket-patch-core/tests/crawler_maven_e2e.rs @@ -10,9 +10,11 @@ use socket_patch_core::crawlers::maven_crawler::parse_pom_group_artifact_version use socket_patch_core::crawlers::types::CrawlerOptions; use socket_patch_core::crawlers::MavenCrawler; -/// The variable Maven's `user.home` comes from: `HOME` on Unix, -/// `USERPROFILE` on Windows (the crawler prefers it over `HOME` there). -const HOME_VAR: &str = if cfg!(windows) { "USERPROFILE" } else { "HOME" }; +/// The variables the crawler reads a user home from. Maven's `user.home` +/// prefers `USERPROFILE` on Windows and `HOME` elsewhere, while the +/// Coursier / Ivy lookups prefer `HOME` everywhere, so a test that points +/// the home at a temp dir must set both. +const HOME_VARS: [&str; 2] = ["HOME", "USERPROFILE"]; fn options_at(root: &Path) -> CrawlerOptions { CrawlerOptions { @@ -273,10 +275,12 @@ async fn get_maven_repo_paths_home_dot_m2_fallback() { let prev_local = std::env::var("MAVEN_REPO_LOCAL").ok(); let prev_m2 = std::env::var("M2_HOME").ok(); - let prev_home = std::env::var(HOME_VAR).ok(); + let prev_home = HOME_VARS.map(std::env::var_os); std::env::remove_var("MAVEN_REPO_LOCAL"); std::env::remove_var("M2_HOME"); - std::env::set_var(HOME_VAR, tmp.path()); + for key in HOME_VARS { + std::env::set_var(key, tmp.path()); + } let crawler = MavenCrawler; let paths = crawler @@ -290,10 +294,11 @@ async fn get_maven_repo_paths_home_dot_m2_fallback() { if let Some(v) = prev_m2 { std::env::set_var("M2_HOME", v); } - if let Some(v) = prev_home { - std::env::set_var(HOME_VAR, v); - } else { - std::env::remove_var(HOME_VAR); + for (key, value) in HOME_VARS.into_iter().zip(prev_home) { + match value { + Some(v) => std::env::set_var(key, v), + None => std::env::remove_var(key), + } } // Production returns exactly the single resolved repo path — assert the @@ -344,10 +349,13 @@ async fn get_maven_repo_paths_global_mode_no_m2_returns_empty() { let tmp = tempfile::tempdir().unwrap(); let prev_local = std::env::var("MAVEN_REPO_LOCAL").ok(); let prev_m2 = std::env::var("M2_HOME").ok(); - let prev_home = std::env::var(HOME_VAR).ok(); + let prev_home = HOME_VARS.map(std::env::var_os); std::env::remove_var("MAVEN_REPO_LOCAL"); std::env::remove_var("M2_HOME"); - std::env::set_var(HOME_VAR, tmp.path()); // No .m2/ inside + // No .m2/ inside. + for key in HOME_VARS { + std::env::set_var(key, tmp.path()); + } let crawler = MavenCrawler; let opts = CrawlerOptions { @@ -363,10 +371,11 @@ async fn get_maven_repo_paths_global_mode_no_m2_returns_empty() { if let Some(v) = prev_m2 { std::env::set_var("M2_HOME", v); } - if let Some(v) = prev_home { - std::env::set_var(HOME_VAR, v); - } else { - std::env::remove_var(HOME_VAR); + for (key, value) in HOME_VARS.into_iter().zip(prev_home) { + match value { + Some(v) => std::env::set_var(key, v), + None => std::env::remove_var(key), + } } assert!(