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

Merge pull request #5686 from sylvestre/install-basic

install: with -t, check if we aren't passed a file
This commit is contained in:
Daniel Hofstetter 2023-12-23 15:33:45 +01:00 committed by GitHub
commit be822009f0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 35 additions and 0 deletions

View file

@ -66,6 +66,7 @@ enum InstallError {
InvalidUser(String),
InvalidGroup(String),
OmittingDirectory(PathBuf),
NotADirectory(PathBuf),
}
impl UError for InstallError {
@ -120,6 +121,9 @@ impl Display for InstallError {
Self::InvalidUser(user) => write!(f, "invalid user: {}", user.quote()),
Self::InvalidGroup(group) => write!(f, "invalid group: {}", group.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) {

View file

@ -1566,3 +1566,27 @@ fn test_install_compare_option() {
.code_is(1)
.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");
}