Add explicit exception list to linkchecker
This commit is contained in:
parent
9392a5ed94
commit
a9680938d0
1 changed files with 40 additions and 22 deletions
|
@ -23,6 +23,31 @@ use std::rc::Rc;
|
||||||
|
|
||||||
use crate::Redirect::*;
|
use crate::Redirect::*;
|
||||||
|
|
||||||
|
// Add linkcheck exceptions here
|
||||||
|
// If at all possible you should use intra-doc links to avoid linkcheck issues. These
|
||||||
|
// are cases where that does not work
|
||||||
|
const LINKCHECK_EXCEPTIONS: &[(&str, &[&str])] = &[
|
||||||
|
// These are methods on slice, and `Self` does not work on primitive impls
|
||||||
|
// in intra-doc links (intra-doc links are weird)
|
||||||
|
// https://github.com/rust-lang/rust/issues/62834 is necessary to be
|
||||||
|
// able to link to slices
|
||||||
|
(
|
||||||
|
"std/io/struct.IoSlice.html",
|
||||||
|
&[
|
||||||
|
"#method.as_mut_ptr",
|
||||||
|
"#method.sort_by_key",
|
||||||
|
"#method.make_ascii_uppercase",
|
||||||
|
"#method.make_ascii_lowercase",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
// These try to link to std::collections, but are defined in alloc
|
||||||
|
// https://github.com/rust-lang/rust/issues/74481
|
||||||
|
("std/collections/btree_map/struct.BTreeMap.html", &["#insert-and-complex-keys"]),
|
||||||
|
("std/collections/btree_set/struct.BTreeSet.html", &["#insert-and-complex-keys"]),
|
||||||
|
("alloc/collections/btree_map/struct.BTreeMap.html", &["#insert-and-complex-keys"]),
|
||||||
|
("alloc/collections/btree_set/struct.BTreeSet.html", &["#insert-and-complex-keys"]),
|
||||||
|
];
|
||||||
|
|
||||||
macro_rules! t {
|
macro_rules! t {
|
||||||
($e:expr) => {
|
($e:expr) => {
|
||||||
match $e {
|
match $e {
|
||||||
|
@ -111,30 +136,20 @@ fn walk(cache: &mut Cache, root: &Path, dir: &Path, errors: &mut bool) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_exception(file: &Path, link: &str) -> bool {
|
||||||
|
if let Some(entry) = LINKCHECK_EXCEPTIONS.iter().find(|&(f, _)| file.ends_with(f)) {
|
||||||
|
entry.1.contains(&link)
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn check(cache: &mut Cache, root: &Path, file: &Path, errors: &mut bool) -> Option<PathBuf> {
|
fn check(cache: &mut Cache, root: &Path, file: &Path, errors: &mut bool) -> Option<PathBuf> {
|
||||||
// Ignore non-HTML files.
|
// Ignore non-HTML files.
|
||||||
if file.extension().and_then(|s| s.to_str()) != Some("html") {
|
if file.extension().and_then(|s| s.to_str()) != Some("html") {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unfortunately we're not 100% full of valid links today to we need a few
|
|
||||||
// exceptions to get this past `make check` today.
|
|
||||||
// FIXME(#32129)
|
|
||||||
if file.ends_with("std/io/struct.IoSlice.html")
|
|
||||||
{
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME(#32130)
|
|
||||||
if file.ends_with("alloc/collections/btree_map/struct.BTreeMap.html")
|
|
||||||
|| file.ends_with("alloc/collections/btree_set/struct.BTreeSet.html")
|
|
||||||
|| file.ends_with("std/collections/btree_map/struct.BTreeMap.html")
|
|
||||||
|| file.ends_with("std/collections/btree_set/struct.BTreeSet.html")
|
|
||||||
|| file.ends_with("std/collections/hash_set/struct.HashSet.html")
|
|
||||||
{
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
|
|
||||||
let res = load_file(cache, root, file, SkipRedirect);
|
let res = load_file(cache, root, file, SkipRedirect);
|
||||||
let (pretty_file, contents) = match res {
|
let (pretty_file, contents) = match res {
|
||||||
Ok(res) => res,
|
Ok(res) => res,
|
||||||
|
@ -249,17 +264,20 @@ fn check(cache: &mut Cache, root: &Path, file: &Path, errors: &mut bool) -> Opti
|
||||||
let entry = &mut cache.get_mut(&pretty_path).unwrap();
|
let entry = &mut cache.get_mut(&pretty_path).unwrap();
|
||||||
entry.parse_ids(&pretty_path, &contents, errors);
|
entry.parse_ids(&pretty_path, &contents, errors);
|
||||||
|
|
||||||
if !entry.ids.contains(*fragment) {
|
if !entry.ids.contains(*fragment) && !is_exception(file, &format!("#{}", fragment))
|
||||||
|
{
|
||||||
*errors = true;
|
*errors = true;
|
||||||
print!("{}:{}: broken link fragment ", pretty_file.display(), i + 1);
|
print!("{}:{}: broken link fragment ", pretty_file.display(), i + 1);
|
||||||
println!("`#{}` pointing to `{}`", fragment, pretty_path.display());
|
println!("`#{}` pointing to `{}`", fragment, pretty_path.display());
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
*errors = true;
|
|
||||||
print!("{}:{}: broken link - ", pretty_file.display(), i + 1);
|
|
||||||
let pretty_path = path.strip_prefix(root).unwrap_or(&path);
|
let pretty_path = path.strip_prefix(root).unwrap_or(&path);
|
||||||
println!("{}", pretty_path.display());
|
if !is_exception(file, pretty_path.to_str().unwrap()) {
|
||||||
|
*errors = true;
|
||||||
|
print!("{}:{}: broken link - ", pretty_file.display(), i + 1);
|
||||||
|
println!("{}", pretty_path.display());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Some(pretty_file)
|
Some(pretty_file)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue