Warm when git feature is disabled instead of ignoring flags

The flags --git and --git-ignore are caught early during options parsing, so no more checking for git feature is done elsewhere.

Since --git-ignore depends on git too since recently, remove it from help when git feature is disabled.

Extended attributes now don’t artificially depends on git feature being enabled.
This commit is contained in:
ariasuni 2020-12-03 02:06:29 +01:00
parent 39c8c67bf6
commit a740512014
7 changed files with 31 additions and 18 deletions

View File

@ -27,7 +27,7 @@ pub mod git {
}
pub fn get(&self, _index: &Path, _prefix_lookup: bool) -> f::Git {
panic!("Tried to query a Git cache, but Git support is disabled")
unreachable!();
}
}
}

View File

@ -7,9 +7,7 @@ use std::io;
use std::path::Path;
pub const ENABLED: bool =
cfg!(feature="git") &&
cfg!(any(target_os = "macos", target_os = "linux"));
pub const ENABLED: bool = cfg!(any(target_os = "macos", target_os = "linux"));
pub trait FileAttributes {

View File

@ -16,7 +16,7 @@ pub enum OptionsError {
/// The user supplied an illegal choice to an Argument.
BadArgument(&'static Arg, OsString),
/// The user supplied a set of options
/// The user supplied a set of options that are unsupported
Unsupported(String),
/// An option was given twice or more in strict mode.

View File

@ -5,7 +5,7 @@ use crate::options::flags;
use crate::options::parser::MatchedFlags;
static USAGE: &str = r##"Usage:
static USAGE_PART1: &str = "Usage:
exa [options] [files...]
META OPTIONS
@ -32,8 +32,9 @@ FILTERING AND SORTING OPTIONS
-s, --sort SORT_FIELD which field to sort by
--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'
-I, --ignore-glob GLOBS glob patterns (pipe-separated) of files to ignore";
static USAGE_PART2: &str = " \
Valid sort fields: name, Name, extension, Extension, size, type,
modified, accessed, created, inode, and none.
date, time, old, and new all refer to modified.
@ -56,10 +57,11 @@ LONG VIEW OPTIONS
--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"##;
--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 GIT_FILTER_HELP: &str = " --git-ignore ignore files mentioned in '.gitignore'";
static GIT_VIEW_HELP: &str = " --git list each file's Git status, if tracked or ignored";
static EXTENDED_HELP: &str = " -@, --extended list each file's extended attributes and sizes";
/// All the information needed to display the help text, which depends
@ -92,14 +94,20 @@ 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)?;
write!(f, "{}", USAGE_PART1)?;
if cfg!(feature="git") {
writeln!(f, "{}", GIT_HELP)?;
if cfg!(feature = "git") {
write!(f, "\n{}", GIT_FILTER_HELP)?;
}
write!(f, "\n{}", USAGE_PART2)?;
if cfg!(feature = "git") {
write!(f, "\n{}", GIT_VIEW_HELP)?;
}
if xattr::ENABLED {
writeln!(f, "{}", EXTENDED_HELP)?;
write!(f, "\n{}", EXTENDED_HELP)?;
}
Ok(())

View File

@ -176,6 +176,13 @@ impl Options {
/// Determines the complete set of options based on the given command-line
/// arguments, after theyve been parsed.
fn deduce<V: Vars>(matches: &MatchedFlags<'_>, vars: &V) -> Result<Self, OptionsError> {
if cfg!(not(feature = "git")) &&
matches.has_where_any(|f| f.matches(&flags::GIT) || f.matches(&flags::GIT_IGNORE)).is_some() {
return Err(OptionsError::Unsupported(format!(
"Options --git and --git-ignore can't be used because `git` feature was disabled in this build of exa"
)));
}
let view = View::deduce(matches, vars)?;
let dir_action = DirAction::deduce(matches, matches!(view.mode, Mode::Details(_)))?;
let filter = FileFilter::deduce(matches)?;

View File

@ -91,7 +91,7 @@ impl Mode {
}
}
if cfg!(feature = "git") && matches.has(&flags::GIT)? {
if matches.has(&flags::GIT)? {
return Err(OptionsError::Useless(&flags::GIT, false, &flags::LONG));
}
else if matches.has(&flags::LEVEL)? && ! matches.has(&flags::RECURSE)? && ! matches.has(&flags::TREE)? {
@ -192,7 +192,7 @@ impl TableOptions {
impl Columns {
fn deduce(matches: &MatchedFlags<'_>) -> Result<Self, OptionsError> {
let time_types = TimeTypes::deduce(matches)?;
let git = cfg!(feature = "git") && matches.has(&flags::GIT)?;
let git = matches.has(&flags::GIT)?;
let blocks = matches.has(&flags::BLOCKS)?;
let group = matches.has(&flags::GROUP)?;

View File

@ -99,7 +99,7 @@ impl Columns {
columns.push(Column::Timestamp(TimeType::Accessed));
}
if cfg!(feature = "git") && self.git && actually_enable_git {
if self.git && actually_enable_git {
columns.push(Column::GitStatus);
}