1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-28 19:47:45 +00:00

rm: do "early return" earlier in uumain

This commit is contained in:
Daniel Hofstetter 2025-06-02 16:12:03 +02:00
parent f002c4017f
commit dfc4e3efe5

View file

@ -119,6 +119,12 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> {
let force_flag = matches.get_flag(OPT_FORCE); let force_flag = matches.get_flag(OPT_FORCE);
if files.is_empty() && !force_flag {
// Still check by hand and not use clap
// Because "rm -f" is a thing
return Err(UUsageError::new(1, "missing operand"));
}
// If -f(--force) is before any -i (or variants) we want prompts else no prompts // If -f(--force) is before any -i (or variants) we want prompts else no prompts
let force_prompt_never: bool = force_flag && { let force_prompt_never: bool = force_flag && {
let force_index = matches.index_of(OPT_FORCE).unwrap_or(0); let force_index = matches.index_of(OPT_FORCE).unwrap_or(0);
@ -130,71 +136,66 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> {
}) })
}; };
if files.is_empty() && !force_flag { let options = Options {
// Still check by hand and not use clap force: force_flag,
// Because "rm -f" is a thing interactive: {
return Err(UUsageError::new(1, "missing operand")); if force_prompt_never {
} else { InteractiveMode::Never
let options = Options { } else if matches.get_flag(OPT_PROMPT) {
force: force_flag, InteractiveMode::Always
interactive: { } else if matches.get_flag(OPT_PROMPT_MORE) {
if force_prompt_never { InteractiveMode::Once
InteractiveMode::Never } else if matches.contains_id(OPT_INTERACTIVE) {
} else if matches.get_flag(OPT_PROMPT) { match matches.get_one::<String>(OPT_INTERACTIVE).unwrap().as_str() {
InteractiveMode::Always "never" => InteractiveMode::Never,
} else if matches.get_flag(OPT_PROMPT_MORE) { "once" => InteractiveMode::Once,
InteractiveMode::Once "always" => InteractiveMode::Always,
} else if matches.contains_id(OPT_INTERACTIVE) { val => {
match matches.get_one::<String>(OPT_INTERACTIVE).unwrap().as_str() { return Err(USimpleError::new(
"never" => InteractiveMode::Never, 1,
"once" => InteractiveMode::Once, format!("Invalid argument to interactive ({val})"),
"always" => InteractiveMode::Always, ));
val => {
return Err(USimpleError::new(
1,
format!("Invalid argument to interactive ({val})"),
));
}
} }
} else {
InteractiveMode::PromptProtected
} }
},
one_fs: matches.get_flag(OPT_ONE_FILE_SYSTEM),
preserve_root: !matches.get_flag(OPT_NO_PRESERVE_ROOT),
recursive: matches.get_flag(OPT_RECURSIVE),
dir: matches.get_flag(OPT_DIR),
verbose: matches.get_flag(OPT_VERBOSE),
__presume_input_tty: if matches.get_flag(PRESUME_INPUT_TTY) {
Some(true)
} else { } else {
None InteractiveMode::PromptProtected
},
};
if options.interactive == InteractiveMode::Once && (options.recursive || files.len() > 3) {
let msg: String = format!(
"remove {} {}{}",
files.len(),
if files.len() > 1 {
"arguments"
} else {
"argument"
},
if options.recursive {
" recursively?"
} else {
"?"
}
);
if !prompt_yes!("{msg}") {
return Ok(());
} }
} },
one_fs: matches.get_flag(OPT_ONE_FILE_SYSTEM),
if remove(&files, &options) { preserve_root: !matches.get_flag(OPT_NO_PRESERVE_ROOT),
return Err(1.into()); recursive: matches.get_flag(OPT_RECURSIVE),
dir: matches.get_flag(OPT_DIR),
verbose: matches.get_flag(OPT_VERBOSE),
__presume_input_tty: if matches.get_flag(PRESUME_INPUT_TTY) {
Some(true)
} else {
None
},
};
if options.interactive == InteractiveMode::Once && (options.recursive || files.len() > 3) {
let msg: String = format!(
"remove {} {}{}",
files.len(),
if files.len() > 1 {
"arguments"
} else {
"argument"
},
if options.recursive {
" recursively?"
} else {
"?"
}
);
if !prompt_yes!("{msg}") {
return Ok(());
} }
} }
if remove(&files, &options) {
return Err(1.into());
}
Ok(()) Ok(())
} }