Auto merge of #8939 - Andy-Python-Programmer:master, r=alexcrichton

Throw error if CARGO_TARGET_DIR is an empty string

This pull request makes the target dir to be target/ if `CARGO_TARGET_DIR` is `` with spaces trimmed and not delete the current project.

Fixes: #8866
This commit is contained in:
bors 2021-02-25 19:40:08 +00:00
commit f3e63d6ab4
3 changed files with 49 additions and 2 deletions

View File

@ -473,10 +473,24 @@ impl Config {
if let Some(dir) = &self.target_dir {
Ok(Some(dir.clone()))
} else if let Some(dir) = env::var_os("CARGO_TARGET_DIR") {
// Check if the CARGO_TARGET_DIR environment variable is set to an empty string.
if dir.to_string_lossy() == "" {
anyhow::bail!("the target directory is set to an empty string in the `CARGO_TARGET_DIR` environment variable")
}
Ok(Some(Filesystem::new(self.cwd.join(dir))))
} else if let Some(val) = &self.build_config()?.target_dir {
let val = val.resolve_path(self);
Ok(Some(Filesystem::new(val)))
let path = val.resolve_path(self);
// Check if the target directory is set to an empty string in the config.toml file.
if val.raw_value() == "" {
anyhow::bail!(format!(
"the target directory is set to an empty string in {}",
val.value().definition
),)
}
Ok(Some(Filesystem::new(path)))
} else {
Ok(None)
}

View File

@ -10,6 +10,11 @@ use std::path::PathBuf;
pub struct ConfigRelativePath(Value<String>);
impl ConfigRelativePath {
/// Returns the underlying value.
pub fn value(&self) -> &Value<String> {
&self.0
}
/// Returns the raw underlying configuration value for this key.
pub fn raw_value(&self) -> &str {
&self.0.val

View File

@ -1460,3 +1460,31 @@ strip = 'debuginfo'
let strip = p.strip.unwrap();
assert_eq!(strip, toml::StringOrBool::String("debuginfo".to_string()));
}
#[cargo_test]
fn cargo_target_empty_cfg() {
write_config(
"\
[build]
target-dir = ''
",
);
let config = new_config();
assert_error(
config.target_dir().unwrap_err(),
"the target directory is set to an empty string in [..]/.cargo/config",
);
}
#[cargo_test]
fn cargo_target_empty_env() {
let project = project().build();
project.cargo("build")
.env("CARGO_TARGET_DIR", "")
.with_stderr("error: the target directory is set to an empty string in the `CARGO_TARGET_DIR` environment variable")
.with_status(101)
.run()
}