From e1ac01a091a734d7d25352ec9892b6ad3e6224a8 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Tue, 22 Aug 2023 16:02:33 -0500 Subject: [PATCH] fix(help): Ensure padding isn't stripped Fixes #5083 --- clap_builder/src/builder/styled_str.rs | 13 +++++++++++++ clap_builder/src/output/help.rs | 6 ++++-- tests/builder/help.rs | 2 +- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/clap_builder/src/builder/styled_str.rs b/clap_builder/src/builder/styled_str.rs index d856a3015162..ddf5a75d8e57 100644 --- a/clap_builder/src/builder/styled_str.rs +++ b/clap_builder/src/builder/styled_str.rs @@ -47,6 +47,19 @@ impl StyledStr { self.0 = self.0.trim().to_owned() } + pub(crate) fn trim_start_lines(&mut self) { + if let Some(pos) = self.0.find('\n') { + let (leading, help) = self.0.split_at(pos + 1); + if leading.trim().is_empty() { + self.0 = help.to_owned() + } + } + } + + pub(crate) fn trim_end(&mut self) { + self.0 = self.0.trim_end().to_owned() + } + #[cfg(feature = "help")] pub(crate) fn replace_newline_var(&mut self) { self.0 = self.0.replace("{n}", "\n"); diff --git a/clap_builder/src/output/help.rs b/clap_builder/src/output/help.rs index 410616eb1b80..a5073a9e4b63 100644 --- a/clap_builder/src/output/help.rs +++ b/clap_builder/src/output/help.rs @@ -30,8 +30,10 @@ pub(crate) fn write_help(writer: &mut StyledStr, cmd: &Command, usage: &Usage<'_ } } - // Remove any extra lines caused by book keeping - writer.trim(); + // Remove any lines from unused sections + writer.trim_start_lines(); + // Remove any whitespace caused by book keeping + writer.trim_end(); // Ensure there is still a trailing newline writer.push_str("\n"); } diff --git a/tests/builder/help.rs b/tests/builder/help.rs index 23c05b96cb55..0d6509bdc9b5 100644 --- a/tests/builder/help.rs +++ b/tests/builder/help.rs @@ -1342,7 +1342,7 @@ fn dont_strip_padding_issue_5083() { Command::new("two"), Command::new("three"), ]); - static EXPECTED: &str = "one + static EXPECTED: &str = " one two three help Print this message or the help of the given subcommand(s)