1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-29 03:57:44 +00:00

install: better error messages when invalid arguments

executing `install` or `install file` no longer panics and insteads returns errors similar to GNU's install when it encounters similar args
This commit is contained in:
ndd7xv 2022-02-23 22:34:34 -05:00
parent c9be7ccf89
commit 172be3a8c6

View file

@ -18,7 +18,7 @@ use filetime::{set_file_times, FileTime};
use uucore::backup_control::{self, BackupMode};
use uucore::display::Quotable;
use uucore::entries::{grp2gid, usr2uid};
use uucore::error::{FromIo, UError, UIoError, UResult};
use uucore::error::{FromIo, UError, UIoError, UResult, UUsageError};
use uucore::format_usage;
use uucore::mode::get_umask;
use uucore::perms::{wrap_chown, Verbosity, VerbosityLevel};
@ -442,11 +442,14 @@ fn is_new_file_path(path: &Path) -> bool {
/// Returns a Result type with the Err variant containing the error message.
///
fn standard(mut paths: Vec<String>, b: &Behavior) -> UResult<()> {
let target: PathBuf = b
.target_dir
.clone()
.unwrap_or_else(|| paths.pop().unwrap())
.into();
let target: PathBuf = if let Some(path) = &b.target_dir {
path.into()
} else {
paths
.pop()
.ok_or_else(|| UUsageError::new(1, "missing file operand"))?
.into()
};
let sources = &paths.iter().map(PathBuf::from).collect::<Vec<_>>();
@ -468,7 +471,19 @@ fn standard(mut paths: Vec<String>, b: &Behavior) -> UResult<()> {
}
if target.is_file() || is_new_file_path(&target) {
copy(&sources[0], &target, b)
copy(
sources.get(0).ok_or_else(|| {
UUsageError::new(
1,
format!(
"missing destination file operand after '{}'",
target.to_str().unwrap()
),
)
})?,
&target,
b,
)
} else {
Err(InstallError::InvalidTarget(target).into())
}