diff options
author | Benjamin Sago <ogham@bsago.me> | 2020-10-16 23:53:32 +0100 |
---|---|---|
committer | Benjamin Sago <ogham@bsago.me> | 2020-10-16 23:53:42 +0100 |
commit | 86de17b788c676c08814441aac1becf2d2e40bdf (patch) | |
tree | e7968042ca503a1d8733d14b8e357f9e4642438b | |
parent | 91f1541e85f84663081f6a62bf858816beb345c2 (diff) |
Help text changes
This changes the --help text, and gets rid of the special behaviour for --help --long, which I thought was a really good idea at the time, but now I just think it's inconsistent and unexpected behaviour. --help should return the same help, no matter what other arguments you have typed.
Other things:
• Put --help and --version in a section
• Capitalisation consistency
• Alignment
• Move the --octal-permissions line up a bit
• Simplify the printing implementation (HelpString is now a unit struct)
This _finally_ makes all the extended tests pass.
-rw-r--r-- | src/main.rs | 4 | ||||
-rw-r--r-- | src/options/help.rs | 86 | ||||
-rw-r--r-- | src/options/version.rs | 2 | ||||
-rw-r--r-- | xtests/help | 42 | ||||
-rw-r--r-- | xtests/help_long | 23 | ||||
-rwxr-xr-x | xtests/run.sh | 1 |
6 files changed, 58 insertions, 100 deletions
diff --git a/src/main.rs b/src/main.rs index 3e0d1d0..3f94d4c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -81,11 +81,11 @@ fn main() { } OptionsResult::Help(help_text) => { - println!("{}", help_text); + print!("{}", help_text); } OptionsResult::Version(version_str) => { - println!("{}", version_str); + print!("{}", version_str); } OptionsResult::InvalidOptions(error) => { diff --git a/src/options/help.rs b/src/options/help.rs index 5c64116..d7b986a 100644 --- a/src/options/help.rs +++ b/src/options/help.rs @@ -5,7 +5,10 @@ use crate::options::flags; use crate::options::parser::MatchedFlags; -static OPTIONS: &str = r##" +static USAGE: &str = r##"Usage: + exa [options] [files...] + +META OPTIONS -?, --help show list of command-line options -v, --version show version of exa @@ -30,52 +33,40 @@ FILTERING AND SORTING OPTIONS --group-directories-first list directories before other files -D, --only-dirs list only directories -I, --ignore-glob GLOBS glob patterns (pipe-separated) of files to ignore - --git-ignore Ignore files mentioned in '.gitignore' + --git-ignore ignore files mentioned in '.gitignore' Valid sort fields: name, Name, extension, Extension, size, type, modified, accessed, created, inode, and none. date, time, old, and new all refer to modified. -"##; -static LONG_OPTIONS: &str = r##" LONG VIEW OPTIONS - -b, --binary list file sizes with binary prefixes - -B, --bytes list file sizes in bytes, without any prefixes - -g, --group list each file's group - -h, --header add a header row to each column - -H, --links list each file's number of hard links - -i, --inode list each file's inode number - -m, --modified use the modified timestamp field - -S, --blocks show number of file system blocks - -t, --time FIELD which timestamp field to list (modified, accessed, created) - -u, --accessed use the accessed timestamp field - -U, --created use the created timestamp field - --changed use the changed timestamp field - --time-style how to format timestamps (default, iso, long-iso, full-iso) - --no-permissions suppress the permissions field - --no-filesize suppress the filesize field - --no-user suppress the user field - --no-time suppress the time field"##; - -static GIT_HELP: &str = r##" --git list each file's Git status, if tracked or ignored"##; -static EXTENDED_HELP: &str = r##" -@, --extended list each file's extended attributes and sizes"##; -static OCTAL_HELP: &str = r##" --octal-permissions list each file's permission in octal format"##; + -b, --binary list file sizes with binary prefixes + -B, --bytes list file sizes in bytes, without any prefixes + -g, --group list each file's group + -h, --header add a header row to each column + -H, --links list each file's number of hard links + -i, --inode list each file's inode number + -m, --modified use the modified timestamp field + -S, --blocks show number of file system blocks + -t, --time FIELD which timestamp field to list (modified, accessed, created) + -u, --accessed use the accessed timestamp field + -U, --created use the created timestamp field + --changed use the changed timestamp field + --time-style how to format timestamps (default, iso, long-iso, full-iso) + --no-permissions suppress the permissions field + --octal-permissions list each file's permission in octal format + --no-filesize suppress the filesize field + --no-user suppress the user field + --no-time suppress the time field"##; + +static GIT_HELP: &str = r##" --git list each file's Git status, if tracked or ignored"##; +static EXTENDED_HELP: &str = r##" -@, --extended list each file's extended attributes and sizes"##; /// All the information needed to display the help text, which depends /// on which features are enabled and whether the user only wants to /// see one section’s help. #[derive(PartialEq, Debug, Copy, Clone)] -pub struct HelpString { - - /// Only show the help for the long section, not all the help. - only_long: bool, - - /// Whether the --git option should be included in the help. - git: bool, - - /// Whether the --extended option should be included in the help. - xattrs: bool, -} +pub struct HelpString; impl HelpString { @@ -88,10 +79,7 @@ impl HelpString { /// errors when the user wants help is kind of petty! pub fn deduce(matches: &MatchedFlags<'_>) -> Option<Self> { if matches.count(&flags::HELP) > 0 { - let only_long = matches.count(&flags::LONG) > 0; - let git = cfg!(feature="git"); - let xattrs = xattr::ENABLED; - Some(Self { only_long, git, xattrs }) + Some(Self) } else { None @@ -104,24 +92,16 @@ impl fmt::Display for HelpString { /// Format this help options into an actual string of help /// text to be displayed to the user. fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> { - writeln!(f, "Usage:\n exa [options] [files...]")?; + writeln!(f, "{}", USAGE)?; - if ! self.only_long { - write!(f, "{}", OPTIONS)?; + if cfg!(feature="git") { + writeln!(f, "{}", GIT_HELP)?; } - write!(f, "{}", LONG_OPTIONS)?; - - if self.git { - write!(f, "\n{}", GIT_HELP)?; - } - - if self.xattrs { - write!(f, "\n{}", EXTENDED_HELP)?; + if xattr::ENABLED { + writeln!(f, "{}", EXTENDED_HELP)?; } - write!(f, "\n{}", OCTAL_HELP)?; - Ok(()) } } diff --git a/src/options/version.rs b/src/options/version.rs index f38669e..6d2e05e 100644 --- a/src/options/version.rs +++ b/src/options/version.rs @@ -31,7 +31,7 @@ impl VersionString { impl fmt::Display for VersionString { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> { - write!(f, "{}", include!(concat!(env!("OUT_DIR"), "/version_string.txt"))) + writeln!(f, "{}", include!(concat!(env!("OUT_DIR"), "/version_string.txt"))) } } diff --git a/xtests/help b/xtests/help index 0d899d6..87a491c 100644 --- a/xtests/help +++ b/xtests/help @@ -1,6 +1,7 @@ Usage: exa [options] [files...] +META OPTIONS -?, --help show list of command-line options -v, --version show version of exa @@ -25,28 +26,29 @@ FILTERING AND SORTING OPTIONS --group-directories-first list directories before other files -D, --only-dirs list only directories -I, --ignore-glob GLOBS glob patterns (pipe-separated) of files to ignore - --git-ignore Ignore files mentioned in '.gitignore' + --git-ignore ignore files mentioned in '.gitignore' Valid sort fields: name, Name, extension, Extension, size, type, modified, accessed, created, inode, and none. date, time, old, and new all refer to modified. LONG VIEW OPTIONS - -b, --binary list file sizes with binary prefixes - -B, --bytes list file sizes in bytes, without any prefixes - -g, --group list each file's group - -h, --header add a header row to each column - -H, --links list each file's number of hard links - -i, --inode list each file's inode number - -m, --modified use the modified timestamp field - -S, --blocks show number of file system blocks - -t, --time FIELD which timestamp field to list (modified, accessed, created) - -u, --accessed use the accessed timestamp field - -U, --created use the created timestamp field - --changed use the changed timestamp field - --time-style how to format timestamps (default, iso, long-iso, full-iso) - --no-permissions suppress the permissions field - --no-filesize suppress the filesize field - --no-user suppress the user field - --no-time suppress the time field - --git list each file's Git status, if tracked or ignored - -@, --extended list each file's extended attributes and sizes + -b, --binary list file sizes with binary prefixes + -B, --bytes list file sizes in bytes, without any prefixes + -g, --group list each file's group + -h, --header add a header row to each column + -H, --links list each file's number of hard links + -i, --inode list each file's inode number + -m, --modified use the modified timestamp field + -S, --blocks show number of file system blocks + -t, --time FIELD which timestamp field to list (modified, accessed, created) + -u, --accessed use the accessed timestamp field + -U, --created use the created timestamp field + --changed use the changed timestamp field + --time-style how to format timestamps (default, iso, long-iso, full-iso) + --no-permissions suppress the permissions field + --octal-permissions list each file's permission in octal format + --no-filesize suppress the filesize field + --no-user suppress the user field + --no-time suppress the time field + --git list each file's Git status, if tracked or ignored + -@, --extended list each file's extended attributes and sizes diff --git a/xtests/help_long b/xtests/help_long deleted file mode 100644 index 0a4b63a..0000000 --- a/xtests/help_long +++ /dev/null @@ -1,23 +0,0 @@ -Usage: - exa [options] [files...] - -LONG VIEW OPTIONS - -b, --binary list file sizes with binary prefixes - -B, --bytes list file sizes in bytes, without any prefixes - -g, --group list each file's group - -h, --header add a header row to each column - -H, --links list each file's number of hard links - -i, --inode list each file's inode number - -m, --modified use the modified timestamp field - -S, --blocks show number of file system blocks - -t, --time FIELD which timestamp field to list (modified, accessed, created) - -u, --accessed use the accessed timestamp field - -U, --created use the created timestamp field - --changed use the changed timestamp field - --time-style how to format timestamps (default, iso, long-iso, full-iso) - --no-permissions suppress the permissions field - --no-filesize suppress the filesize field - --no-user suppress the user field - --no-time suppress the time field - --git list each file's Git status, if tracked or ignored - -@, --extended list each file's extended attributes and sizes diff --git a/xtests/run.sh b/xtests/run.sh index 516c770..103da5c 100755 --- a/xtests/run.sh +++ b/xtests/run.sh @@ -290,7 +290,6 @@ fi # And finally... $exa --help | diff -q - $results/help || exit 1 -$exa --help --long | diff -q - $results/help_long || exit 1 echo "All the tests passed!" |