diff options
| author | Lukas Wirth <lukastw97@gmail.com> | 2025-01-06 08:05:16 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-06 08:05:16 +0000 |
| commit | f4757238e5d99fb2db5bdb6777024328e11fa170 (patch) | |
| tree | 2a4785e15047a933497a24ff2beaf744dde5c0c3 /src/tools | |
| parent | 739362113c0943c07f1cf68577ed5719fbbc01bf (diff) | |
| parent | 6aad73603fe981ee7c6d7e17be1a5f24382f3b25 (diff) | |
| download | rust-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.rs | 37 |
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")); +} |
