Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rm: make the utility public #5304

Merged
merged 4 commits into from
Sep 23, 2023
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .vscode/cspell.dictionaries/acronyms+names.wordlist.txt
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ MinGW
Minix
NetBSD
Novell
Nushell
OpenBSD
POSIX
PowerPC
Expand Down
58 changes: 47 additions & 11 deletions src/uu/rm/src/rm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,22 +18,52 @@ use uucore::{format_usage, help_about, help_section, help_usage, prompt_yes, sho
use walkdir::{DirEntry, WalkDir};

#[derive(Eq, PartialEq, Clone, Copy)]
enum InteractiveMode {
/// Enum, determining when the `rm` will prompt the user about the file deletion
pub enum InteractiveMode {
/// Never prompt
Never,
/// Prompt once before removing more than three files, or when removing
/// recursively.
Once,
/// Prompt before every removal
Always,
/// TODO clarify what this option does
KAAtheWiseGit marked this conversation as resolved.
Show resolved Hide resolved
PromptProtected,
}

struct Options {
force: bool,
interactive: InteractiveMode,
/// Options for the `rm` command
///
/// All options are public so that the options can be programmatically
/// constructed by other crates, such as Nushell. That means that this struct
/// is part of our public API. It should therefore not be changed without good
/// reason.
///
/// The fields are documented with the arguments that determine their value.
pub struct Options {
/// `-f`, `--force`
pub force: bool,
/// Iterative mode, determines when the command will prompt.
///
/// Set by the following arguments:
/// - `-i`: [`InteractiveMode::Always`]
/// - `-I`: [`InteractiveMode::Once`]
/// - `--interactive`: sets one of the above or [`InteractiveMode::Never`]
/// - `-f`: implicitly sets [`InteractiveMode::Never`]
///
/// If no other option sets this mode, [`InteractiveMode::PromptProtected`]
/// is used
pub interactive: InteractiveMode,
#[allow(dead_code)]
one_fs: bool,
preserve_root: bool,
recursive: bool,
dir: bool,
verbose: bool,
/// `--one-file-system`
pub one_fs: bool,
/// `--preserve-root`/`--no-preserve-root`
pub preserve_root: bool,
/// `-r`, `--recursive`
pub recursive: bool,
/// `-d`, `--dir`
pub dir: bool,
/// `-v`, `--verbose`
pub verbose: bool,
}

const ABOUT: &str = help_about!("rm.md");
Expand Down Expand Up @@ -249,7 +279,13 @@ pub fn uu_app() -> Command {
}

// TODO: implement one-file-system (this may get partially implemented in walkdir)
fn remove(files: &[&OsStr], options: &Options) -> bool {
/// Remove (or unlink) the given files
///
/// Returns true if it has encountered an error.
///
/// Behavior is determined by the `options` parameter, see [`Options`] for
/// details.
pub fn remove(files: &[&OsStr], options: &Options) -> bool {
let mut had_err = false;

for filename in files {
Expand All @@ -268,7 +304,7 @@ fn remove(files: &[&OsStr], options: &Options) -> bool {
// TODO: actually print out the specific error
// TODO: When the error is not about missing files
// (e.g., permission), even rm -f should fail with
// outputting the error, but there's no easy eay.
// outputting the error, but there's no easy way.
if options.force {
false
} else {
Expand Down