diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e8fad14..278bfc74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ ## Bugfixes - Report error when pager is missing instead of silently falling back, see #3588 (@IMaloney) +- Fix `--wrap=never` and `-S` flags being ignored when piping to pager, see #3592 (@IMaloney) - Fix crash with BusyBox `less` on Windows, see #3527 (@Anchal-T) - Fix `bat cache --help` failing with 'unexpected argument' error, see #3580 and #3560 (@NORMAL-EX) - `--help` now correctly honors `--pager=builtin`. See #3516 (@keith-hall) diff --git a/src/bin/bat/app.rs b/src/bin/bat/app.rs index 521674f2..54578087 100644 --- a/src/bin/bat/app.rs +++ b/src/bin/bat/app.rs @@ -399,27 +399,29 @@ impl App { Some("no-printing") => BinaryBehavior::NoPrinting, _ => unreachable!("other values for --binary are not allowed"), }, - wrapping_mode: if self.interactive_output || maybe_term_width.is_some() { - if !self.matches.get_flag("chop-long-lines") { + wrapping_mode: { + if self.matches.get_flag("chop-long-lines") { + WrappingMode::NoWrapping(true) + } else { match self.matches.get_one::("wrap").map(|s| s.as_str()) { Some("character") => WrappingMode::Character, Some("never") => WrappingMode::NoWrapping(true), Some("auto") | None => { - if style_components.plain() && maybe_term_width.is_none() { - WrappingMode::NoWrapping(false) + if self.interactive_output || maybe_term_width.is_some() { + if style_components.plain() && maybe_term_width.is_none() { + WrappingMode::NoWrapping(false) + } else { + WrappingMode::Character + } } else { - WrappingMode::Character + // We don't have the tty width when piping to another program. + // There's no point in wrapping when this is the case. + WrappingMode::NoWrapping(false) } } _ => unreachable!("other values for --wrap are not allowed"), } - } else { - WrappingMode::NoWrapping(true) } - } else { - // We don't have the tty width when piping to another program. - // There's no point in wrapping when this is the case. - WrappingMode::NoWrapping(false) }, colored_output: self.matches.get_flag("force-colorization") || match self.matches.get_one::("color").map(|s| s.as_str()) { diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs index b2377a80..4972aa46 100644 --- a/tests/integration_tests.rs +++ b/tests/integration_tests.rs @@ -2900,6 +2900,44 @@ fn no_wrapping_with_chop_long_lines() { wrapping_test("--chop-long-lines", false); } +#[test] +#[serial] +fn wrap_never_flag_respected_with_paging_always() { + mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| { + bat() + .arg("--pager=cat") + .arg("--paging=always") + .arg("--wrap=never") + .arg("--color=never") + .arg("--decorations=never") + .arg("--style=plain") + .write_stdin("abcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyz\n") + .assert() + .success() + .stdout(predicate::str::contains("abcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyz").normalize()) + .stderr(""); + }); +} + +#[test] +#[serial] +fn s_flag_respected_with_paging_always() { + mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| { + bat() + .arg("--pager=cat") + .arg("--paging=always") + .arg("-S") + .arg("--color=never") + .arg("--decorations=never") + .arg("--style=plain") + .write_stdin("abcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyz\n") + .assert() + .success() + .stdout(predicate::str::contains("abcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyz").normalize()) + .stderr(""); + }); +} + #[test] fn theme_arg_overrides_env() { bat()