about summary refs log tree commit diff
path: root/src/tools
diff options
context:
space:
mode:
authorLukas Wirth <lukastw97@gmail.com>2025-01-06 08:05:16 +0000
committerGitHub <noreply@github.com>2025-01-06 08:05:16 +0000
commitf4757238e5d99fb2db5bdb6777024328e11fa170 (patch)
tree2a4785e15047a933497a24ff2beaf744dde5c0c3 /src/tools
parent739362113c0943c07f1cf68577ed5719fbbc01bf (diff)
parent6aad73603fe981ee7c6d7e17be1a5f24382f3b25 (diff)
downloadrust-f4757238e5d99fb2db5bdb6777024328e11fa170.tar.gz
rust-f4757238e5d99fb2db5bdb6777024328e11fa170.zip
Merge pull request #18841 from Veykril/push-lsuokpqkprqn
fix: Fix relative .cargo env vars not working
Diffstat (limited to 'src/tools')
-rw-r--r--src/tools/rust-analyzer/crates/project-model/src/env.rs37
1 files changed, 30 insertions, 7 deletions
diff --git a/src/tools/rust-analyzer/crates/project-model/src/env.rs b/src/tools/rust-analyzer/crates/project-model/src/env.rs
index e4b50546273..37fffba2955 100644
--- a/src/tools/rust-analyzer/crates/project-model/src/env.rs
+++ b/src/tools/rust-analyzer/crates/project-model/src/env.rs
@@ -76,7 +76,7 @@ pub(crate) fn cargo_config_env(
     // if successful we receive `env.key.value = "value" per entry
     tracing::debug!("Discovering cargo config env by {:?}", cargo_config);
     utf8_stdout(&mut cargo_config)
-        .map(|stdout| parse_output_cargo_config_env(manifest, stdout))
+        .map(|stdout| parse_output_cargo_config_env(manifest, &stdout))
         .inspect(|env| {
             tracing::debug!("Discovered cargo config env: {:?}", env);
         })
@@ -86,7 +86,7 @@ pub(crate) fn cargo_config_env(
         .unwrap_or_default()
 }
 
-fn parse_output_cargo_config_env(manifest: &ManifestPath, stdout: String) -> Env {
+fn parse_output_cargo_config_env(manifest: &ManifestPath, stdout: &str) -> Env {
     let mut env = Env::default();
     let mut relatives = vec![];
     for (key, val) in
@@ -112,12 +112,35 @@ fn parse_output_cargo_config_env(manifest: &ManifestPath, stdout: String) -> Env
     // FIXME: The base here should be the parent of the `.cargo/config` file, not the manifest.
     // But cargo does not provide this information.
     let base = <_ as AsRef<Utf8Path>>::as_ref(manifest.parent());
-    for (key, val) in relatives {
-        if let Some(val) = env.get(&val) {
-            env.insert(key, base.join(val).to_string());
-        } else {
-            env.insert(key, base.to_string());
+    for (key, relative) in relatives {
+        if relative != "true" {
+            continue;
+        }
+        if let Some(suffix) = env.get(key) {
+            env.insert(key, base.join(suffix).to_string());
         }
     }
     env
 }
+
+#[test]
+fn parse_output_cargo_config_env_works() {
+    let stdout = r#"
+env.CARGO_WORKSPACE_DIR.relative = true
+env.CARGO_WORKSPACE_DIR.value = ""
+env.RELATIVE.relative = true
+env.RELATIVE.value = "../relative"
+env.INVALID.relative = invalidbool
+env.INVALID.value = "../relative"
+env.TEST.value = "test"
+"#
+    .trim();
+    let cwd = paths::Utf8PathBuf::try_from(std::env::current_dir().unwrap()).unwrap();
+    let manifest = paths::AbsPathBuf::assert(cwd.join("Cargo.toml"));
+    let manifest = ManifestPath::try_from(manifest).unwrap();
+    let env = parse_output_cargo_config_env(&manifest, stdout);
+    assert_eq!(env.get("CARGO_WORKSPACE_DIR").as_deref(), Some(cwd.join("").as_str()));
+    assert_eq!(env.get("RELATIVE").as_deref(), Some(cwd.join("../relative").as_str()));
+    assert_eq!(env.get("INVALID").as_deref(), Some("../relative"));
+    assert_eq!(env.get("TEST").as_deref(), Some("test"));
+}