mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-07-28 11:37:44 +00:00
Implement creation of component directories (-d option)
Tested in two integration test: - One creating three component directories - One trying to create an already existing directory
This commit is contained in:
parent
823ffbd1dd
commit
b15fff6269
2 changed files with 80 additions and 6 deletions
|
@ -31,8 +31,13 @@ pub struct Behaviour {
|
||||||
|
|
||||||
#[derive(Clone, Eq, PartialEq)]
|
#[derive(Clone, Eq, PartialEq)]
|
||||||
pub enum MainFunction {
|
pub enum MainFunction {
|
||||||
|
/// Display version information.
|
||||||
Version,
|
Version,
|
||||||
|
/// Display help, including command line arguments.
|
||||||
Help,
|
Help,
|
||||||
|
/// Create directories
|
||||||
|
Directory,
|
||||||
|
/// Install files to locations (primary functionality)
|
||||||
Standard
|
Standard
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,6 +90,9 @@ pub fn uumain(args: Vec<String>) -> i32 {
|
||||||
help(&usage);
|
help(&usage);
|
||||||
0
|
0
|
||||||
},
|
},
|
||||||
|
MainFunction::Directory => {
|
||||||
|
directory(&paths[..], behaviour)
|
||||||
|
},
|
||||||
MainFunction::Standard => {
|
MainFunction::Standard => {
|
||||||
standard(&paths[..], behaviour)
|
standard(&paths[..], behaviour)
|
||||||
}
|
}
|
||||||
|
@ -109,8 +117,7 @@ fn opts() -> getopts::Options {
|
||||||
opts.optflag("C", "compare", "(unimplemented) compare each pair of source and destination\n \
|
opts.optflag("C", "compare", "(unimplemented) compare each pair of source and destination\n \
|
||||||
files, and in some cases, do not modify the destination at all");
|
files, and in some cases, do not modify the destination at all");
|
||||||
|
|
||||||
// TODO implement flag
|
opts.optflag("d", "directory", "treat all arguments as directory names;\n \
|
||||||
opts.optflag("d", "directory", "(unimplemented) treat all arguments as directory names;\n \
|
|
||||||
create all components of the specified directories");
|
create all components of the specified directories");
|
||||||
|
|
||||||
|
|
||||||
|
@ -182,8 +189,6 @@ fn check_unimplemented(matches: &getopts::Matches) -> Result<(), &str> {
|
||||||
Err("-b")
|
Err("-b")
|
||||||
} else if matches.opt_present("compare") {
|
} else if matches.opt_present("compare") {
|
||||||
Err("--compare, -C")
|
Err("--compare, -C")
|
||||||
} else if matches.opt_present("directory") {
|
|
||||||
Err("--directory, -d")
|
|
||||||
} else if matches.opt_present("D") {
|
} else if matches.opt_present("D") {
|
||||||
Err("-D")
|
Err("-D")
|
||||||
} else if matches.opt_present("group") {
|
} else if matches.opt_present("group") {
|
||||||
|
@ -228,6 +233,8 @@ fn behaviour(matches: &getopts::Matches) -> Result<Behaviour, i32> {
|
||||||
MainFunction::Version
|
MainFunction::Version
|
||||||
} else if matches.opt_present("help") {
|
} else if matches.opt_present("help") {
|
||||||
MainFunction::Help
|
MainFunction::Help
|
||||||
|
} else if matches.opt_present("directory") {
|
||||||
|
MainFunction::Directory
|
||||||
} else {
|
} else {
|
||||||
MainFunction::Standard
|
MainFunction::Standard
|
||||||
};
|
};
|
||||||
|
@ -261,6 +268,41 @@ fn help(usage: &str) {
|
||||||
{2}", NAME, VERSION, usage);
|
{2}", NAME, VERSION, usage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Creates directories.
|
||||||
|
///
|
||||||
|
/// GNU man pages describe this functionality as creating 'all components of
|
||||||
|
/// the specified directories'.
|
||||||
|
///
|
||||||
|
/// Returns an integer intended as a program return code.
|
||||||
|
///
|
||||||
|
fn directory(paths: &[PathBuf], b: Behaviour) -> i32 {
|
||||||
|
if paths.len() < 1 {
|
||||||
|
println!("{} with -d requires at least one argument.", NAME);
|
||||||
|
1
|
||||||
|
} else {
|
||||||
|
let mut all_successful = true;
|
||||||
|
|
||||||
|
for directory in paths.iter() {
|
||||||
|
let path = directory.as_path();
|
||||||
|
|
||||||
|
if path.exists() {
|
||||||
|
show_info!("cannot create directory '{}': File exists", path.display());
|
||||||
|
all_successful = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Err(e) = fs::create_dir(directory) {
|
||||||
|
show_info!("{}: {}", path.display(), e.to_string());
|
||||||
|
all_successful = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if b.verbose {
|
||||||
|
show_info!("created directory '{}'", path.display());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if all_successful { 0 } else { 1 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Perform an install, given a list of paths and behaviour.
|
/// Perform an install, given a list of paths and behaviour.
|
||||||
///
|
///
|
||||||
/// Returns an integer intended as a program return code.
|
/// Returns an integer intended as a program return code.
|
||||||
|
|
|
@ -14,8 +14,9 @@ fn test_install_help() {
|
||||||
let (at, mut ucmd) = testing(UTIL_NAME);
|
let (at, mut ucmd) = testing(UTIL_NAME);
|
||||||
|
|
||||||
let result = ucmd.arg("--help").run();
|
let result = ucmd.arg("--help").run();
|
||||||
assert_empty_stderr!(result);
|
|
||||||
assert!(result.success);
|
assert!(result.success);
|
||||||
|
assert_empty_stderr!(result);
|
||||||
|
|
||||||
assert!(result.stdout.contains("Usage:"));
|
assert!(result.stdout.contains("Usage:"));
|
||||||
}
|
}
|
||||||
|
@ -32,8 +33,8 @@ fn test_install_basic() {
|
||||||
at.mkdir(dir);
|
at.mkdir(dir);
|
||||||
let result = ucmd.arg(file1).arg(file2).arg(dir).run();
|
let result = ucmd.arg(file1).arg(file2).arg(dir).run();
|
||||||
|
|
||||||
assert_empty_stderr!(result);
|
|
||||||
assert!(result.success);
|
assert!(result.success);
|
||||||
|
assert_empty_stderr!(result);
|
||||||
|
|
||||||
assert!(at.file_exists(file1));
|
assert!(at.file_exists(file1));
|
||||||
assert!(at.file_exists(file2));
|
assert!(at.file_exists(file2));
|
||||||
|
@ -57,3 +58,34 @@ fn test_install_unimplemented_arg() {
|
||||||
|
|
||||||
assert!(!at.file_exists(&format!("{}/{}", dir, file)));
|
assert!(!at.file_exists(&format!("{}/{}", dir, file)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_install_component_directories() {
|
||||||
|
let (at, mut ucmd) = testing(UTIL_NAME);
|
||||||
|
let component1 = "test_install_target_dir_component_c1";
|
||||||
|
let component2 = "test_install_target_dir_component_c2";
|
||||||
|
let component3 = "test_install_target_dir_component_c3";
|
||||||
|
let directories_arg = "-d";
|
||||||
|
|
||||||
|
let result = ucmd.arg(directories_arg).arg(component1).arg(component2).arg(component3).run();
|
||||||
|
|
||||||
|
assert!(result.success);
|
||||||
|
assert_empty_stderr!(result);
|
||||||
|
|
||||||
|
assert!(at.dir_exists(component1));
|
||||||
|
assert!(at.dir_exists(component2));
|
||||||
|
assert!(at.dir_exists(component3));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_install_component_directories_failing() {
|
||||||
|
let (at, mut ucmd) = testing(UTIL_NAME);
|
||||||
|
let component = "test_install_target_dir_component_d1";
|
||||||
|
let directories_arg = "-d";
|
||||||
|
|
||||||
|
at.mkdir(component);
|
||||||
|
let result = ucmd.arg(directories_arg).arg(component).run();
|
||||||
|
|
||||||
|
assert!(!result.success);
|
||||||
|
assert!(result.stderr.contains("File exists"));
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue