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

install: with -t, check if we aren't passed a file

Should pass tests/install/basic-1
This commit is contained in:
Sylvestre Ledru 2023-12-21 00:17:49 +01:00
parent c20f009da4
commit 9ca7c3e107
2 changed files with 35 additions and 0 deletions

View file

@ -66,6 +66,7 @@ enum InstallError {
InvalidUser(String), InvalidUser(String),
InvalidGroup(String), InvalidGroup(String),
OmittingDirectory(PathBuf), OmittingDirectory(PathBuf),
NotADirectory(PathBuf),
} }
impl UError for InstallError { impl UError for InstallError {
@ -120,6 +121,9 @@ impl Display for InstallError {
Self::InvalidUser(user) => write!(f, "invalid user: {}", user.quote()), Self::InvalidUser(user) => write!(f, "invalid user: {}", user.quote()),
Self::InvalidGroup(group) => write!(f, "invalid group: {}", group.quote()), Self::InvalidGroup(group) => write!(f, "invalid group: {}", group.quote()),
Self::OmittingDirectory(dir) => write!(f, "omitting directory {}", dir.quote()), Self::OmittingDirectory(dir) => write!(f, "omitting directory {}", dir.quote()),
Self::NotADirectory(dir) => {
write!(f, "failed to access {}: Not a directory", dir.quote())
}
} }
} }
} }
@ -583,6 +587,13 @@ fn standard(mut paths: Vec<String>, b: &Behavior) -> UResult<()> {
} }
} }
} }
if b.target_dir.is_some() {
let p = to_create.unwrap();
if !p.exists() || !p.is_dir() {
return Err(InstallError::NotADirectory(p.to_path_buf()).into());
}
}
} }
if sources.len() > 1 || is_potential_directory_path(&target) { if sources.len() > 1 || is_potential_directory_path(&target) {

View file

@ -1538,3 +1538,27 @@ fn test_install_compare_option() {
.code_is(1) .code_is(1)
.stderr_contains("Options --compare and --strip are mutually exclusive"); .stderr_contains("Options --compare and --strip are mutually exclusive");
} }
#[test]
// Matches part of tests/install/basic-1
fn test_t_exist_dir() {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let source1 = "file";
let target_dir = "sub4/";
let target_file = "sub4/file_exists";
at.touch(source1);
at.mkdir(target_dir);
at.touch(target_file);
scene
.ucmd()
.arg("-t")
.arg(target_file)
.arg("-Dv")
.arg(source1)
.fails()
.stderr_contains("failed to access 'sub4/file_exists': Not a directory");
}