Skip to content

Commit f332443

Browse files
committed
rm: use clap to handle --interactive args
1 parent f877f64 commit f332443

3 files changed

Lines changed: 50 additions & 33 deletions

File tree

src/uu/rm/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ path = "src/rm.rs"
2020
[dependencies]
2121
thiserror = { workspace = true }
2222
clap = { workspace = true }
23-
uucore = { workspace = true, features = ["fs"] }
23+
uucore = { workspace = true, features = ["fs", "parser"] }
2424
fluent = { workspace = true }
2525

2626
[target.'cfg(unix)'.dependencies]

src/uu/rm/src/rm.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55

66
// spell-checker:ignore (path) eacces inacc rm-r4
77

8-
use clap::{Arg, ArgAction, Command, builder::ValueParser, parser::ValueSource};
8+
use clap::builder::{PossibleValue, ValueParser};
9+
use clap::{Arg, ArgAction, Command, parser::ValueSource};
910
use std::ffi::{OsStr, OsString};
1011
use std::fs::{self, Metadata};
1112
use std::io::{IsTerminal, stdin};
@@ -19,6 +20,7 @@ use std::path::{Path, PathBuf};
1920
use thiserror::Error;
2021
use uucore::display::Quotable;
2122
use uucore::error::{FromIo, UError, UResult};
23+
use uucore::parser::shortcut_value_parser::ShortcutValueParser;
2224
use uucore::translate;
2325

2426
use uucore::{format_usage, os_str_as_bytes, prompt_yes, show_error};
@@ -249,6 +251,11 @@ pub fn uu_app() -> Command {
249251
.long(OPT_INTERACTIVE)
250252
.help(translate!("rm-help-interactive"))
251253
.value_name("WHEN")
254+
.value_parser(ShortcutValueParser::new([
255+
PossibleValue::new("always").alias("yes"),
256+
PossibleValue::new("once"),
257+
PossibleValue::new("never").alias("no").alias("none"),
258+
]))
252259
.num_args(0..=1)
253260
.require_equals(true)
254261
.default_missing_value("always")

tests/by-util/test_rm.rs

Lines changed: 41 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@
66

77
use std::process::Stdio;
88

9-
use uutests::util::TestScenario;
10-
use uutests::{at_and_ucmd, new_ucmd, util_name};
9+
use uutests::{at_and_ucmd, new_ucmd, util::TestScenario, util_name};
1110

1211
#[test]
1312
fn test_invalid_arg() {
@@ -379,42 +378,53 @@ fn test_silently_accepts_presume_input_tty2() {
379378
fn test_interactive_never() {
380379
let scene = TestScenario::new(util_name!());
381380
let at = &scene.fixtures;
381+
let file = "a";
382382

383-
let file_2 = "test_rm_interactive";
383+
for arg in ["never", "no", "none"] {
384+
at.touch(file);
385+
#[cfg(feature = "chmod")]
386+
scene.ccmd("chmod").arg("0").arg(file).succeeds();
384387

385-
at.touch(file_2);
386-
#[cfg(feature = "chmod")]
387-
scene.ccmd("chmod").arg("0").arg(file_2).succeeds();
388-
389-
scene
390-
.ucmd()
391-
.arg("--interactive=never")
392-
.arg(file_2)
393-
.succeeds()
394-
.stdout_is("");
388+
scene
389+
.ucmd()
390+
.arg(format!("--interactive={arg}"))
391+
.arg(file)
392+
.succeeds()
393+
.no_output();
395394

396-
assert!(!at.file_exists(file_2));
395+
assert!(!at.file_exists(file));
396+
}
397397
}
398398

399399
#[test]
400-
fn test_interactive_missing_value() {
401-
// `--interactive` is equivalent to `--interactive=always` or `-i`
402-
let (at, mut ucmd) = at_and_ucmd!();
403-
404-
let file1 = "test_rm_interactive_missing_value_file1";
405-
let file2 = "test_rm_interactive_missing_value_file2";
406-
407-
at.touch(file1);
408-
at.touch(file2);
409-
410-
ucmd.arg("--interactive")
411-
.arg(file1)
412-
.arg(file2)
413-
.pipe_in("y\ny")
414-
.succeeds();
400+
fn test_interactive_always() {
401+
let scene = TestScenario::new(util_name!());
402+
let at = &scene.fixtures;
415403

416-
assert!(!at.file_exists(file1));
417-
assert!(!at.file_exists(file2));
404+
let file_a = "a";
405+
let file_b = "b";
406+
407+
for arg in [
408+
"-i",
409+
"--interactive",
410+
"--interactive=always",
411+
"--interactive=yes",
412+
] {
413+
at.touch(file_a);
414+
at.touch(file_b);
415+
416+
scene
417+
.ucmd()
418+
.arg(arg)
419+
.arg(file_a)
420+
.arg(file_b)
421+
.pipe_in("y\ny")
422+
.succeeds()
423+
.no_stdout();
424+
425+
assert!(!at.file_exists(file_a));
426+
assert!(!at.file_exists(file_b));
427+
}
418428
}
419429

420430
#[test]

0 commit comments

Comments
 (0)