Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 4451777

Browse files
committedDec 16, 2023
Auto merge of #117595 - jyn514:x-clippy, r=albertlarsan68
x clippy thanks to `@asquared31415` `@albertlarsan68` for all their help, most of this pr is their work note that this also adds x clippy --stage 0 -Awarnings to x86_64-gnu-llvm-15 to make sure it stays working; that won't gate on any clippy warnings, just enforce that clippy doesn't give a hard error. we can't add --stage 1 until clippy fixes its debug assertions not to panic. note that `x clippy --stage 1` currently breaks when combined with download-rustc. unlike the previous prs, this doesn't require changes to clippy (it works by using RUSTC_WRAPPER instead), and supports stage 0 read this commit-by-commit closes #107628; see also #106394, #97443. fixes #95988. helps with #76495. r? bootstrap
2 parents 02ad667 + a078c3a commit 4451777

File tree

10 files changed

+245
-93
lines changed

10 files changed

+245
-93
lines changed
 

‎src/bootstrap/bootstrap.py

-16
Original file line numberDiff line numberDiff line change
@@ -616,22 +616,6 @@ def download_toolchain(self):
616616
with output(self.rustc_stamp()) as rust_stamp:
617617
rust_stamp.write(key)
618618

619-
def _download_component_helper(
620-
self, filename, pattern, tarball_suffix, rustc_cache,
621-
):
622-
key = self.stage0_compiler.date
623-
624-
tarball = os.path.join(rustc_cache, filename)
625-
if not os.path.exists(tarball):
626-
get(
627-
self.download_url,
628-
"dist/{}/{}".format(key, filename),
629-
tarball,
630-
self.checksums_sha256,
631-
verbose=self.verbose,
632-
)
633-
unpack(tarball, tarball_suffix, self.bin_root(), match=pattern, verbose=self.verbose)
634-
635619
def should_fix_bins_and_dylibs(self):
636620
"""Whether or not `fix_bin_or_dylib` needs to be run; can only be True
637621
on NixOS or if config.toml has `build.patch-binaries-for-nix` set.

‎src/bootstrap/src/bin/rustc.rs

+45-7
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@
1616
//! never get replaced.
1717
1818
use std::env;
19-
use std::path::PathBuf;
19+
use std::path::{Path, PathBuf};
2020
use std::process::{Child, Command};
2121
use std::time::Instant;
2222

23-
use dylib_util::{dylib_path, dylib_path_var};
23+
use dylib_util::{dylib_path, dylib_path_var, exe};
2424

2525
#[path = "../utils/bin_helpers.rs"]
2626
mod bin_helpers;
@@ -29,8 +29,10 @@ mod bin_helpers;
2929
mod dylib_util;
3030

3131
fn main() {
32-
let args = env::args_os().skip(1).collect::<Vec<_>>();
33-
let arg = |name| args.windows(2).find(|args| args[0] == name).and_then(|args| args[1].to_str());
32+
let orig_args = env::args_os().skip(1).collect::<Vec<_>>();
33+
let mut args = orig_args.clone();
34+
let arg =
35+
|name| orig_args.windows(2).find(|args| args[0] == name).and_then(|args| args[1].to_str());
3436

3537
let stage = bin_helpers::parse_rustc_stage();
3638
let verbose = bin_helpers::parse_rustc_verbose();
@@ -45,7 +47,8 @@ fn main() {
4547
// determine the version of the compiler, the real compiler needs to be
4648
// used. Currently, these two states are differentiated based on whether
4749
// --target and -vV is/isn't passed.
48-
let (rustc, libdir) = if target.is_none() && version.is_none() {
50+
let is_build_script = target.is_none() && version.is_none();
51+
let (rustc, libdir) = if is_build_script {
4952
("RUSTC_SNAPSHOT", "RUSTC_SNAPSHOT_LIBDIR")
5053
} else {
5154
("RUSTC_REAL", "RUSTC_LIBDIR")
@@ -54,12 +57,47 @@ fn main() {
5457
let sysroot = env::var_os("RUSTC_SYSROOT").expect("RUSTC_SYSROOT was not set");
5558
let on_fail = env::var_os("RUSTC_ON_FAIL").map(Command::new);
5659

57-
let rustc = env::var_os(rustc).unwrap_or_else(|| panic!("{:?} was not set", rustc));
60+
let rustc_real = env::var_os(rustc).unwrap_or_else(|| panic!("{:?} was not set", rustc));
5861
let libdir = env::var_os(libdir).unwrap_or_else(|| panic!("{:?} was not set", libdir));
5962
let mut dylib_path = dylib_path();
6063
dylib_path.insert(0, PathBuf::from(&libdir));
6164

62-
let mut cmd = Command::new(rustc);
65+
// if we're running clippy, trust cargo-clippy to set clippy-driver appropriately (and don't override it with rustc).
66+
// otherwise, substitute whatever cargo thinks rustc should be with RUSTC_REAL.
67+
// NOTE: this means we ignore RUSTC in the environment.
68+
// FIXME: We might want to consider removing RUSTC_REAL and setting RUSTC directly?
69+
// NOTE: we intentionally pass the name of the host, not the target.
70+
let host = env::var("CFG_COMPILER_BUILD_TRIPLE").unwrap();
71+
let is_clippy = args[0].to_string_lossy().ends_with(&exe("clippy-driver", &host));
72+
let rustc_driver = if is_clippy {
73+
if is_build_script {
74+
// Don't run clippy on build scripts (for one thing, we may not have libstd built with
75+
// the appropriate version yet, e.g. for stage 1 std).
76+
// Also remove the `clippy-driver` param in addition to the RUSTC param.
77+
args.drain(..2);
78+
rustc_real
79+
} else {
80+
args.remove(0)
81+
}
82+
} else {
83+
// Cargo doesn't respect RUSTC_WRAPPER for version information >:(
84+
// don't remove the first arg if we're being run as RUSTC instead of RUSTC_WRAPPER.
85+
// Cargo also sometimes doesn't pass the `.exe` suffix on Windows - add it manually.
86+
let current_exe = env::current_exe().expect("couldn't get path to rustc shim");
87+
let arg0 = exe(args[0].to_str().expect("only utf8 paths are supported"), &host);
88+
if Path::new(&arg0) == current_exe {
89+
args.remove(0);
90+
}
91+
rustc_real
92+
};
93+
94+
let mut cmd = if let Some(wrapper) = env::var_os("RUSTC_WRAPPER_REAL") {
95+
let mut cmd = Command::new(wrapper);
96+
cmd.arg(rustc_driver);
97+
cmd
98+
} else {
99+
Command::new(rustc_driver)
100+
};
63101
cmd.args(&args).env(dylib_path_var(), env::join_paths(&dylib_path).unwrap());
64102

65103
// Get the name of the crate we're compiling, if any.

‎src/bootstrap/src/core/build_steps/compile.rs

+9-7
Original file line numberDiff line numberDiff line change
@@ -1809,10 +1809,6 @@ pub fn run_cargo(
18091809
is_check: bool,
18101810
rlib_only_metadata: bool,
18111811
) -> Vec<PathBuf> {
1812-
if builder.config.dry_run() {
1813-
return Vec::new();
1814-
}
1815-
18161812
// `target_root_dir` looks like $dir/$target/release
18171813
let target_root_dir = stamp.parent().unwrap();
18181814
// `target_deps_dir` looks like $dir/$target/release/deps
@@ -1919,6 +1915,10 @@ pub fn run_cargo(
19191915
crate::exit!(1);
19201916
}
19211917

1918+
if builder.config.dry_run() {
1919+
return Vec::new();
1920+
}
1921+
19221922
// Ok now we need to actually find all the files listed in `toplevel`. We've
19231923
// got a list of prefix/extensions and we basically just need to find the
19241924
// most recent file in the `deps` folder corresponding to each one.
@@ -1974,9 +1974,6 @@ pub fn stream_cargo(
19741974
cb: &mut dyn FnMut(CargoMessage<'_>),
19751975
) -> bool {
19761976
let mut cargo = Command::from(cargo);
1977-
if builder.config.dry_run() {
1978-
return true;
1979-
}
19801977
// Instruct Cargo to give us json messages on stdout, critically leaving
19811978
// stderr as piped so we can get those pretty colors.
19821979
let mut message_format = if builder.config.json_output {
@@ -1995,6 +1992,11 @@ pub fn stream_cargo(
19951992
}
19961993

19971994
builder.verbose(&format!("running: {cargo:?}"));
1995+
1996+
if builder.config.dry_run() {
1997+
return true;
1998+
}
1999+
19982000
let mut child = match cargo.spawn() {
19992001
Ok(child) => child,
20002002
Err(e) => panic!("failed to execute command: {cargo:?}\nERROR: {e}"),

‎src/bootstrap/src/core/builder.rs

+88-52
Original file line numberDiff line numberDiff line change
@@ -1152,6 +1152,44 @@ impl<'a> Builder<'a> {
11521152
self.ensure(tool::Rustdoc { compiler })
11531153
}
11541154

1155+
pub fn cargo_clippy_cmd(&self, run_compiler: Compiler) -> Command {
1156+
let initial_sysroot_bin = self.initial_rustc.parent().unwrap();
1157+
// Set PATH to include the sysroot bin dir so clippy can find cargo.
1158+
// FIXME: once rust-clippy#11944 lands on beta, set `CARGO` directly instead.
1159+
let path = t!(env::join_paths(
1160+
// The sysroot comes first in PATH to avoid using rustup's cargo.
1161+
std::iter::once(PathBuf::from(initial_sysroot_bin))
1162+
.chain(env::split_paths(&t!(env::var("PATH"))))
1163+
));
1164+
1165+
if run_compiler.stage == 0 {
1166+
// `ensure(Clippy { stage: 0 })` *builds* clippy with stage0, it doesn't use the beta clippy.
1167+
let cargo_clippy = self.build.config.download_clippy();
1168+
let mut cmd = Command::new(cargo_clippy);
1169+
cmd.env("PATH", &path);
1170+
return cmd;
1171+
}
1172+
1173+
let build_compiler = self.compiler(run_compiler.stage - 1, self.build.build);
1174+
self.ensure(tool::Clippy {
1175+
compiler: build_compiler,
1176+
target: self.build.build,
1177+
extra_features: vec![],
1178+
});
1179+
let cargo_clippy = self.ensure(tool::CargoClippy {
1180+
compiler: build_compiler,
1181+
target: self.build.build,
1182+
extra_features: vec![],
1183+
});
1184+
let mut dylib_path = helpers::dylib_path();
1185+
dylib_path.insert(0, self.sysroot(run_compiler).join("lib"));
1186+
1187+
let mut cmd = Command::new(cargo_clippy.unwrap());
1188+
cmd.env(helpers::dylib_path_var(), env::join_paths(&dylib_path).unwrap());
1189+
cmd.env("PATH", path);
1190+
cmd
1191+
}
1192+
11551193
pub fn rustdoc_cmd(&self, compiler: Compiler) -> Command {
11561194
let mut cmd = Command::new(&self.bootstrap_out.join("rustdoc"));
11571195
cmd.env("RUSTC_STAGE", compiler.stage.to_string())
@@ -1200,7 +1238,12 @@ impl<'a> Builder<'a> {
12001238
target: TargetSelection,
12011239
cmd: &str,
12021240
) -> Command {
1203-
let mut cargo = Command::new(&self.initial_cargo);
1241+
let mut cargo = if cmd == "clippy" {
1242+
self.cargo_clippy_cmd(compiler)
1243+
} else {
1244+
Command::new(&self.initial_cargo)
1245+
};
1246+
12041247
// Run cargo from the source root so it can find .cargo/config.
12051248
// This matters when using vendoring and the working directory is outside the repository.
12061249
cargo.current_dir(&self.src);
@@ -1324,6 +1367,23 @@ impl<'a> Builder<'a> {
13241367
compiler.stage
13251368
};
13261369

1370+
// We synthetically interpret a stage0 compiler used to build tools as a
1371+
// "raw" compiler in that it's the exact snapshot we download. Normally
1372+
// the stage0 build means it uses libraries build by the stage0
1373+
// compiler, but for tools we just use the precompiled libraries that
1374+
// we've downloaded
1375+
let use_snapshot = mode == Mode::ToolBootstrap;
1376+
assert!(!use_snapshot || stage == 0 || self.local_rebuild);
1377+
1378+
let maybe_sysroot = self.sysroot(compiler);
1379+
let sysroot = if use_snapshot { self.rustc_snapshot_sysroot() } else { &maybe_sysroot };
1380+
let libdir = self.rustc_libdir(compiler);
1381+
1382+
let sysroot_str = sysroot.as_os_str().to_str().expect("sysroot should be UTF-8");
1383+
if !matches!(self.config.dry_run, DryRun::SelfCheck) {
1384+
self.verbose_than(0, &format!("using sysroot {sysroot_str}"));
1385+
}
1386+
13271387
let mut rustflags = Rustflags::new(target);
13281388
if stage != 0 {
13291389
if let Ok(s) = env::var("CARGOFLAGS_NOT_BOOTSTRAP") {
@@ -1335,41 +1395,16 @@ impl<'a> Builder<'a> {
13351395
cargo.args(s.split_whitespace());
13361396
}
13371397
rustflags.env("RUSTFLAGS_BOOTSTRAP");
1338-
if cmd == "clippy" {
1339-
// clippy overwrites sysroot if we pass it to cargo.
1340-
// Pass it directly to clippy instead.
1341-
// NOTE: this can't be fixed in clippy because we explicitly don't set `RUSTC`,
1342-
// so it has no way of knowing the sysroot.
1343-
rustflags.arg("--sysroot");
1344-
rustflags.arg(
1345-
self.sysroot(compiler)
1346-
.as_os_str()
1347-
.to_str()
1348-
.expect("sysroot must be valid UTF-8"),
1349-
);
1350-
// Only run clippy on a very limited subset of crates (in particular, not build scripts).
1351-
cargo.arg("-Zunstable-options");
1352-
// Explicitly does *not* set `--cfg=bootstrap`, since we're using a nightly clippy.
1353-
let host_version = Command::new("rustc").arg("--version").output().map_err(|_| ());
1354-
let output = host_version.and_then(|output| {
1355-
if output.status.success() {
1356-
Ok(output)
1357-
} else {
1358-
Err(())
1359-
}
1360-
}).unwrap_or_else(|_| {
1361-
eprintln!(
1362-
"ERROR: `x.py clippy` requires a host `rustc` toolchain with the `clippy` component"
1363-
);
1364-
eprintln!("HELP: try `rustup component add clippy`");
1365-
crate::exit!(1);
1366-
});
1367-
if !t!(std::str::from_utf8(&output.stdout)).contains("nightly") {
1368-
rustflags.arg("--cfg=bootstrap");
1369-
}
1370-
} else {
1371-
rustflags.arg("--cfg=bootstrap");
1372-
}
1398+
rustflags.arg("--cfg=bootstrap");
1399+
}
1400+
1401+
if cmd == "clippy" {
1402+
// clippy overwrites sysroot if we pass it to cargo.
1403+
// Pass it directly to clippy instead.
1404+
// NOTE: this can't be fixed in clippy because we explicitly don't set `RUSTC`,
1405+
// so it has no way of knowing the sysroot.
1406+
rustflags.arg("--sysroot");
1407+
rustflags.arg(sysroot_str);
13731408
}
13741409

13751410
let use_new_symbol_mangling = match self.config.rust_new_symbol_mangling {
@@ -1564,18 +1599,6 @@ impl<'a> Builder<'a> {
15641599

15651600
let want_rustdoc = self.doc_tests != DocTests::No;
15661601

1567-
// We synthetically interpret a stage0 compiler used to build tools as a
1568-
// "raw" compiler in that it's the exact snapshot we download. Normally
1569-
// the stage0 build means it uses libraries build by the stage0
1570-
// compiler, but for tools we just use the precompiled libraries that
1571-
// we've downloaded
1572-
let use_snapshot = mode == Mode::ToolBootstrap;
1573-
assert!(!use_snapshot || stage == 0 || self.local_rebuild);
1574-
1575-
let maybe_sysroot = self.sysroot(compiler);
1576-
let sysroot = if use_snapshot { self.rustc_snapshot_sysroot() } else { &maybe_sysroot };
1577-
let libdir = self.rustc_libdir(compiler);
1578-
15791602
// Clear the output directory if the real rustc we're using has changed;
15801603
// Cargo cannot detect this as it thinks rustc is bootstrap/debug/rustc.
15811604
//
@@ -1611,10 +1634,19 @@ impl<'a> Builder<'a> {
16111634
)
16121635
.env("RUSTC_ERROR_METADATA_DST", self.extended_error_dir())
16131636
.env("RUSTC_BREAK_ON_ICE", "1");
1614-
// Clippy support is a hack and uses the default `cargo-clippy` in path.
1615-
// Don't override RUSTC so that the `cargo-clippy` in path will be run.
1616-
if cmd != "clippy" {
1617-
cargo.env("RUSTC", self.bootstrap_out.join("rustc"));
1637+
1638+
// Set RUSTC_WRAPPER to the bootstrap shim, which switches between beta and in-tree
1639+
// sysroot depending on whether we're building build scripts.
1640+
// NOTE: we intentionally use RUSTC_WRAPPER so that we can support clippy - RUSTC is not
1641+
// respected by clippy-driver; RUSTC_WRAPPER happens earlier, before clippy runs.
1642+
cargo.env("RUSTC_WRAPPER", self.bootstrap_out.join("rustc"));
1643+
// NOTE: we also need to set RUSTC so cargo can run `rustc -vV`; apparently that ignores RUSTC_WRAPPER >:(
1644+
cargo.env("RUSTC", self.bootstrap_out.join("rustc"));
1645+
1646+
// Someone might have set some previous rustc wrapper (e.g.
1647+
// sccache) before bootstrap overrode it. Respect that variable.
1648+
if let Some(existing_wrapper) = env::var_os("RUSTC_WRAPPER") {
1649+
cargo.env("RUSTC_WRAPPER_REAL", existing_wrapper);
16181650
}
16191651

16201652
// Dealing with rpath here is a little special, so let's go into some
@@ -1991,7 +2023,11 @@ impl<'a> Builder<'a> {
19912023
// Environment variables *required* throughout the build
19922024
//
19932025
// FIXME: should update code to not require this env var
2026+
2027+
// The host this new compiler will *run* on.
19942028
cargo.env("CFG_COMPILER_HOST_TRIPLE", target.triple);
2029+
// The host this new compiler is being *built* on.
2030+
cargo.env("CFG_COMPILER_BUILD_TRIPLE", compiler.host.triple);
19952031

19962032
// Set this for all builds to make sure doc builds also get it.
19972033
cargo.env("CFG_RELEASE_CHANNEL", &self.config.channel);

‎src/bootstrap/src/core/download.rs

+34-1
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,10 @@ impl Config {
208208
Some(other) => panic!("unsupported protocol {other} in {url}"),
209209
None => panic!("no protocol in {url}"),
210210
}
211-
t!(std::fs::rename(&tempfile, dest_path));
211+
t!(
212+
std::fs::rename(&tempfile, dest_path),
213+
format!("failed to rename {tempfile:?} to {dest_path:?}")
214+
);
212215
}
213216

214217
fn download_http_with_retries(&self, tempfile: &Path, url: &str, help_on_error: &str) {
@@ -375,6 +378,32 @@ enum DownloadSource {
375378

376379
/// Functions that are only ever called once, but named for clarify and to avoid thousand-line functions.
377380
impl Config {
381+
pub(crate) fn download_clippy(&self) -> PathBuf {
382+
self.verbose("downloading stage0 clippy artifacts");
383+
384+
let date = &self.stage0_metadata.compiler.date;
385+
let version = &self.stage0_metadata.compiler.version;
386+
let host = self.build;
387+
388+
let bin_root = self.out.join(host.triple).join("stage0");
389+
let clippy_stamp = bin_root.join(".clippy-stamp");
390+
let cargo_clippy = bin_root.join("bin").join(exe("cargo-clippy", host));
391+
if cargo_clippy.exists() && !program_out_of_date(&clippy_stamp, &date) {
392+
return cargo_clippy;
393+
}
394+
395+
let filename = format!("clippy-{version}-{host}.tar.xz");
396+
self.download_component(DownloadSource::Dist, filename, "clippy-preview", date, "stage0");
397+
if self.should_fix_bins_and_dylibs() {
398+
self.fix_bin_or_dylib(&cargo_clippy);
399+
self.fix_bin_or_dylib(&cargo_clippy.with_file_name(exe("clippy-driver", host)));
400+
}
401+
402+
cargo_clippy
403+
}
404+
405+
/// NOTE: rustfmt is a completely different toolchain than the bootstrap compiler, so it can't
406+
/// reuse target directories or artifacts
378407
pub(crate) fn maybe_download_rustfmt(&self) -> Option<PathBuf> {
379408
let RustfmtMetadata { date, version } = self.stage0_metadata.rustfmt.as_ref()?;
380409
let channel = format!("{version}-{date}");
@@ -544,6 +573,10 @@ impl Config {
544573
key: &str,
545574
destination: &str,
546575
) {
576+
if self.dry_run() {
577+
return;
578+
}
579+
547580
let cache_dst = self.out.join("cache");
548581
let cache_dir = cache_dst.join(key);
549582
if !cache_dir.exists() {

‎src/bootstrap/src/utils/dylib.rs

+13
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,16 @@ pub fn dylib_path() -> Vec<std::path::PathBuf> {
2525
};
2626
std::env::split_paths(&var).collect()
2727
}
28+
29+
/// Given an executable called `name`, return the filename for the
30+
/// executable for a particular target.
31+
#[allow(dead_code)]
32+
pub fn exe(name: &str, target: &str) -> String {
33+
if target.contains("windows") {
34+
format!("{name}.exe")
35+
} else if target.contains("uefi") {
36+
format!("{name}.efi")
37+
} else {
38+
name.to_string()
39+
}
40+
}

‎src/bootstrap/src/utils/helpers.rs

+1-9
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,8 @@ macro_rules! t {
4646
}
4747
pub use t;
4848

49-
/// Given an executable called `name`, return the filename for the
50-
/// executable for a particular target.
5149
pub fn exe(name: &str, target: TargetSelection) -> String {
52-
if target.is_windows() {
53-
format!("{name}.exe")
54-
} else if target.contains("uefi") {
55-
format!("{name}.efi")
56-
} else {
57-
name.to_string()
58-
}
50+
crate::utils::dylib::exe(name, &target.triple)
5951
}
6052

6153
/// Returns `true` if the file name given looks like a dynamic library.

‎src/ci/docker/host-x86_64/mingw-check/Dockerfile

+6
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,14 @@ COPY host-x86_64/mingw-check/validate-toolstate.sh /scripts/
3939
COPY host-x86_64/mingw-check/validate-error-codes.sh /scripts/
4040

4141
ENV RUN_CHECK_WITH_PARALLEL_QUERIES 1
42+
43+
# Run clippy just to make sure it doesn't error out; we don't actually want to gate on the warnings
44+
# though.
45+
# Ideally we'd use stage 1, but that ICEs: https://github.com/rust-lang/rust-clippy/issues/11230
46+
4247
ENV SCRIPT python3 ../x.py --stage 2 test src/tools/expand-yaml-anchors && \
4348
python3 ../x.py check --target=i686-pc-windows-gnu --host=i686-pc-windows-gnu && \
49+
python3 ../x.py clippy --stage 0 -Awarnings && \
4450
python3 ../x.py build --stage 0 src/tools/build-manifest && \
4551
python3 ../x.py test --stage 0 src/tools/compiletest && \
4652
python3 ../x.py test --stage 0 core alloc std test proc_macro && \

‎src/stage0.json

+48
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,54 @@
7474
"dist/2023-11-13/cargo-beta-x86_64-unknown-linux-musl.tar.xz": "790a859eaf49da5fdef1ea1ebf8b7f1f001bdaa62798a745d791bc915d886094",
7575
"dist/2023-11-13/cargo-beta-x86_64-unknown-netbsd.tar.gz": "f14395b57c0eca7c8ac9012b303c3781e16a2287698f68705fcbbc5c7c5916c9",
7676
"dist/2023-11-13/cargo-beta-x86_64-unknown-netbsd.tar.xz": "2c759c8bfc9cc556eb3464ac7e5589b573c46bd3938ac288ba52549121d3333d",
77+
"dist/2023-11-13/clippy-beta-aarch64-apple-darwin.tar.gz": "258b55f0db78c93f14952fc3e2d9fc49f1121de5268ec49d03d4f197bd7c9773",
78+
"dist/2023-11-13/clippy-beta-aarch64-apple-darwin.tar.xz": "554bd9488a9887c4acfb7c24775365108aef049feb15c93926128f805183f5e1",
79+
"dist/2023-11-13/clippy-beta-aarch64-pc-windows-msvc.tar.gz": "d120adaec65b5f44f40fba38fa10a0cda33769756ac7fc2878d64154acc7e06c",
80+
"dist/2023-11-13/clippy-beta-aarch64-pc-windows-msvc.tar.xz": "1dd23152a87fb8fa60569c304a3bbfd93f97c52d533fe53c8d9a5a4a72912938",
81+
"dist/2023-11-13/clippy-beta-aarch64-unknown-linux-gnu.tar.gz": "41198264d015ccf624e0fca876bee16f8c3cbb07596f5f4d4f271b9843b10e30",
82+
"dist/2023-11-13/clippy-beta-aarch64-unknown-linux-gnu.tar.xz": "1c889aad06c73dd2212403ff2aa5f256eba490cb8f1c81d7c75199a267052648",
83+
"dist/2023-11-13/clippy-beta-aarch64-unknown-linux-musl.tar.gz": "db784d117c156d0e8854518a5df6e9adbf0b2d24f3504358b1a371b8e7954eef",
84+
"dist/2023-11-13/clippy-beta-aarch64-unknown-linux-musl.tar.xz": "a946d40d32be1c5477f1740648e18af5792ceed38fe255e8cf09160acb27d02f",
85+
"dist/2023-11-13/clippy-beta-arm-unknown-linux-gnueabi.tar.gz": "1b760fadecb9f4c4c1780b36d9bd651fa6c8a8fb6b48dc0dfbfb2ecd9359ca92",
86+
"dist/2023-11-13/clippy-beta-arm-unknown-linux-gnueabi.tar.xz": "9e21f778eee57b067f411faa15425317158abd22f7c60dd4fc24214536ff7415",
87+
"dist/2023-11-13/clippy-beta-arm-unknown-linux-gnueabihf.tar.gz": "fbe3d7776b9353782d2690ff1c98a0ce5d8d23de2381ecd3d4eff4ce165b66d5",
88+
"dist/2023-11-13/clippy-beta-arm-unknown-linux-gnueabihf.tar.xz": "bfabf9e2419065173bf709166b0c81db66e1b2514003b28d08ec4410e04525a3",
89+
"dist/2023-11-13/clippy-beta-armv7-unknown-linux-gnueabihf.tar.gz": "5371c798687aece2b98e22cf5bca02e568913011393a86a1aa3b0ff79eeabb57",
90+
"dist/2023-11-13/clippy-beta-armv7-unknown-linux-gnueabihf.tar.xz": "82723066f2ec52fb5854a397f71df79db54976f4c03113034627c1a5c92ceffb",
91+
"dist/2023-11-13/clippy-beta-i686-pc-windows-gnu.tar.gz": "0214eee5dc37f3a780ca62f1e7a66c5e19d583542dbfca047e383dfacca604b3",
92+
"dist/2023-11-13/clippy-beta-i686-pc-windows-gnu.tar.xz": "cee7d7039b1ee909fa4a188d7fd0bae14d718bad98209d8df2dc087cc28d7a9c",
93+
"dist/2023-11-13/clippy-beta-i686-pc-windows-msvc.tar.gz": "b6f1042f0d4652e941d975af8aeb4a61e335c585c1cd6dad7f85ba5b03c6face",
94+
"dist/2023-11-13/clippy-beta-i686-pc-windows-msvc.tar.xz": "a31c1951abdff06c3709472acede08cd000b940a7a65f9afd664ca276fc724c1",
95+
"dist/2023-11-13/clippy-beta-i686-unknown-linux-gnu.tar.gz": "1e0f2f2ea38988cd0012ceedacfa9828b4b6c6dfd3dca9eee5a98483fd90f439",
96+
"dist/2023-11-13/clippy-beta-i686-unknown-linux-gnu.tar.xz": "f19b56068a40af2aee7c828a4688289a8142f98a81b80d66d12ddc6725209628",
97+
"dist/2023-11-13/clippy-beta-loongarch64-unknown-linux-gnu.tar.gz": "e0f02e3ba303bef68a7cd1ea5effaa126eedbdc892b01dac85f4b3e6d4b2f522",
98+
"dist/2023-11-13/clippy-beta-loongarch64-unknown-linux-gnu.tar.xz": "17a01e484f238bff790ad6cfededa8d9c7df0f6f36af336a1e8a7414a43271f5",
99+
"dist/2023-11-13/clippy-beta-powerpc-unknown-linux-gnu.tar.gz": "ea4bc3aed8739bcecaa97f01972bbbba45e838c811ca0c408824b1409f9ac7c6",
100+
"dist/2023-11-13/clippy-beta-powerpc-unknown-linux-gnu.tar.xz": "9ddb71b1f35f6953aedc6a1f93dde4a9b014255b5bd7d4448e4dd9b1a65c7f5a",
101+
"dist/2023-11-13/clippy-beta-powerpc64-unknown-linux-gnu.tar.gz": "ccb95c3ce3dd4ee2776201ce1bd79122e97916c555126393f1839d301824e746",
102+
"dist/2023-11-13/clippy-beta-powerpc64-unknown-linux-gnu.tar.xz": "9aad65fcefe5789670bc85cd177bd72eac469eb0a33db54685132a7ce5115a83",
103+
"dist/2023-11-13/clippy-beta-powerpc64le-unknown-linux-gnu.tar.gz": "eb50e6349423c963fdce3193f361572a47e4d7fe5b90f8a297471c0a5df31feb",
104+
"dist/2023-11-13/clippy-beta-powerpc64le-unknown-linux-gnu.tar.xz": "aa72d573b344953b9224ceb6eff484b6f012febfc009bc7773d398a3ffa69ea0",
105+
"dist/2023-11-13/clippy-beta-riscv64gc-unknown-linux-gnu.tar.gz": "8546ac9a9e5081384d7ef889254e41998f60c04bbdca319128039e8a4e7cbc68",
106+
"dist/2023-11-13/clippy-beta-riscv64gc-unknown-linux-gnu.tar.xz": "15fa574f7f7de2d8fcd124f44b1880a78bdd6a2ba77fe6b392299dd746ea9c63",
107+
"dist/2023-11-13/clippy-beta-s390x-unknown-linux-gnu.tar.gz": "ee27937b85c142ebf46bb59ad9e113414cc9d631179a2f8df2b32980aa57b515",
108+
"dist/2023-11-13/clippy-beta-s390x-unknown-linux-gnu.tar.xz": "e6e99e486418cb23a0cb80a2b145413bfeb62746b60fd9a0ff3959424b7ee07e",
109+
"dist/2023-11-13/clippy-beta-x86_64-apple-darwin.tar.gz": "8a37545cef25abdd3c722a21385b843cb9d8d06fed8f302880beecbcb9373f98",
110+
"dist/2023-11-13/clippy-beta-x86_64-apple-darwin.tar.xz": "f572586fc28bb5b2b77464d89b41c374de4002b453c297a8fc1468cee10db972",
111+
"dist/2023-11-13/clippy-beta-x86_64-pc-windows-gnu.tar.gz": "5add2dab913488a482be6849887d9fa8c3cd197d3c423595a7133b511efcefca",
112+
"dist/2023-11-13/clippy-beta-x86_64-pc-windows-gnu.tar.xz": "1d0d97a6b8703166616b6ae56d2b344e85dfa1db36976585d21cda65362cfff8",
113+
"dist/2023-11-13/clippy-beta-x86_64-pc-windows-msvc.tar.gz": "4069dc9296cdc54af7e14d4ba5fc12ee5e6445be74f39c39526e4ed77378112f",
114+
"dist/2023-11-13/clippy-beta-x86_64-pc-windows-msvc.tar.xz": "fdf4dfaef5f8fb24075bf8b24bdbd71804a49acda40921de84c61bc2250ade6c",
115+
"dist/2023-11-13/clippy-beta-x86_64-unknown-freebsd.tar.gz": "4554eee1b1bd7e5575eaf5e7a815686da88fb395a80084c7a0fad3f338ac83b1",
116+
"dist/2023-11-13/clippy-beta-x86_64-unknown-freebsd.tar.xz": "b0f1718df2a1e88ff4aa239bf4b9dc7a971fbc64cfa1ef8f399760fe09117097",
117+
"dist/2023-11-13/clippy-beta-x86_64-unknown-illumos.tar.gz": "035400e01edb1a91ddcac72fe3ca1ea94465c4fe9047546d057f6867d8b068d1",
118+
"dist/2023-11-13/clippy-beta-x86_64-unknown-illumos.tar.xz": "3ad1b06c3bc1e327ea7a3b30908b48bf6b59b7222101e5a30fb054b1be579087",
119+
"dist/2023-11-13/clippy-beta-x86_64-unknown-linux-gnu.tar.gz": "88d611c40a30922515d09425ecd1a8b87f46131ab61f3c4bf841a41f281134b3",
120+
"dist/2023-11-13/clippy-beta-x86_64-unknown-linux-gnu.tar.xz": "9908227c8a684aa5c24f3272997fc9688044580f792375ec9fc8f775e394953f",
121+
"dist/2023-11-13/clippy-beta-x86_64-unknown-linux-musl.tar.gz": "10a7b2427ee8a4e83d271023e6bd00573266f317789cff3b75e68d7bddc41cbc",
122+
"dist/2023-11-13/clippy-beta-x86_64-unknown-linux-musl.tar.xz": "cb1f3c2be55e11920340344d2f2f796098b7f13c9ddd2fb8a38ac1b29c5d6925",
123+
"dist/2023-11-13/clippy-beta-x86_64-unknown-netbsd.tar.gz": "2b29461b085f0af1bb50d10ef8bf6448550c9b5867a364da3d921daea8e0a13d",
124+
"dist/2023-11-13/clippy-beta-x86_64-unknown-netbsd.tar.xz": "e9d2ff4c8c63a9cfb7d8b12df4942f5b90c33c4fa3f755bbdc3c5df1b2b877fe",
77125
"dist/2023-11-13/rust-std-beta-aarch64-apple-darwin.tar.gz": "818e3554a6bd82c3533e68f8597c09563af1dc08d6b23bbd2323b8ebcce251f6",
78126
"dist/2023-11-13/rust-std-beta-aarch64-apple-darwin.tar.xz": "6f9333c281859e40b1c1c20e9f07ac1633ca2c99e86268b521945b8ed6cf6a50",
79127
"dist/2023-11-13/rust-std-beta-aarch64-apple-ios-sim.tar.gz": "fa4bb7a5d4dcecb2dfd8596e3ad442a5fe05468c939de3b36e44a43e10ea9d30",

‎src/tools/bump-stage0/src/main.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use indexmap::IndexMap;
44
use std::collections::HashMap;
55

66
const PATH: &str = "src/stage0.json";
7-
const COMPILER_COMPONENTS: &[&str] = &["rustc", "rust-std", "cargo"];
7+
const COMPILER_COMPONENTS: &[&str] = &["rustc", "rust-std", "cargo", "clippy-preview"];
88
const RUSTFMT_COMPONENTS: &[&str] = &["rustfmt-preview", "rustc"];
99

1010
struct Tool {

0 commit comments

Comments
 (0)
Please sign in to comment.