diff --git a/src/uu/install/src/install.rs b/src/uu/install/src/install.rs index 37f69a2f0..cf500c9de 100644 --- a/src/uu/install/src/install.rs +++ b/src/uu/install/src/install.rs @@ -146,7 +146,6 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .help("set permission mode (as in chmod), instead of rwxr-xr-x") .value_name("MODE") .takes_value(true) - .min_values(1) ) .arg( Arg::with_name(OPT_OWNER) diff --git a/src/uucore/src/lib/features/mode.rs b/src/uucore/src/lib/features/mode.rs index 50679d107..8b5e71799 100644 --- a/src/uucore/src/lib/features/mode.rs +++ b/src/uucore/src/lib/features/mode.rs @@ -9,7 +9,7 @@ pub fn parse_numeric(fperm: u32, mut mode: &str) -> Result { let (op, pos) = parse_op(mode, Some('='))?; - mode = mode[pos..].trim_start_matches('0'); + mode = mode[pos..].trim().trim_start_matches('0'); if mode.len() > 4 { Err(format!("mode is too large ({} > 7777)", mode)) } else { diff --git a/tests/by-util/test_install.rs b/tests/by-util/test_install.rs index 89ae515a7..99e2abfd4 100644 --- a/tests/by-util/test_install.rs +++ b/tests/by-util/test_install.rs @@ -102,20 +102,44 @@ fn test_install_component_directories() { #[test] fn test_install_mode_numeric() { - let (at, mut ucmd) = at_and_ucmd!(); + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; let dir = "test_install_target_dir_dir_e"; + let dir2 = "test_install_target_dir_dir_e2"; + let file = "test_install_target_dir_file_e"; let mode_arg = "--mode=333"; at.touch(file); at.mkdir(dir); - ucmd.arg(file).arg(dir).arg(mode_arg).succeeds().no_stderr(); + scene + .ucmd() + .arg(file) + .arg(dir) + .arg(mode_arg) + .succeeds() + .no_stderr(); let dest_file = &format!("{}/{}", dir, file); assert!(at.file_exists(file)); assert!(at.file_exists(dest_file)); let permissions = at.metadata(dest_file).permissions(); assert_eq!(0o100333 as u32, PermissionsExt::mode(&permissions)); + + let mode_arg = "-m 0333"; + at.mkdir(dir2); + + let result = scene.ucmd().arg(mode_arg).arg(file).arg(dir2).run(); + + println!("stderr = {:?}", result.stderr); + println!("stdout = {:?}", result.stdout); + + assert!(result.success); + let dest_file = &format!("{}/{}", dir2, file); + assert!(at.file_exists(file)); + assert!(at.file_exists(dest_file)); + let permissions = at.metadata(dest_file).permissions(); + assert_eq!(0o100333 as u32, PermissionsExt::mode(&permissions)); } #[test]