Skip to content
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

switch to non-recursive mode by default #3938

Merged
merged 4 commits into from
Dec 9, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Configurations.md
Original file line number Diff line number Diff line change
Expand Up @@ -2445,3 +2445,6 @@ Internal option
## `print_misformatted_file_names`

Internal option, use `-l` or `--files-with-diff`

## `recursive`
Internal option, use `-r` or `--recursive`
21 changes: 20 additions & 1 deletion src/bin/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,12 @@ fn make_opts() -> Options {
"Don't reformat child modules (unstable).",
);
}

opts.optflag(
"r",
"recursive",
"Format all encountered modules recursively regardless of whether the modules\
are defined inline or in another file",
);
opts.optflag("v", "verbose", "Print verbose output");
opts.optflag("q", "quiet", "Print less output");
opts.optflag("V", "version", "Show version information");
Expand Down Expand Up @@ -500,6 +505,7 @@ const STABLE_EMIT_MODES: [EmitMode; 3] = [EmitMode::Files, EmitMode::Stdout, Emi
#[derive(Clone, Debug, Default)]
struct GetOptsOptions {
skip_children: Option<bool>,
recursive: Option<bool>,
quiet: bool,
verbose: bool,
config_path: Option<PathBuf>,
Expand Down Expand Up @@ -568,6 +574,16 @@ impl GetOptsOptions {
}
}

if matches.opt_present("recursive") {
if let Some(true) = options.skip_children {
return Err(format_err!(
"Conflicting options `skip_children` and `recursive` were specified. \
`skip_children` has been deprecated and should no longer be used. ",
));
}
options.recursive = Some(true);
}

options.config_path = matches.opt_str("config-path").map(PathBuf::from);

options.inline_config = matches
Expand Down Expand Up @@ -658,6 +674,9 @@ impl CliOptions for GetOptsOptions {
if let Some(skip_children) = self.skip_children {
config.set().skip_children(skip_children);
}
if let Some(recursive) = self.recursive {
config.set().recursive(recursive);
}
if let Some(error_on_unformatted) = self.error_on_unformatted {
config.set().error_on_unformatted(error_on_unformatted);
}
Expand Down
249 changes: 181 additions & 68 deletions src/cargo-fmt/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -111,21 +111,11 @@ fn execute() -> i32 {
}

let strategy = CargoFmtStrategy::from_opts(&opts);
let mut rustfmt_args = opts.rustfmt_options;
if opts.check {
let check_flag = String::from("--check");
if !rustfmt_args.contains(&check_flag) {
rustfmt_args.push(check_flag);
}
}
if let Some(message_format) = opts.message_format {
if let Err(msg) = convert_message_format_to_rustfmt_args(&message_format, &mut rustfmt_args)
{
print_usage_to_stderr(&msg);
return FAILURE;
}
let mut rustfmt_args = opts.rustfmt_options.to_owned();
if let Err(ref msg) = build_rustfmt_args(&opts, &mut rustfmt_args) {
print_usage_to_stderr(msg);
return FAILURE;
}

let include_nested_test_files = opts.include_nested_test_files;

if let Some(specified_manifest_path) = opts.manifest_path {
Expand All @@ -152,13 +142,12 @@ fn execute() -> i32 {
}
}

fn convert_message_format_to_rustfmt_args(
message_format: &str,
rustfmt_args: &mut Vec<String>,
) -> Result<(), String> {
let mut contains_emit_mode = false;
fn build_rustfmt_args(opts: &Opts, rustfmt_args: &mut Vec<String>) -> Result<(), String> {
let mut contains_check = false;
let mut contains_emit_mode = false;
let mut contains_list_files = false;
let mut contains_recursive = false;

for arg in rustfmt_args.iter() {
if arg.starts_with("--emit") {
contains_emit_mode = true;
Expand All @@ -169,37 +158,53 @@ fn convert_message_format_to_rustfmt_args(
if arg == "-l" || arg == "--files-with-diff" {
contains_list_files = true;
}
if arg == "-r" || arg == "--recursive" {
contains_recursive = true;
}
}

if opts.check && !contains_check {
rustfmt_args.push(String::from("--check"));
}
match message_format {
"short" => {
if !contains_list_files {
rustfmt_args.push(String::from("-l"));

if !contains_recursive {
rustfmt_args.push(String::from("--recursive"));
}

if let Some(ref format) = opts.message_format {
return match format.as_ref() {
"short" => {
if !contains_list_files {
rustfmt_args.push(String::from("-l"));
}
Ok(())
}
Ok(())
}
"json" => {
if contains_emit_mode {
return Err(String::from(
"cannot include --emit arg when --message-format is set to json",
));
"json" => {
if contains_emit_mode {
return Err(String::from(
"cannot include --emit arg when --message-format is set to json",
));
}
if contains_check {
return Err(String::from(
"cannot include --check arg when --message-format is set to json",
));
}
rustfmt_args.push(String::from("--emit"));
rustfmt_args.push(String::from("json"));
Ok(())
}
if contains_check {
return Err(String::from(
"cannot include --check arg when --message-format is set to json",
"human" => Ok(()),
_ => {
return Err(format!(
"invalid --message-format value: {}. Allowed values are: short|json|human",
format
));
}
rustfmt_args.push(String::from("--emit"));
rustfmt_args.push(String::from("json"));
Ok(())
}
"human" => Ok(()),
_ => {
return Err(format!(
"invalid --message-format value: {}. Allowed values are: short|json|human",
message_format
));
}
};
}

Ok(())
}

fn print_usage_to_stderr(reason: &str) {
Expand Down Expand Up @@ -801,13 +806,14 @@ mod cargo_fmt_tests {
);
}

mod convert_message_format_to_rustfmt_args_tests {
mod build_rustfmt_args_tests {
use super::*;

#[test]
fn invalid_message_format() {
let cargo_fmt_opts = Opts::from_iter(&["test", "--message-format", "awesome"]);
assert_eq!(
convert_message_format_to_rustfmt_args("awesome", &mut vec![]),
build_rustfmt_args(&cargo_fmt_opts, &mut vec![]),
Err(String::from(
"invalid --message-format value: awesome. Allowed values are: short|json|human"
)),
Expand All @@ -816,9 +822,10 @@ mod cargo_fmt_tests {

#[test]
fn json_message_format_and_check_arg() {
let mut args = vec![String::from("--check")];
let mut rustfmt_args = vec![String::from("--check")];
let cargo_fmt_opts = Opts::from_iter(&["test", "--message-format", "json"]);
assert_eq!(
convert_message_format_to_rustfmt_args("json", &mut args),
build_rustfmt_args(&cargo_fmt_opts, &mut rustfmt_args),
Err(String::from(
"cannot include --check arg when --message-format is set to json"
)),
Expand All @@ -827,9 +834,10 @@ mod cargo_fmt_tests {

#[test]
fn json_message_format_and_emit_arg() {
let mut args = vec![String::from("--emit"), String::from("checkstyle")];
let cargo_fmt_opts = Opts::from_iter(&["test", "--message-format", "json"]);
let mut rustfmt_args = vec![String::from("--emit"), String::from("checkstyle")];
assert_eq!(
convert_message_format_to_rustfmt_args("json", &mut args),
build_rustfmt_args(&cargo_fmt_opts, &mut rustfmt_args),
Err(String::from(
"cannot include --emit arg when --message-format is set to json"
)),
Expand All @@ -838,50 +846,155 @@ mod cargo_fmt_tests {

#[test]
fn json_message_format() {
let mut args = vec![String::from("--edition"), String::from("2018")];
assert!(convert_message_format_to_rustfmt_args("json", &mut args).is_ok());
let mut rustfmt_args = vec![
String::from("--edition"),
String::from("2018"),
String::from("--recursive"),
];
let cargo_fmt_opts = Opts::from_iter(&["test", "--message-format", "json"]);
assert!(build_rustfmt_args(&cargo_fmt_opts, &mut rustfmt_args).is_ok());
assert_eq!(
args,
rustfmt_args,
vec![
String::from("--edition"),
String::from("2018"),
String::from("--recursive"),
String::from("--emit"),
String::from("json")
String::from("json"),
]
);
}

#[test]
fn human_message_format() {
let exp_args = vec![String::from("--emit"), String::from("json")];
let mut act_args = exp_args.clone();
assert!(convert_message_format_to_rustfmt_args("human", &mut act_args).is_ok());
assert_eq!(act_args, exp_args);
let exp_args = vec![
String::from("--emit"),
String::from("json"),
String::from("--recursive"),
];
let cargo_fmt_opts = Opts::from_iter(&["test", "--message-format", "human"]);
let mut rustfmt_args = exp_args.clone();
assert!(build_rustfmt_args(&cargo_fmt_opts, &mut rustfmt_args).is_ok());
assert_eq!(rustfmt_args, exp_args);
}

#[test]
fn short_message_format() {
let mut args = vec![String::from("--check")];
assert!(convert_message_format_to_rustfmt_args("short", &mut args).is_ok());
assert_eq!(args, vec![String::from("--check"), String::from("-l")]);
let mut rustfmt_args = vec![String::from("--check"), String::from("--recursive")];
let cargo_fmt_opts = Opts::from_iter(&["test", "--message-format", "short"]);
assert!(build_rustfmt_args(&cargo_fmt_opts, &mut rustfmt_args).is_ok());
assert_eq!(
rustfmt_args,
vec![
String::from("--check"),
String::from("--recursive"),
String::from("-l"),
],
);
}

#[test]
fn short_message_format_included_short_list_files_flag() {
let mut args = vec![String::from("--check"), String::from("-l")];
assert!(convert_message_format_to_rustfmt_args("short", &mut args).is_ok());
assert_eq!(args, vec![String::from("--check"), String::from("-l")]);
let mut rustfmt_args = vec![
String::from("--check"),
String::from("-l"),
String::from("--recursive"),
];
let cargo_fmt_opts = Opts::from_iter(&["test", "--message-format", "short"]);
assert!(build_rustfmt_args(&cargo_fmt_opts, &mut rustfmt_args).is_ok());
assert_eq!(
rustfmt_args,
vec![
String::from("--check"),
String::from("-l"),
String::from("--recursive"),
],
);
}

#[test]
fn short_message_format_included_long_list_files_flag() {
let mut args = vec![String::from("--check"), String::from("--files-with-diff")];
assert!(convert_message_format_to_rustfmt_args("short", &mut args).is_ok());
let mut rustfmt_args = vec![
String::from("--check"),
String::from("--files-with-diff"),
String::from("--recursive"),
];
let cargo_fmt_opts = Opts::from_iter(&["test", "--message-format", "short"]);
assert!(build_rustfmt_args(&cargo_fmt_opts, &mut rustfmt_args).is_ok());
assert_eq!(
rustfmt_args,
vec![
String::from("--check"),
String::from("--files-with-diff"),
String::from("--recursive"),
]
);
}

#[test]
fn recursive_shorthand_not_duplicated() {
let mut rustfmt_args = vec![String::from("-r")];
let empty: Vec<String> = vec![];
assert!(build_rustfmt_args(&Opts::from_iter(&empty), &mut rustfmt_args).is_ok());
assert_eq!(rustfmt_args, vec![String::from("-r")]);
}

#[test]
fn recursive_long_not_duplicated() {
let mut rustfmt_args = vec![String::from("--recursive")];
let empty: Vec<String> = vec![];
assert!(build_rustfmt_args(&Opts::from_iter(&empty), &mut rustfmt_args).is_ok());
assert_eq!(rustfmt_args, vec![String::from("--recursive")]);
}

#[test]
fn recursive_added() {
let mut rustfmt_args = vec![];
let empty: Vec<String> = vec![];
assert!(build_rustfmt_args(&Opts::from_iter(&empty), &mut rustfmt_args).is_ok());
assert_eq!(rustfmt_args, vec![String::from("--recursive")]);
}

#[test]
fn check_not_duplicated_when_included_in_cargo_fmt() {
let mut rustfmt_args = vec![String::from("--check"), String::from("--recursive")];
let cargo_fmt_opts = Opts::from_iter(&["test", "--check"]);
assert!(build_rustfmt_args(&cargo_fmt_opts, &mut rustfmt_args).is_ok());
assert_eq!(
rustfmt_args,
vec![String::from("--check"), String::from("--recursive")],
);
}

#[test]
fn check_still_passed_through_when_not_included_in_cargo_fmt() {
let mut rustfmt_args = vec![String::from("--check"), String::from("--recursive")];
let empty: Vec<String> = vec![];
assert!(build_rustfmt_args(&Opts::from_iter(&empty), &mut rustfmt_args).is_ok());
assert_eq!(
args,
vec![String::from("--check"), String::from("--files-with-diff")]
rustfmt_args,
vec![String::from("--check"), String::from("--recursive")],
);
}

#[test]
fn check_added() {
let mut rustfmt_args = vec![String::from("--recursive")];
let cargo_fmt_opts = Opts::from_iter(&["test", "--check"]);
assert!(build_rustfmt_args(&cargo_fmt_opts, &mut rustfmt_args).is_ok());
assert_eq!(
rustfmt_args,
vec![String::from("--recursive"), String::from("--check")],
);
}

#[test]
fn check_not_added_when_flag_disabled() {
let mut rustfmt_args = vec![String::from("--recursive")];
let empty: Vec<String> = vec![];
assert!(build_rustfmt_args(&Opts::from_iter(&empty), &mut rustfmt_args).is_ok());
assert_eq!(rustfmt_args, vec![String::from("--recursive")]);
}
}

mod get_nested_integration_test_files_tests {
Expand Down
Loading