Skip to content

Commit 60fe887

Browse files
committed
Deal bool and string separately in TomlPackageBuild
1 parent 70c45a1 commit 60fe887

File tree

4 files changed

+34
-28
lines changed

4 files changed

+34
-28
lines changed

crates/cargo-util-schemas/src/manifest/mod.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -168,9 +168,14 @@ pub struct InheritablePackage {
168168
#[derive(Deserialize, Serialize, Clone, Debug)]
169169
#[serde(untagged, rename_all = "kebab-case")]
170170
pub enum TomlPackageBuild {
171-
/// If there's just one script or boolean value
172-
SingleScript(StringOrBool),
173-
/// If multiple build script are there
171+
/// If build scripts are disabled or enabled.
172+
/// If true, `build.rs` in the root folder will be the build script.
173+
Auto(bool),
174+
175+
/// Path of Build Script if there's just one script.
176+
SingleScript(String),
177+
178+
/// Vector of paths if multiple build script are to be used.
174179
MultipleScripts(Vec<String>),
175180
}
176181

@@ -266,9 +271,9 @@ impl TomlPackage {
266271
pub fn normalized_build(&self) -> Result<Option<&String>, UnresolvedError> {
267272
let build = self.build.as_ref().ok_or(UnresolvedError)?;
268273
match build {
269-
TomlPackageBuild::SingleScript(StringOrBool::Bool(false)) => Ok(None),
270-
TomlPackageBuild::SingleScript(StringOrBool::Bool(true)) => Err(UnresolvedError),
271-
TomlPackageBuild::SingleScript(StringOrBool::String(value)) => Ok(Some(value)),
274+
TomlPackageBuild::Auto(false) => Ok(None),
275+
TomlPackageBuild::Auto(true) => Err(UnresolvedError),
276+
TomlPackageBuild::SingleScript(value) => Ok(Some(value)),
272277
TomlPackageBuild::MultipleScripts(_scripts) => {
273278
unimplemented!("Multiple Build Scripts feature is not implemented yet!")
274279
}

src/cargo/ops/vendor.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use crate::util::{try_canonicalize, CargoResult, GlobalContext};
1212
use anyhow::{bail, Context as _};
1313
use cargo_util::{paths, Sha256};
1414
use cargo_util_schemas::core::SourceKind;
15-
use cargo_util_schemas::manifest::{StringOrBool, TomlManifest, TomlPackageBuild};
15+
use cargo_util_schemas::manifest::{TomlManifest, TomlPackageBuild};
1616
use serde::Serialize;
1717
use walkdir::WalkDir;
1818

@@ -514,7 +514,8 @@ fn prepare_toml_for_vendor(
514514
.package
515515
.as_mut()
516516
.expect("venedored manifests must have packages");
517-
if let Some(TomlPackageBuild::SingleScript(StringOrBool::String(path))) = &package.build {
517+
// Validates if build script file exists. If not, warn and ignore.
518+
if let Some(TomlPackageBuild::SingleScript(path)) = &package.build {
518519
let path = paths::normalize_path(Path::new(path));
519520
let included = packaged_files.contains(&path);
520521
let build = if included {
@@ -523,15 +524,15 @@ fn prepare_toml_for_vendor(
523524
.into_string()
524525
.map_err(|_err| anyhow::format_err!("non-UTF8 `package.build`"))?;
525526
let path = crate::util::toml::normalize_path_string_sep(path);
526-
StringOrBool::String(path)
527+
TomlPackageBuild::SingleScript(path)
527528
} else {
528529
gctx.shell().warn(format!(
529530
"ignoring `package.build` as `{}` is not included in the published package",
530531
path.display()
531532
))?;
532-
StringOrBool::Bool(false)
533+
TomlPackageBuild::Auto(false)
533534
};
534-
package.build = Some(TomlPackageBuild::SingleScript(build));
535+
package.build = Some(build);
535536
}
536537

537538
let lib = if let Some(target) = &me.lib {

src/cargo/util/toml/mod.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,7 @@ fn normalize_package_toml<'a>(
670670
.transpose()?
671671
.map(manifest::InheritableField::Value);
672672
let build = if is_embedded {
673-
Some(TomlPackageBuild::SingleScript(StringOrBool::Bool(false)))
673+
Some(TomlPackageBuild::Auto(false))
674674
} else {
675675
targets::normalize_build(original_package.build.as_ref(), package_root)
676676
};
@@ -2885,7 +2885,9 @@ fn prepare_toml_for_publish(
28852885

28862886
let mut package = me.package().unwrap().clone();
28872887
package.workspace = None;
2888-
if let Some(TomlPackageBuild::SingleScript(StringOrBool::String(path))) = &package.build {
2888+
2889+
// Validates if build script file exists. If not, warn and ignore.
2890+
if let Some(TomlPackageBuild::SingleScript(path)) = &package.build {
28892891
let path = Path::new(path).to_path_buf();
28902892
let included = packaged_files.map(|i| i.contains(&path)).unwrap_or(true);
28912893
let build = if included {
@@ -2894,15 +2896,15 @@ fn prepare_toml_for_publish(
28942896
.into_string()
28952897
.map_err(|_err| anyhow::format_err!("non-UTF8 `package.build`"))?;
28962898
let path = normalize_path_string_sep(path);
2897-
StringOrBool::String(path)
2899+
TomlPackageBuild::SingleScript(path)
28982900
} else {
28992901
ws.gctx().shell().warn(format!(
29002902
"ignoring `package.build` as `{}` is not included in the published package",
29012903
path.display()
29022904
))?;
2903-
StringOrBool::Bool(false)
2905+
TomlPackageBuild::Auto(false)
29042906
};
2905-
package.build = Some(TomlPackageBuild::SingleScript(build));
2907+
package.build = Some(build);
29062908
}
29072909
let current_resolver = package
29082910
.resolver

src/cargo/util/toml/targets.rs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ use std::path::{Path, PathBuf};
1717
use anyhow::Context as _;
1818
use cargo_util::paths;
1919
use cargo_util_schemas::manifest::{
20-
PathValue, StringOrBool, StringOrVec, TomlBenchTarget, TomlBinTarget, TomlExampleTarget,
21-
TomlLibTarget, TomlManifest, TomlPackageBuild, TomlTarget, TomlTestTarget,
20+
PathValue, StringOrVec, TomlBenchTarget, TomlBinTarget, TomlExampleTarget, TomlLibTarget,
21+
TomlManifest, TomlPackageBuild, TomlTarget, TomlTestTarget,
2222
};
2323

2424
use crate::core::compiler::rustdoc::RustdocScrapeExamples;
@@ -1087,28 +1087,26 @@ pub fn normalize_build(
10871087
// a build script.
10881088
let build_rs = package_root.join(BUILD_RS);
10891089
if build_rs.is_file() {
1090-
Some(TomlPackageBuild::SingleScript(StringOrBool::String(
1091-
BUILD_RS.to_owned(),
1092-
)))
1090+
Some(TomlPackageBuild::SingleScript(BUILD_RS.to_owned()))
10931091
} else {
1094-
Some(TomlPackageBuild::SingleScript(StringOrBool::Bool(false)))
1092+
Some(TomlPackageBuild::Auto(false))
10951093
}
10961094
}
10971095
// Explicitly no build script.
1098-
Some(TomlPackageBuild::SingleScript(StringOrBool::Bool(false))) => build.cloned(),
1096+
Some(TomlPackageBuild::Auto(false)) => build.cloned(),
10991097

11001098
// Build file's path is given
1101-
Some(TomlPackageBuild::SingleScript(StringOrBool::String(build_file))) => {
1099+
Some(TomlPackageBuild::SingleScript(build_file)) => {
11021100
let build_file = paths::normalize_path(Path::new(build_file));
11031101
let build = build_file.into_os_string().into_string().expect(
11041102
"`build_file` started as a String and `normalize_path` shouldn't have changed that",
11051103
);
1106-
Some(TomlPackageBuild::SingleScript(StringOrBool::String(build)))
1104+
Some(TomlPackageBuild::SingleScript(build))
11071105
}
11081106

1109-
Some(TomlPackageBuild::SingleScript(StringOrBool::Bool(true))) => Some(
1110-
TomlPackageBuild::SingleScript(StringOrBool::String(BUILD_RS.to_owned())),
1111-
),
1107+
Some(TomlPackageBuild::Auto(true)) => {
1108+
Some(TomlPackageBuild::SingleScript(BUILD_RS.to_owned()))
1109+
}
11121110

11131111
// If multiple build scripts are there
11141112
Some(TomlPackageBuild::MultipleScripts(_scripts)) => {

0 commit comments

Comments
 (0)