Auto merge of #79370 - jyn514:tidy-error, r=GuillaumeGomez

Don't abort rustdoc tests if `tidy` isn't installed

Follow-up to https://github.com/rust-lang/rust/pull/78752.

Before:

```
Check compiletest suite=rustdoc mode=rustdoc (x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu)

running 396 tests
..................................................2020-11-23T12:12:37.735649Z ERROR compiletest::runtest: fatal error, panic: "failed to run tidy - is it installed? - No such file or directory (os error 2)"
F................................................. 100/396
.................................................................................................... 200/396
.................................................................................................... 300/396
...............................i...............2020-11-23T12:15:00.271271Z ERROR compiletest::runtest: fatal error, panic: "failed to run tidy - is it installed? - No such file or directory (os error 2)"
F................................................
```

After:

```
Check compiletest suite=rustdoc mode=rustdoc (x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu)

running 4 tests
.FFF
failures:

---- [rustdoc] rustdoc/fn-pointer-arg-name.rs stdout ----

error: htmldocck failed!
status: exit code: 1
command: "/usr/bin/python" "/home/joshua/rustc/src/etc/htmldocck.py" "/home/joshua/rustc/build/x86_64-unknown-linux-gnu/test/rustdoc/fn-pointer-arg-name" "/home/joshua/rustc/src/test/rustdoc/fn-pointer-arg-name.rs"
stdout:
------------------------------------------

------------------------------------------
stderr:
------------------------------------------
4: `@has` check failed
	`XPATH PATTERN` did not match
	// `@has` - '//*[`@class="rust` fn"]' 'pub fn f(callback: fn(len: usize, foo: u32))'

Encountered 1 errors

------------------------------------------

info: generating a diff against nightly rustdoc
failed to run tidy - is it installed? - Permission denied (os error 13)
failed to run tidy - is it installed? - Permission denied (os error 13)
 # a diff without running `tidy`
```

r? `@GuillaumeGomez`
This commit is contained in:
bors 2020-12-12 15:03:00 +00:00
commit 4c5c4aa002
3 changed files with 26 additions and 17 deletions

View File

@ -327,6 +327,9 @@ pub struct Config {
/// created in `/<build_base>/rustfix_missing_coverage.txt` /// created in `/<build_base>/rustfix_missing_coverage.txt`
pub rustfix_coverage: bool, pub rustfix_coverage: bool,
/// whether to run `tidy` when a rustdoc test fails
pub has_tidy: bool,
// Configuration for various run-make tests frobbing things like C compilers // Configuration for various run-make tests frobbing things like C compilers
// or querying about various LLVM component information. // or querying about various LLVM component information.
pub cc: String, pub cc: String,

View File

@ -14,7 +14,7 @@ use std::ffi::OsString;
use std::fs; use std::fs;
use std::io::{self, ErrorKind}; use std::io::{self, ErrorKind};
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::process::Command; use std::process::{Command, Stdio};
use std::time::SystemTime; use std::time::SystemTime;
use test::ColorConfig; use test::ColorConfig;
use tracing::*; use tracing::*;
@ -43,6 +43,10 @@ fn main() {
panic!("Can't find Valgrind to run Valgrind tests"); panic!("Can't find Valgrind to run Valgrind tests");
} }
if !config.has_tidy && config.mode == Mode::Rustdoc {
eprintln!("warning: `tidy` is not installed; generated diffs will be harder to read");
}
log_config(&config); log_config(&config);
run_tests(config); run_tests(config);
} }
@ -189,6 +193,11 @@ pub fn parse_config(args: Vec<String>) -> Config {
let src_base = opt_path(matches, "src-base"); let src_base = opt_path(matches, "src-base");
let run_ignored = matches.opt_present("ignored"); let run_ignored = matches.opt_present("ignored");
let has_tidy = Command::new("tidy")
.arg("--version")
.stdout(Stdio::null())
.status()
.map_or(false, |status| status.success());
Config { Config {
bless: matches.opt_present("bless"), bless: matches.opt_present("bless"),
compile_lib_path: make_absolute(opt_path(matches, "compile-lib-path")), compile_lib_path: make_absolute(opt_path(matches, "compile-lib-path")),
@ -244,6 +253,7 @@ pub fn parse_config(args: Vec<String>) -> Config {
remote_test_client: matches.opt_str("remote-test-client").map(PathBuf::from), remote_test_client: matches.opt_str("remote-test-client").map(PathBuf::from),
compare_mode: matches.opt_str("compare-mode").map(CompareMode::parse), compare_mode: matches.opt_str("compare-mode").map(CompareMode::parse),
rustfix_coverage: matches.opt_present("rustfix-coverage"), rustfix_coverage: matches.opt_present("rustfix-coverage"),
has_tidy,
cc: matches.opt_str("cc").unwrap(), cc: matches.opt_str("cc").unwrap(),
cxx: matches.opt_str("cxx").unwrap(), cxx: matches.opt_str("cxx").unwrap(),

View File

@ -2394,7 +2394,8 @@ impl<'test> TestCx<'test> {
let proc_res = new_rustdoc.document(&compare_dir); let proc_res = new_rustdoc.document(&compare_dir);
if !proc_res.status.success() { if !proc_res.status.success() {
proc_res.fatal(Some("failed to run nightly rustdoc"), || ()); eprintln!("failed to run nightly rustdoc");
return;
} }
#[rustfmt::skip] #[rustfmt::skip]
@ -2408,28 +2409,22 @@ impl<'test> TestCx<'test> {
"-modify", "-modify",
]; ];
let tidy_dir = |dir| { let tidy_dir = |dir| {
let tidy = |file: &_| {
Command::new("tidy")
.args(&tidy_args)
.arg(file)
.spawn()
.unwrap_or_else(|err| {
self.fatal(&format!("failed to run tidy - is it installed? - {}", err))
})
.wait()
.unwrap()
};
for entry in walkdir::WalkDir::new(dir) { for entry in walkdir::WalkDir::new(dir) {
let entry = entry.expect("failed to read file"); let entry = entry.expect("failed to read file");
if entry.file_type().is_file() if entry.file_type().is_file()
&& entry.path().extension().and_then(|p| p.to_str()) == Some("html".into()) && entry.path().extension().and_then(|p| p.to_str()) == Some("html".into())
{ {
tidy(entry.path()); let status =
Command::new("tidy").args(&tidy_args).arg(entry.path()).status().unwrap();
// `tidy` returns 1 if it modified the file.
assert!(status.success() || status.code() == Some(1));
} }
} }
}; };
tidy_dir(out_dir); if self.config.has_tidy {
tidy_dir(&compare_dir); tidy_dir(out_dir);
tidy_dir(&compare_dir);
}
let pager = { let pager = {
let output = Command::new("git").args(&["config", "--get", "core.pager"]).output().ok(); let output = Command::new("git").args(&["config", "--get", "core.pager"]).output().ok();
@ -2442,7 +2437,8 @@ impl<'test> TestCx<'test> {
}) })
}; };
let mut diff = Command::new("diff"); let mut diff = Command::new("diff");
diff.args(&["-u", "-r"]).args(&[&compare_dir, out_dir]); // diff recursively, showing context, and excluding .css files
diff.args(&["-u", "-r", "-x", "*.css"]).args(&[&compare_dir, out_dir]);
let output = if let Some(pager) = pager { let output = if let Some(pager) = pager {
let diff_pid = diff.stdout(Stdio::piped()).spawn().expect("failed to run `diff`"); let diff_pid = diff.stdout(Stdio::piped()).spawn().expect("failed to run `diff`");