Auto merge of #82359 - JohnTitor:rollup-6puemik, r=JohnTitor
Rollup of 11 pull requests Successful merges: - #81300 (BTree: share panicky test code & test panic during clear, clone) - #81706 (Document BinaryHeap unsafe functions) - #81833 (parallelize x.py test tidy) - #81966 (Add new `rustc` target for Arm64 machines that can target the iphonesimulator) - #82154 (Update RELEASES.md 1.50 to include methods stabilized in #79342) - #82177 (Do not delete bootstrap.exe on Windows during clean) - #82181 (Add check for ES5 in CI) - #82229 (Add [A-diagnostics] bug report template) - #82233 (try-back-block-type test: Use TryFromSliceError for From test) - #82302 (Remove unsafe impl Send for CompletedTest & TestResult) - #82349 (test: Print test name only once on timeout) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
3e826bb112
24 changed files with 703 additions and 306 deletions
|
|
@ -51,14 +51,40 @@ fn rm_rf(path: &Path) {
|
|||
}
|
||||
Ok(metadata) => {
|
||||
if metadata.file_type().is_file() || metadata.file_type().is_symlink() {
|
||||
do_op(path, "remove file", |p| fs::remove_file(p));
|
||||
do_op(path, "remove file", |p| {
|
||||
fs::remove_file(p).or_else(|e| {
|
||||
// Work around the fact that we cannot
|
||||
// delete an executable while it runs on Windows.
|
||||
#[cfg(windows)]
|
||||
if e.kind() == std::io::ErrorKind::PermissionDenied
|
||||
&& p.file_name().and_then(std::ffi::OsStr::to_str)
|
||||
== Some("bootstrap.exe")
|
||||
{
|
||||
eprintln!("warning: failed to delete '{}'.", p.display());
|
||||
return Ok(());
|
||||
}
|
||||
Err(e)
|
||||
})
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
for file in t!(fs::read_dir(path)) {
|
||||
rm_rf(&t!(file).path());
|
||||
}
|
||||
do_op(path, "remove dir", |p| fs::remove_dir(p));
|
||||
do_op(path, "remove dir", |p| {
|
||||
fs::remove_dir(p).or_else(|e| {
|
||||
// Check for dir not empty on Windows
|
||||
#[cfg(windows)]
|
||||
if matches!(e.kind(), std::io::ErrorKind::Other)
|
||||
&& e.raw_os_error() == Some(145)
|
||||
{
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
Err(e)
|
||||
})
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
@ -73,12 +99,18 @@ where
|
|||
// As a result, we have some special logic to remove readonly files on windows.
|
||||
// This is also the reason that we can't use things like fs::remove_dir_all().
|
||||
Err(ref e) if cfg!(windows) && e.kind() == ErrorKind::PermissionDenied => {
|
||||
let mut p = t!(path.symlink_metadata()).permissions();
|
||||
let m = t!(path.symlink_metadata());
|
||||
let mut p = m.permissions();
|
||||
p.set_readonly(false);
|
||||
t!(fs::set_permissions(path, p));
|
||||
f(path).unwrap_or_else(|e| {
|
||||
// Delete symlinked directories on Windows
|
||||
#[cfg(windows)]
|
||||
if m.file_type().is_symlink() && path.is_dir() && fs::remove_dir(path).is_ok() {
|
||||
return;
|
||||
}
|
||||
panic!("failed to {} {}: {}", desc, path.display(), e);
|
||||
})
|
||||
});
|
||||
}
|
||||
Err(e) => {
|
||||
panic!("failed to {} {}: {}", desc, path.display(), e);
|
||||
|
|
|
|||
|
|
@ -3,10 +3,12 @@
|
|||
use crate::Build;
|
||||
use build_helper::{output, t};
|
||||
use ignore::WalkBuilder;
|
||||
use std::path::Path;
|
||||
use std::collections::VecDeque;
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::process::{Command, Stdio};
|
||||
use std::sync::mpsc::SyncSender;
|
||||
|
||||
fn rustfmt(src: &Path, rustfmt: &Path, path: &Path, check: bool) {
|
||||
fn rustfmt(src: &Path, rustfmt: &Path, paths: &[PathBuf], check: bool) -> impl FnMut() {
|
||||
let mut cmd = Command::new(&rustfmt);
|
||||
// avoid the submodule config paths from coming into play,
|
||||
// we only allow a single global config for the workspace for now
|
||||
|
|
@ -17,17 +19,21 @@ fn rustfmt(src: &Path, rustfmt: &Path, path: &Path, check: bool) {
|
|||
if check {
|
||||
cmd.arg("--check");
|
||||
}
|
||||
cmd.arg(&path);
|
||||
cmd.args(paths);
|
||||
let cmd_debug = format!("{:?}", cmd);
|
||||
let status = cmd.status().expect("executing rustfmt");
|
||||
if !status.success() {
|
||||
eprintln!(
|
||||
"Running `{}` failed.\nIf you're running `tidy`, \
|
||||
try again with `--bless`. Or, if you just want to format \
|
||||
code, run `./x.py fmt` instead.",
|
||||
cmd_debug,
|
||||
);
|
||||
std::process::exit(1);
|
||||
let mut cmd = cmd.spawn().expect("running rustfmt");
|
||||
// poor man's async: return a closure that'll wait for rustfmt's completion
|
||||
move || {
|
||||
let status = cmd.wait().unwrap();
|
||||
if !status.success() {
|
||||
eprintln!(
|
||||
"Running `{}` failed.\nIf you're running `tidy`, \
|
||||
try again with `--bless`. Or, if you just want to format \
|
||||
code, run `./x.py fmt` instead.",
|
||||
cmd_debug,
|
||||
);
|
||||
std::process::exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -101,19 +107,58 @@ pub fn format(build: &Build, check: bool) {
|
|||
}
|
||||
let ignore_fmt = ignore_fmt.build().unwrap();
|
||||
|
||||
let rustfmt_path = build.config.initial_rustfmt.as_ref().unwrap_or_else(|| {
|
||||
eprintln!("./x.py fmt is not supported on this channel");
|
||||
std::process::exit(1);
|
||||
let rustfmt_path = build
|
||||
.config
|
||||
.initial_rustfmt
|
||||
.as_ref()
|
||||
.unwrap_or_else(|| {
|
||||
eprintln!("./x.py fmt is not supported on this channel");
|
||||
std::process::exit(1);
|
||||
})
|
||||
.to_path_buf();
|
||||
let src = build.src.clone();
|
||||
let (tx, rx): (SyncSender<PathBuf>, _) = std::sync::mpsc::sync_channel(128);
|
||||
let walker =
|
||||
WalkBuilder::new(src.clone()).types(matcher).overrides(ignore_fmt).build_parallel();
|
||||
|
||||
// there is a lot of blocking involved in spawning a child process and reading files to format.
|
||||
// spawn more processes than available concurrency to keep the CPU busy
|
||||
let max_processes = build.jobs() as usize * 2;
|
||||
|
||||
// spawn child processes on a separate thread so we can batch entries we have received from ignore
|
||||
let thread = std::thread::spawn(move || {
|
||||
let mut children = VecDeque::new();
|
||||
while let Ok(path) = rx.recv() {
|
||||
// try getting a few more paths from the channel to amortize the overhead of spawning processes
|
||||
let paths: Vec<_> = rx.try_iter().take(7).chain(std::iter::once(path)).collect();
|
||||
|
||||
let child = rustfmt(&src, &rustfmt_path, paths.as_slice(), check);
|
||||
children.push_back(child);
|
||||
|
||||
if children.len() >= max_processes {
|
||||
// await oldest child
|
||||
children.pop_front().unwrap()();
|
||||
}
|
||||
}
|
||||
|
||||
// await remaining children
|
||||
for mut child in children {
|
||||
child();
|
||||
}
|
||||
});
|
||||
let src = &build.src;
|
||||
let walker = WalkBuilder::new(src).types(matcher).overrides(ignore_fmt).build_parallel();
|
||||
|
||||
walker.run(|| {
|
||||
let tx = tx.clone();
|
||||
Box::new(move |entry| {
|
||||
let entry = t!(entry);
|
||||
if entry.file_type().map_or(false, |t| t.is_file()) {
|
||||
rustfmt(src, &rustfmt_path, &entry.path(), check);
|
||||
t!(tx.send(entry.into_path()));
|
||||
}
|
||||
ignore::WalkState::Continue
|
||||
})
|
||||
});
|
||||
|
||||
drop(tx);
|
||||
|
||||
thread.join().unwrap();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,6 +17,11 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
|||
pkg-config \
|
||||
mingw-w64
|
||||
|
||||
RUN curl -sL https://nodejs.org/dist/v14.4.0/node-v14.4.0-linux-x64.tar.xz | tar -xJ
|
||||
ENV PATH="/node-v14.4.0-linux-x64/bin:${PATH}"
|
||||
# Install es-check
|
||||
RUN npm install es-check -g
|
||||
|
||||
COPY scripts/sccache.sh /scripts/
|
||||
RUN sh /scripts/sccache.sh
|
||||
|
||||
|
|
@ -29,4 +34,6 @@ ENV SCRIPT python3 ../x.py --stage 2 test src/tools/expand-yaml-anchors && \
|
|||
python3 ../x.py test --stage 0 src/tools/compiletest && \
|
||||
python3 ../x.py test --stage 2 src/tools/tidy && \
|
||||
python3 ../x.py doc --stage 0 library/std && \
|
||||
/scripts/validate-toolstate.sh
|
||||
/scripts/validate-toolstate.sh && \
|
||||
# Runs checks to ensure that there are no ES5 issues in our JS code.
|
||||
es-check es5 ../src/librustdoc/html/static/*.js
|
||||
|
|
|
|||
|
|
@ -153,6 +153,7 @@ not available.
|
|||
target | std | host | notes
|
||||
-------|-----|------|-------
|
||||
`aarch64-apple-ios-macabi` | ? | | Apple Catalyst on ARM64
|
||||
`aarch64-apple-ios-sim` | ? | | Apple iOS Simulator on ARM64
|
||||
`aarch64-apple-tvos` | * | | ARM64 tvOS
|
||||
`aarch64-unknown-freebsd` | ✓ | ✓ | ARM64 FreeBSD
|
||||
`aarch64-unknown-hermit` | ? | |
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
#![feature(try_blocks)]
|
||||
|
||||
pub fn main() {
|
||||
let res: Result<u32, i32> = try {
|
||||
let res: Result<u32, std::array::TryFromSliceError> = try {
|
||||
Err("")?; //~ ERROR `?` couldn't convert the error
|
||||
5
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,16 +1,12 @@
|
|||
error[E0277]: `?` couldn't convert the error to `i32`
|
||||
error[E0277]: `?` couldn't convert the error to `TryFromSliceError`
|
||||
--> $DIR/try-block-bad-type.rs:7:16
|
||||
|
|
||||
LL | Err("")?;
|
||||
| ^ the trait `From<&str>` is not implemented for `i32`
|
||||
| ^ the trait `From<&str>` is not implemented for `TryFromSliceError`
|
||||
|
|
||||
= note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait
|
||||
= help: the following implementations were found:
|
||||
<i32 as From<NonZeroI32>>
|
||||
<i32 as From<bool>>
|
||||
<i32 as From<i16>>
|
||||
<i32 as From<i8>>
|
||||
and 2 others
|
||||
<TryFromSliceError as From<Infallible>>
|
||||
= note: required by `from`
|
||||
|
||||
error[E0271]: type mismatch resolving `<Result<i32, i32> as Try>::Ok == &str`
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue