diff --git a/src/bin/bat/app.rs b/src/bin/bat/app.rs index e4ec938d..803a4c0d 100644 --- a/src/bin/bat/app.rs +++ b/src/bin/bat/app.rs @@ -54,7 +54,18 @@ impl App { { // Skip the arguments in bats config file - wild::args_os().collect::>() + let mut cli_args = wild::args_os(); + + // Load selected env vars + let mut args = get_args_from_env_vars(); + + // Put the zero-th CLI argument (program name) first + args.insert(0, cli_args.next().unwrap()); + + // .. and the rest at the end + cli_args.for_each(|a| args.push(a)); + + args } else { let mut cli_args = wild::args_os(); @@ -68,11 +79,11 @@ impl App { // env vars supersede config vars get_args_from_env_vars() - .iter() - .for_each(|a| args.push(a.into())); + .into_iter() + .for_each(|a| args.push(a)); // .. and the rest at the end - cli_args.for_each(|a| args.push(a.into())); + cli_args.for_each(|a| args.push(a)); args }; diff --git a/src/bin/bat/config.rs b/src/bin/bat/config.rs index d5577658..4abae4a6 100644 --- a/src/bin/bat/config.rs +++ b/src/bin/bat/config.rs @@ -145,8 +145,9 @@ pub fn get_args_from_env_vars() -> Vec { ("--style", "BAT_STYLE"), ] .iter() - .filter_map(|(flag, key)| env::var(key).ok().map(|var| [flag.into(), var.into()])) + .filter_map(|(flag, key)| env::var(key).ok().map(|var| [flag.to_string(), var])) .flatten() + .map(|a| a.into()) .collect() } diff --git a/tests/examples/bat-tabs.conf b/tests/examples/bat-tabs.conf new file mode 100644 index 00000000..c172f95f --- /dev/null +++ b/tests/examples/bat-tabs.conf @@ -0,0 +1 @@ +--tabs=8 diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs index 91e2a934..4df84746 100644 --- a/tests/integration_tests.rs +++ b/tests/integration_tests.rs @@ -477,6 +477,79 @@ fn tabs_8() { ); } +#[test] +fn tabs_4_env_overrides_config() { + bat_with_config() + .env("BAT_CONFIG_PATH", "bat-tabs.conf") + .env("BAT_TABS", "4") + .arg("tabs.txt") + .arg("--style=plain") + .arg("--decorations=always") + .assert() + .success() + .stdout( + " 1 2 3 4 +1 ? +22 ? +333 ? +4444 ? +55555 ? +666666 ? +7777777 ? +88888888 ? +", + ); +} + +#[test] +fn tabs_4_arg_overrides_env() { + bat_with_config() + .env("BAT_CONFIG_PATH", "bat-tabs.conf") + .env("BAT_TABS", "6") + .arg("tabs.txt") + .arg("--tabs=4") + .arg("--style=plain") + .arg("--decorations=always") + .assert() + .success() + .stdout( + " 1 2 3 4 +1 ? +22 ? +333 ? +4444 ? +55555 ? +666666 ? +7777777 ? +88888888 ? +", + ); +} + +#[test] +fn tabs_4_arg_overrides_env_noconfig() { + bat() + .env("BAT_TABS", "6") + .arg("tabs.txt") + .arg("--tabs=4") + .arg("--style=plain") + .arg("--decorations=always") + .assert() + .success() + .stdout( + " 1 2 3 4 +1 ? +22 ? +333 ? +4444 ? +55555 ? +666666 ? +7777777 ? +88888888 ? +", + ); +} + #[test] fn fail_non_existing() { bat().arg("non-existing-file").assert().failure(); @@ -544,7 +617,7 @@ fn pager_disable() { } #[test] -fn pager_arg_override_env() { +fn pager_arg_override_env_withconfig() { bat_with_config() .env("BAT_CONFIG_PATH", "bat.conf") .env("PAGER", "echo another-pager") @@ -557,6 +630,19 @@ fn pager_arg_override_env() { .stdout(predicate::eq("pager-output\n").normalize()); } +#[test] +fn pager_arg_override_env_noconfig() { + bat() + .env("PAGER", "echo another-pager") + .env("BAT_PAGER", "echo other-pager") + .arg("--pager=echo pager-output") + .arg("--paging=always") + .arg("test.txt") + .assert() + .success() + .stdout(predicate::eq("pager-output\n").normalize()); +} + #[test] fn pager_env_bat_pager_override_config() { bat_with_config() @@ -1031,6 +1117,35 @@ fn header_full_basic() { .stderr(""); } +#[test] +fn header_env_basic() { + bat_with_config() + .env("BAT_STYLE", "header-filename,header-filesize") + .arg("test.txt") + .arg("--decorations=always") + .arg("-r=0:0") + .arg("--file-name=foo") + .assert() + .success() + .stdout("File: foo\nSize: 12 B\n") + .stderr(""); +} + +#[test] +fn header_arg_overrides_env() { + bat_with_config() + .env("BAT_STYLE", "header-filesize") + .arg("test.txt") + .arg("--decorations=always") + .arg("--style=header-filename") + .arg("-r=0:0") + .arg("--file-name=foo") + .assert() + .success() + .stdout("File: foo\n") + .stderr(""); +} + #[test] fn header_binary() { bat()