Просмотр исходного кода

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.
Benjamin Sago 5 лет назад
Родитель
Сommit
86de17b788
6 измененных файлов с 58 добавлено и 100 удалено
  1. 2 2
      src/main.rs
  2. 33 53
      src/options/help.rs
  3. 1 1
      src/options/version.rs
  4. 22 20
      xtests/help
  5. 0 23
      xtests/help_long
  6. 0 1
      xtests/run.sh

+ 2 - 2
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) => {

+ 33 - 53
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(())
     }
 }

+ 1 - 1
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")))
     }
 }
 

+ 22 - 20
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

+ 0 - 23
xtests/help_long

@@ -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

+ 0 - 1
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!"