-
Notifications
You must be signed in to change notification settings - Fork 12.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Filter linkcheck spurious failure #63927
Changes from 3 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,18 +1,18 @@ | ||
use clap::{crate_version}; | ||
use clap::crate_version; | ||
|
||
use std::env; | ||
use std::path::{Path, PathBuf}; | ||
|
||
use clap::{App, ArgMatches, SubCommand, AppSettings}; | ||
use clap::{App, AppSettings, ArgMatches, SubCommand}; | ||
|
||
use mdbook::errors::Result as Result3; | ||
use mdbook::MDBook; | ||
use mdbook::errors::{Result as Result3}; | ||
|
||
use failure::Error; | ||
#[cfg(feature = "linkcheck")] | ||
use mdbook::renderer::RenderContext; | ||
#[cfg(feature = "linkcheck")] | ||
use mdbook_linkcheck::{self, errors::BrokenLinks}; | ||
use failure::Error; | ||
|
||
fn main() { | ||
let d_message = "-d, --dest-dir=[dest-dir] | ||
|
@@ -21,18 +21,22 @@ fn main() { | |
'A directory for your book{n}(Defaults to Current Directory when omitted)'"; | ||
|
||
let matches = App::new("rustbook") | ||
.about("Build a book with mdBook") | ||
.author("Steve Klabnik <steve@steveklabnik.com>") | ||
.version(&*format!("v{}", crate_version!())) | ||
.setting(AppSettings::SubcommandRequired) | ||
.subcommand(SubCommand::with_name("build") | ||
.about("Build the book from the markdown files") | ||
.arg_from_usage(d_message) | ||
.arg_from_usage(dir_message)) | ||
.subcommand(SubCommand::with_name("linkcheck") | ||
.about("Run linkcheck with mdBook 3") | ||
.arg_from_usage(dir_message)) | ||
.get_matches(); | ||
.about("Build a book with mdBook") | ||
.author("Steve Klabnik <steve@steveklabnik.com>") | ||
.version(&*format!("v{}", crate_version!())) | ||
.setting(AppSettings::SubcommandRequired) | ||
.subcommand( | ||
SubCommand::with_name("build") | ||
.about("Build the book from the markdown files") | ||
.arg_from_usage(d_message) | ||
.arg_from_usage(dir_message), | ||
) | ||
.subcommand( | ||
SubCommand::with_name("linkcheck") | ||
.about("Run linkcheck with mdBook 3") | ||
.arg_from_usage(dir_message), | ||
) | ||
.get_matches(); | ||
|
||
// Check which subcomamnd the user ran... | ||
match matches.subcommand() { | ||
|
@@ -46,23 +50,39 @@ fn main() { | |
|
||
::std::process::exit(101); | ||
} | ||
}, | ||
} | ||
("linkcheck", Some(sub_matches)) => { | ||
if let Err(err) = linkcheck(sub_matches) { | ||
eprintln!("Error: {}", err); | ||
|
||
#[cfg(feature = "linkcheck")] | ||
{ | ||
if let Ok(broken_links) = err.downcast::<BrokenLinks>() { | ||
for cause in broken_links.links().iter() { | ||
eprintln!("\tCaused By: {}", cause); | ||
} | ||
// HACK: ignore timeouts | ||
let actually_broken = { | ||
#[cfg(feature = "linkcheck")] | ||
{ | ||
err.downcast::<BrokenLinks>() | ||
.map(|broken_links| { | ||
broken_links | ||
.links() | ||
.iter() | ||
.inspect(|cause| eprintln!("\tCaused By: {}", cause)) | ||
.any(|cause| !format!("{}", cause).contains("timed out")) | ||
}) | ||
.unwrap_or(false) | ||
} | ||
} | ||
|
||
::std::process::exit(101); | ||
#[cfg(not(feature = "linkcheck"))] | ||
{ | ||
false | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can this be There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It's not unreachable, or am I wrong?. The idea is that actually_broken is set to false when not using the linkcheck feature. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hmm... true. I did a bit of refactoring so we avoid calling it all. It's a bit annoying to try to avoid triggering |
||
} | ||
}; | ||
|
||
if actually_broken { | ||
std::process::exit(101); | ||
} else { | ||
std::process::exit(0); | ||
} | ||
} | ||
}, | ||
} | ||
(_, _) => unreachable!(), | ||
}; | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This changes it so that only the first error will be displayed. Can it be changed so that it still displays all errors?
Also, it looks like 0.4 was released, which uses a significantly different API. What is the plan to update that?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah, good catch. Done.
We haven't really updated yet on the rustc-guide repo. I need to take a look at the PR, but haven't had time. The main advantage would be the ability to take advantage of caching. I'm not sure that's a can of worms I want to open on this repo, though. It was hard enough to get what we have working...