diff --git a/CHANGELOG.md b/CHANGELOG.md index 80d9c492..ca7ab4d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ - Fix hang when using `--list-themes` with an explicit pager, see #3457 (@abhinavcool42) - Fix negative values of N not being parsed in line ranges without `=` flag value separator, see #3442 (@lmmx) - Fix broken Docker syntax preventing use of custom assets, see #3476 (@keith-hall) -- Fix decorations being applied unexpectedly when piping, breaking cat compatibility. See #3496 (@keith-hall) +- Fix decorations being applied unexpectedly when piping. Now only line numbers explicitly required on the command line should be applied in auto decorations mode for `cat` compatibility. See #3496 (@keith-hall) ## Other - Improve README documentation on pager options passed to less, see #3443 (@injust) diff --git a/src/bin/bat/app.rs b/src/bin/bat/app.rs index 8f9cc871..e1051850 100644 --- a/src/bin/bat/app.rs +++ b/src/bin/bat/app.rs @@ -46,6 +46,10 @@ enum HelpType { pub struct App { pub matches: ArgMatches, interactive_output: bool, + /// True if -n / --number was passed on the command line + /// (not from config file or environment variables). + /// This is used to honor the flag when piping output, similar to `cat -n`. + number_from_cli: bool, } impl App { @@ -54,6 +58,15 @@ impl App { let _ = nu_ansi_term::enable_ansi_support(); let interactive_output = std::io::stdout().is_terminal(); + + // Check if the -n / --number option was passed on the command line + // (before merging with config file and environment variables). + // This is needed to honor the -n flag when piping output, similar to `cat -n`. + let number_from_cli = wild::args_os().any(|arg| { + let arg_str = arg.to_string_lossy(); + arg_str == "-n" || arg_str == "--number" + }); + let matches = Self::matches(interactive_output)?; if matches.get_flag("help") { @@ -91,6 +104,7 @@ impl App { Ok(App { matches, interactive_output, + number_from_cli, }) } @@ -384,7 +398,7 @@ impl App { .map(|s| s.as_str()) == Some("always") || self.matches.get_flag("force-colorization") - || self.matches.get_flag("number")), + || self.number_from_cli), tab_width: self .matches .get_one::("tabs") diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs index d5ce3d03..6b62541c 100644 --- a/tests/integration_tests.rs +++ b/tests/integration_tests.rs @@ -166,6 +166,17 @@ fn line_numbers() { .stdout(" 1 line 1\n 2 line 2\n 3 line 3\n 4 line 4\n 5 line 5\n 6 line 6\n 7 line 7\n 8 line 8\n 9 line 9\n 10 line 10\n"); } +// Test that -n on command line shows line numbers even when piping (similar to `cat -n`) +#[test] +fn line_numbers_from_cli_in_loop_through_mode() { + bat() + .arg("multiline.txt") + .arg("-n") + .assert() + .success() + .stdout(" 1 line 1\n 2 line 2\n 3 line 3\n 4 line 4\n 5 line 5\n 6 line 6\n 7 line 7\n 8 line 8\n 9 line 9\n 10 line 10\n"); +} + #[test] fn line_range_2_3() { bat() @@ -419,8 +430,8 @@ fn piped_output_with_line_numbers_style_flag() { } #[test] -#[cfg(not(target_os = "windows"))] fn piped_output_with_line_numbers_with_header_grid_style_flag() { + // style ignored because non-interactive bat() .arg("--style=header,grid,numbers") .write_stdin("hello\nworld\n")