Skip to content

Commit 3bddfea

Browse files
committed
build-manifest: stop receiving release numbers from bootstrap
1 parent 0917b21 commit 3bddfea

File tree

6 files changed

+146
-66
lines changed

6 files changed

+146
-66
lines changed

Cargo.lock

+1
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ dependencies = [
230230
name = "build-manifest"
231231
version = "0.1.0"
232232
dependencies = [
233+
"anyhow",
233234
"serde",
234235
"serde_json",
235236
"toml",

src/bootstrap/dist.rs

+2-8
Original file line numberDiff line numberDiff line change
@@ -2356,15 +2356,9 @@ impl Step for HashSign {
23562356
cmd.arg(sign);
23572357
cmd.arg(distdir(builder));
23582358
cmd.arg(today.trim());
2359-
cmd.arg(builder.rust_package_vers());
23602359
cmd.arg(addr);
2361-
cmd.arg(builder.package_vers(&builder.release_num("cargo")));
2362-
cmd.arg(builder.package_vers(&builder.release_num("rls")));
2363-
cmd.arg(builder.package_vers(&builder.release_num("rust-analyzer/crates/rust-analyzer")));
2364-
cmd.arg(builder.package_vers(&builder.release_num("clippy")));
2365-
cmd.arg(builder.package_vers(&builder.release_num("miri")));
2366-
cmd.arg(builder.package_vers(&builder.release_num("rustfmt")));
2367-
cmd.arg(builder.llvm_tools_package_vers());
2360+
cmd.arg(&builder.config.channel);
2361+
cmd.arg(&builder.src);
23682362

23692363
builder.create_dir(&distdir(builder));
23702364

src/tools/build-manifest/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ edition = "2018"
88
toml = "0.5"
99
serde = { version = "1.0", features = ["derive"] }
1010
serde_json = "1.0"
11+
anyhow = "1.0.32"

src/tools/build-manifest/README.md

+4-5
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,9 @@ Then, you can generate the manifest and all the packages from `path/to/dist` to
2121

2222
```
2323
$ BUILD_MANIFEST_DISABLE_SIGNING=1 cargo +nightly run \
24-
path/to/dist path/to/output 1970-01-01 \
25-
nightly nightly nightly nightly nightly nightly nightly nightly \
26-
http://example.com
24+
path/to/dist path/to/output 1970-01-01 http://example.com \
25+
CHANNEL path/to/rust/repo
2726
```
2827

29-
In the future, if the tool complains about missing arguments just add more
30-
`nightly`s in the middle.
28+
Remember to replace `CHANNEL` with the channel you produced dist artifacts of
29+
and `path/to/rust/repo` with the path to your checkout of the Rust repository.

src/tools/build-manifest/src/main.rs

+24-53
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
77
mod versions;
88

9-
use crate::versions::PkgType;
9+
use crate::versions::{PkgType, Versions};
1010
use serde::Serialize;
1111
use std::collections::BTreeMap;
1212
use std::collections::HashMap;
@@ -227,14 +227,7 @@ macro_rules! t {
227227
}
228228

229229
struct Builder {
230-
rust_release: String,
231-
cargo_release: String,
232-
rls_release: String,
233-
rust_analyzer_release: String,
234-
clippy_release: String,
235-
rustfmt_release: String,
236-
llvm_tools_release: String,
237-
miri_release: String,
230+
versions: Versions,
238231

239232
input: PathBuf,
240233
output: PathBuf,
@@ -281,15 +274,9 @@ fn main() {
281274
let input = PathBuf::from(args.next().unwrap());
282275
let output = PathBuf::from(args.next().unwrap());
283276
let date = args.next().unwrap();
284-
let rust_release = args.next().unwrap();
285277
let s3_address = args.next().unwrap();
286-
let cargo_release = args.next().unwrap();
287-
let rls_release = args.next().unwrap();
288-
let rust_analyzer_release = args.next().unwrap();
289-
let clippy_release = args.next().unwrap();
290-
let miri_release = args.next().unwrap();
291-
let rustfmt_release = args.next().unwrap();
292-
let llvm_tools_release = args.next().unwrap();
278+
let channel = args.next().unwrap();
279+
let monorepo_path = args.next().unwrap();
293280

294281
// Do not ask for a passphrase while manually testing
295282
let mut passphrase = String::new();
@@ -299,14 +286,7 @@ fn main() {
299286
}
300287

301288
Builder {
302-
rust_release,
303-
cargo_release,
304-
rls_release,
305-
rust_analyzer_release,
306-
clippy_release,
307-
rustfmt_release,
308-
llvm_tools_release,
309-
miri_release,
289+
versions: Versions::new(&channel, Path::new(&monorepo_path)).unwrap(),
310290

311291
input,
312292
output,
@@ -363,10 +343,11 @@ impl Builder {
363343
self.check_toolstate();
364344
self.digest_and_sign();
365345
let manifest = self.build_manifest();
366-
self.write_channel_files(&self.rust_release, &manifest);
367346

368-
if self.rust_release != "beta" && self.rust_release != "nightly" {
369-
self.write_channel_files("stable", &manifest);
347+
let rust_version = self.versions.package_version(&PkgType::Rust).unwrap();
348+
self.write_channel_files(self.versions.channel(), &manifest);
349+
if self.versions.channel() != rust_version {
350+
self.write_channel_files(&rust_version, &manifest);
370351
}
371352
}
372353

@@ -473,7 +454,7 @@ impl Builder {
473454
// The compiler libraries are not stable for end users, and they're also huge, so we only
474455
// `rustc-dev` for nightly users, and only in the "complete" profile. It's still possible
475456
// for users to install the additional component manually, if needed.
476-
if self.rust_release == "nightly" {
457+
if self.versions.channel() == "nightly" {
477458
self.extend_profile("complete", &mut manifest.profiles, &["rustc-dev"]);
478459
self.extend_profile("complete", &mut manifest.profiles, &["rustc-docs"]);
479460
}
@@ -511,7 +492,7 @@ impl Builder {
511492
}
512493

513494
fn target_host_combination(&mut self, host: &str, manifest: &Manifest) -> Option<Target> {
514-
let filename = self.filename("rust", host);
495+
let filename = self.versions.tarball_name(&PkgType::Rust, host).unwrap();
515496
let digest = self.digests.remove(&filename)?;
516497
let xz_filename = filename.replace(".tar.gz", ".tar.xz");
517498
let xz_digest = self.digests.remove(&xz_filename);
@@ -610,7 +591,7 @@ impl Builder {
610591
.unwrap_or_default(); // `is_present` defaults to `false` here.
611592

612593
// Never ship nightly-only components for other trains.
613-
if self.rust_release != "nightly" && NIGHTLY_ONLY_COMPONENTS.contains(&pkgname) {
594+
if self.versions.channel() != "nightly" && NIGHTLY_ONLY_COMPONENTS.contains(&pkgname) {
614595
is_present = false; // Pretend the component is entirely missing.
615596
}
616597

@@ -619,7 +600,10 @@ impl Builder {
619600
.map(|name| {
620601
if is_present {
621602
// The component generally exists, but it might still be missing for this target.
622-
let filename = self.filename(pkgname, name);
603+
let filename = self
604+
.versions
605+
.tarball_name(&PkgType::from_component(pkgname), name)
606+
.unwrap();
623607
let digest = match self.digests.remove(&filename) {
624608
Some(digest) => digest,
625609
// This component does not exist for this target -- skip it.
@@ -662,23 +646,6 @@ impl Builder {
662646
format!("{}/{}/{}", self.s3_address, self.date, filename)
663647
}
664648

665-
fn filename(&self, component: &str, target: &str) -> String {
666-
use PkgType::*;
667-
match PkgType::from_component(component) {
668-
RustSrc => format!("rust-src-{}.tar.gz", self.rust_release),
669-
Cargo => format!("cargo-{}-{}.tar.gz", self.cargo_release, target),
670-
Rls => format!("rls-{}-{}.tar.gz", self.rls_release, target),
671-
RustAnalyzer => {
672-
format!("rust-analyzer-{}-{}.tar.gz", self.rust_analyzer_release, target)
673-
}
674-
Clippy => format!("clippy-{}-{}.tar.gz", self.clippy_release, target),
675-
Rustfmt => format!("rustfmt-{}-{}.tar.gz", self.rustfmt_release, target),
676-
LlvmTools => format!("llvm-tools-{}-{}.tar.gz", self.llvm_tools_release, target),
677-
Miri => format!("miri-{}-{}.tar.gz", self.miri_release, target),
678-
Other(_) => format!("{}-{}-{}.tar.gz", component, self.rust_release, target),
679-
}
680-
}
681-
682649
fn cached_version(&self, component: &str) -> &Option<String> {
683650
use PkgType::*;
684651
match PkgType::from_component(component) {
@@ -707,20 +674,24 @@ impl Builder {
707674
}
708675
}
709676

710-
fn version(&self, component: &str, target: &str) -> Option<String> {
677+
fn version(&mut self, component: &str, target: &str) -> Option<String> {
711678
self.untar(component, target, |filename| format!("{}/version", filename))
712679
}
713680

714-
fn git_commit_hash(&self, component: &str, target: &str) -> Option<String> {
681+
fn git_commit_hash(&mut self, component: &str, target: &str) -> Option<String> {
715682
self.untar(component, target, |filename| format!("{}/git-commit-hash", filename))
716683
}
717684

718-
fn untar<F>(&self, component: &str, target: &str, dir: F) -> Option<String>
685+
fn untar<F>(&mut self, component: &str, target: &str, dir: F) -> Option<String>
719686
where
720687
F: FnOnce(String) -> String,
721688
{
689+
let filename = self
690+
.versions
691+
.tarball_name(&PkgType::from_component(component), target)
692+
.expect("failed to retrieve the tarball path");
693+
722694
let mut cmd = Command::new("tar");
723-
let filename = self.filename(component, target);
724695
cmd.arg("xf")
725696
.arg(self.input.join(&filename))
726697
.arg(dir(filename.replace(".tar.gz", "")))

src/tools/build-manifest/src/versions.rs

+114
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1+
use anyhow::{Context, Error};
2+
use std::collections::HashMap;
3+
use std::path::{Path, PathBuf};
4+
5+
#[derive(Debug, Hash, Eq, PartialEq, Clone)]
16
pub(crate) enum PkgType {
7+
Rust,
28
RustSrc,
39
Cargo,
410
Rls,
@@ -13,6 +19,7 @@ pub(crate) enum PkgType {
1319
impl PkgType {
1420
pub(crate) fn from_component(component: &str) -> Self {
1521
match component {
22+
"rust" => PkgType::Rust,
1623
"rust-src" => PkgType::RustSrc,
1724
"cargo" => PkgType::Cargo,
1825
"rls" | "rls-preview" => PkgType::Rls,
@@ -24,4 +31,111 @@ impl PkgType {
2431
other => PkgType::Other(other.into()),
2532
}
2633
}
34+
35+
fn rust_monorepo_path(&self) -> Option<&'static str> {
36+
match self {
37+
PkgType::Cargo => Some("src/tools/cargo"),
38+
PkgType::Rls => Some("src/tools/rls"),
39+
PkgType::RustAnalyzer => Some("src/tools/rust-analyzer/crates/rust-analyzer"),
40+
PkgType::Clippy => Some("src/tools/clippy"),
41+
PkgType::Rustfmt => Some("src/tools/rustfmt"),
42+
PkgType::Miri => Some("src/tools/miri"),
43+
PkgType::Rust => None,
44+
PkgType::RustSrc => None,
45+
PkgType::LlvmTools => None,
46+
PkgType::Other(_) => None,
47+
}
48+
}
49+
50+
fn tarball_component_name(&self) -> &str {
51+
match self {
52+
PkgType::Rust => "rust",
53+
PkgType::RustSrc => "rust-src",
54+
PkgType::Cargo => "cargo",
55+
PkgType::Rls => "rls",
56+
PkgType::RustAnalyzer => "rust-analyzer",
57+
PkgType::Clippy => "clippy",
58+
PkgType::Rustfmt => "rustfmt",
59+
PkgType::LlvmTools => "llvm-tools",
60+
PkgType::Miri => "miri",
61+
PkgType::Other(component) => component,
62+
}
63+
}
64+
}
65+
66+
pub(crate) struct Versions {
67+
channel: String,
68+
rustc_version: String,
69+
monorepo_root: PathBuf,
70+
package_versions: HashMap<PkgType, String>,
71+
}
72+
73+
impl Versions {
74+
pub(crate) fn new(channel: &str, monorepo_root: &Path) -> Result<Self, Error> {
75+
Ok(Self {
76+
channel: channel.into(),
77+
rustc_version: std::fs::read_to_string(monorepo_root.join("src").join("version"))
78+
.context("failed to read the rustc version from src/version")?
79+
.trim()
80+
.to_string(),
81+
monorepo_root: monorepo_root.into(),
82+
package_versions: HashMap::new(),
83+
})
84+
}
85+
86+
pub(crate) fn channel(&self) -> &str {
87+
&self.channel
88+
}
89+
90+
pub(crate) fn tarball_name(
91+
&mut self,
92+
package: &PkgType,
93+
target: &str,
94+
) -> Result<String, Error> {
95+
Ok(format!(
96+
"{}-{}-{}.tar.gz",
97+
package.tarball_component_name(),
98+
self.package_version(package).with_context(|| format!(
99+
"failed to get the package version for component {:?}",
100+
package,
101+
))?,
102+
target
103+
))
104+
}
105+
106+
pub(crate) fn package_version(&mut self, package: &PkgType) -> Result<String, Error> {
107+
match self.package_versions.get(package) {
108+
Some(release) => Ok(release.clone()),
109+
None => {
110+
let version = match package.rust_monorepo_path() {
111+
Some(path) => {
112+
let path = self.monorepo_root.join(path).join("Cargo.toml");
113+
let cargo_toml: CargoToml = toml::from_slice(&std::fs::read(path)?)?;
114+
cargo_toml.package.version
115+
}
116+
None => self.rustc_version.clone(),
117+
};
118+
119+
let release = match self.channel.as_str() {
120+
"stable" => version,
121+
"beta" => "beta".into(),
122+
"nightly" => "nightly".into(),
123+
_ => format!("{}-dev", version),
124+
};
125+
126+
self.package_versions.insert(package.clone(), release.clone());
127+
Ok(release)
128+
}
129+
}
130+
}
131+
}
132+
133+
#[derive(serde::Deserialize)]
134+
struct CargoToml {
135+
package: CargoTomlPackage,
136+
}
137+
138+
#[derive(serde::Deserialize)]
139+
struct CargoTomlPackage {
140+
version: String,
27141
}

0 commit comments

Comments
 (0)