ls: return exit code 2 for -l --dired --zero

This commit is contained in:
Daniel Hofstetter 2023-10-24 14:48:24 +02:00
parent d7b7dfeb16
commit fd18d2686f
2 changed files with 26 additions and 6 deletions

View file

@ -168,7 +168,8 @@ enum LsError {
IOError(std::io::Error), IOError(std::io::Error),
IOErrorContext(std::io::Error, PathBuf, bool), IOErrorContext(std::io::Error, PathBuf, bool),
BlockSizeParseError(String), BlockSizeParseError(String),
ConflictingArgumentDired(), ConflictingArgumentDired,
DiredAndZeroAreIncompatible,
AlreadyListedError(PathBuf), AlreadyListedError(PathBuf),
TimeStyleParseError(String, Vec<String>), TimeStyleParseError(String, Vec<String>),
} }
@ -181,7 +182,8 @@ impl UError for LsError {
Self::IOErrorContext(_, _, false) => 1, Self::IOErrorContext(_, _, false) => 1,
Self::IOErrorContext(_, _, true) => 2, Self::IOErrorContext(_, _, true) => 2,
Self::BlockSizeParseError(_) => 1, Self::BlockSizeParseError(_) => 1,
Self::ConflictingArgumentDired() => 1, Self::ConflictingArgumentDired => 1,
Self::DiredAndZeroAreIncompatible => 2,
Self::AlreadyListedError(_) => 2, Self::AlreadyListedError(_) => 2,
Self::TimeStyleParseError(_, _) => 1, Self::TimeStyleParseError(_, _) => 1,
} }
@ -196,10 +198,12 @@ impl Display for LsError {
Self::BlockSizeParseError(s) => { Self::BlockSizeParseError(s) => {
write!(f, "invalid --block-size argument {}", s.quote()) write!(f, "invalid --block-size argument {}", s.quote())
} }
Self::ConflictingArgumentDired() => { Self::ConflictingArgumentDired => {
write!(f, "--dired requires --format=long") write!(f, "--dired requires --format=long")
} }
Self::DiredAndZeroAreIncompatible => {
write!(f, "--dired and --zero are incompatible")
}
Self::TimeStyleParseError(s, possible_time_styles) => { Self::TimeStyleParseError(s, possible_time_styles) => {
write!( write!(
f, f,
@ -966,7 +970,10 @@ impl Config {
let dired = options.get_flag(options::DIRED); let dired = options.get_flag(options::DIRED);
if dired && format != Format::Long { if dired && format != Format::Long {
return Err(Box::new(LsError::ConflictingArgumentDired())); return Err(Box::new(LsError::ConflictingArgumentDired));
}
if dired && format == Format::Long && options.get_flag(options::ZERO) {
return Err(Box::new(LsError::DiredAndZeroAreIncompatible));
} }
let dereference = if options.get_flag(options::dereference::ALL) { let dereference = if options.get_flag(options::dereference::ALL) {
@ -1142,7 +1149,6 @@ pub fn uu_app() -> Command {
.arg( .arg(
Arg::new(options::ZERO) Arg::new(options::ZERO)
.long(options::ZERO) .long(options::ZERO)
.conflicts_with(options::DIRED)
.overrides_with(options::ZERO) .overrides_with(options::ZERO)
.help("List entries separated by ASCII NUL characters.") .help("List entries separated by ASCII NUL characters.")
.action(ArgAction::SetTrue), .action(ArgAction::SetTrue),

View file

@ -3564,6 +3564,20 @@ fn test_ls_dired_incompatible() {
.stderr_contains("--dired requires --format=long"); .stderr_contains("--dired requires --format=long");
} }
#[test]
fn test_ls_dired_and_zero_are_incompatible() {
let scene = TestScenario::new(util_name!());
scene
.ucmd()
.arg("--dired")
.arg("-l")
.arg("--zero")
.fails()
.code_is(2)
.stderr_contains("--dired and --zero are incompatible");
}
#[test] #[test]
fn test_ls_dired_recursive() { fn test_ls_dired_recursive() {
let scene = TestScenario::new(util_name!()); let scene = TestScenario::new(util_name!());