forked from rust-lang/rust-clippy
-
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
Changes: ```` Lint Fix float_cmp false positive when comparing signum grep only lines, that start with 'changelog: ' Get PR number from bors commit message Authenticate with github_api_token Check PRs for changelog entry in the body Deny warnings in CI Disable dogfood on windows for faster build time on travis Revert "Remove `CARGO_INCREMENTAL=0` from windows build" Remove `CARGO_INCREMENTAL=0` from windows build Test with different sysroots dependent on the OS Build sys_root in driver with PathBuf instead of String Don't re-set the LD_LIBRARY_PATH in base_tests.sh Add master toolchain binaries to the PATH Change conditional Stop allowing failures in Travis windows build Fix bug in `implicit_hasher` causing crashes Avoid rustfmt bug on Windows Add rustfmt nightly to appveyor install Work around rustup fallback error on Windows Update documentation to the dev fmt command Remove format checks from CI scripts again. Remove format checks from CI script Improve fmt test failure message Fix crash on `dev --limit-stderr-length` Add dev fmt subcommand don't strip blank lines in lint documentation ````
- Loading branch information
1 parent
4272fb2
commit ea2cfe0
Showing
21 changed files
with
377 additions
and
97 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -9,4 +9,5 @@ clap = "2.33" | |
itertools = "0.8" | ||
regex = "1" | ||
lazy_static = "1.0" | ||
shell-escape = "0.1" | ||
walkdir = "2" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,171 @@ | ||
use shell_escape::escape; | ||
use std::ffi::OsStr; | ||
use std::io; | ||
use std::path::{Path, PathBuf}; | ||
use std::process::{self, Command}; | ||
use walkdir::WalkDir; | ||
|
||
#[derive(Debug)] | ||
pub enum CliError { | ||
CommandFailed(String), | ||
IoError(io::Error), | ||
ProjectRootNotFound, | ||
WalkDirError(walkdir::Error), | ||
} | ||
|
||
impl From<io::Error> for CliError { | ||
fn from(error: io::Error) -> Self { | ||
CliError::IoError(error) | ||
} | ||
} | ||
|
||
impl From<walkdir::Error> for CliError { | ||
fn from(error: walkdir::Error) -> Self { | ||
CliError::WalkDirError(error) | ||
} | ||
} | ||
|
||
struct FmtContext { | ||
check: bool, | ||
verbose: bool, | ||
} | ||
|
||
pub fn run(check: bool, verbose: bool) { | ||
fn try_run(context: &FmtContext) -> Result<bool, CliError> { | ||
let mut success = true; | ||
|
||
let project_root = project_root()?; | ||
|
||
success &= cargo_fmt(context, project_root.as_path())?; | ||
success &= cargo_fmt(context, &project_root.join("clippy_dev"))?; | ||
success &= cargo_fmt(context, &project_root.join("rustc_tools_util"))?; | ||
|
||
for entry in WalkDir::new(project_root.join("tests")) { | ||
let entry = entry?; | ||
let path = entry.path(); | ||
|
||
if path.extension() != Some("rs".as_ref()) | ||
|| entry.file_name() == "ice-3891.rs" | ||
// Avoid rustfmt bug rust-lang/rustfmt#1873 | ||
|| cfg!(windows) && entry.file_name() == "implicit_hasher.rs" | ||
{ | ||
continue; | ||
} | ||
|
||
success &= rustfmt(context, &path)?; | ||
} | ||
|
||
Ok(success) | ||
} | ||
|
||
fn output_err(err: CliError) { | ||
match err { | ||
CliError::CommandFailed(command) => { | ||
eprintln!("error: A command failed! `{}`", command); | ||
}, | ||
CliError::IoError(err) => { | ||
eprintln!("error: {}", err); | ||
}, | ||
CliError::ProjectRootNotFound => { | ||
eprintln!("error: Can't determine root of project. Please run inside a Clippy working dir."); | ||
}, | ||
CliError::WalkDirError(err) => { | ||
eprintln!("error: {}", err); | ||
}, | ||
} | ||
} | ||
|
||
let context = FmtContext { check, verbose }; | ||
let result = try_run(&context); | ||
let code = match result { | ||
Ok(true) => 0, | ||
Ok(false) => { | ||
eprintln!(); | ||
eprintln!("Formatting check failed."); | ||
eprintln!("Run `./util/dev fmt` to update formatting."); | ||
1 | ||
}, | ||
Err(err) => { | ||
output_err(err); | ||
1 | ||
}, | ||
}; | ||
process::exit(code); | ||
} | ||
|
||
fn format_command(program: impl AsRef<OsStr>, dir: impl AsRef<Path>, args: &[impl AsRef<OsStr>]) -> String { | ||
let arg_display: Vec<_> = args | ||
.iter() | ||
.map(|a| escape(a.as_ref().to_string_lossy()).to_owned()) | ||
.collect(); | ||
|
||
format!( | ||
"cd {} && {} {}", | ||
escape(dir.as_ref().to_string_lossy()), | ||
escape(program.as_ref().to_string_lossy()), | ||
arg_display.join(" ") | ||
) | ||
} | ||
|
||
fn exec( | ||
context: &FmtContext, | ||
program: impl AsRef<OsStr>, | ||
dir: impl AsRef<Path>, | ||
args: &[impl AsRef<OsStr>], | ||
) -> Result<bool, CliError> { | ||
if context.verbose { | ||
println!("{}", format_command(&program, &dir, args)); | ||
} | ||
|
||
let mut child = Command::new(&program).current_dir(&dir).args(args.iter()).spawn()?; | ||
let code = child.wait()?; | ||
let success = code.success(); | ||
|
||
if !context.check && !success { | ||
return Err(CliError::CommandFailed(format_command(&program, &dir, args))); | ||
} | ||
|
||
Ok(success) | ||
} | ||
|
||
fn cargo_fmt(context: &FmtContext, path: &Path) -> Result<bool, CliError> { | ||
let mut args = vec!["+nightly", "fmt", "--all"]; | ||
if context.check { | ||
args.push("--"); | ||
args.push("--check"); | ||
} | ||
let success = exec(context, "cargo", path, &args)?; | ||
|
||
Ok(success) | ||
} | ||
|
||
fn rustfmt(context: &FmtContext, path: &Path) -> Result<bool, CliError> { | ||
let mut args = vec!["+nightly".as_ref(), path.as_os_str()]; | ||
if context.check { | ||
args.push("--check".as_ref()); | ||
} | ||
let success = exec(context, "rustfmt", std::env::current_dir()?, &args)?; | ||
if !success { | ||
eprintln!("rustfmt failed on {}", path.display()); | ||
} | ||
Ok(success) | ||
} | ||
|
||
fn project_root() -> Result<PathBuf, CliError> { | ||
let current_dir = std::env::current_dir()?; | ||
for path in current_dir.ancestors() { | ||
let result = std::fs::read_to_string(path.join("Cargo.toml")); | ||
if let Err(err) = &result { | ||
if err.kind() == io::ErrorKind::NotFound { | ||
continue; | ||
} | ||
} | ||
|
||
let content = result?; | ||
if content.contains("[package]\nname = \"clippy\"") { | ||
return Ok(path.to_path_buf()); | ||
} | ||
} | ||
|
||
Err(CliError::ProjectRootNotFound) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.