From fc235e360e19e01363cba42e70d1c64a093aeabe Mon Sep 17 00:00:00 2001 From: Shinichiro Hamaji Date: Sat, 1 Apr 2017 21:38:56 +0900 Subject: [PATCH] mkdir: Fix the behavior for existing files Currently, mkdir always succeeds for existing files and it even modifies their mode. With this change, only mkdir -p for existing directories will be allowed. --- src/mkdir/mkdir.rs | 12 ++++++------ tests/test_mkdir.rs | 21 +++++++++++++++++++-- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/mkdir/mkdir.rs b/src/mkdir/mkdir.rs index 4ee59d24f..d7c19ae55 100644 --- a/src/mkdir/mkdir.rs +++ b/src/mkdir/mkdir.rs @@ -94,7 +94,9 @@ fn exec(dirs: Vec, recursive: bool, mode: u16, verbose: bool) -> i32 { let mut pathbuf = PathBuf::new(); for component in path.components() { pathbuf.push(component.as_os_str()); - status |= mkdir(pathbuf.as_path(), mode, verbose); + if !path.is_dir() { + status |= mkdir(pathbuf.as_path(), mode, verbose); + } } } else { match path.parent() { @@ -119,11 +121,9 @@ fn exec(dirs: Vec, recursive: bool, mode: u16, verbose: bool) -> i32 { * Wrapper to catch errors, return 1 if failed */ fn mkdir(path: &Path, mode: u16, verbose: bool) -> i32 { - if !path.exists() { - if let Err(e) = fs::create_dir(path) { - show_info!("{}: {}", path.display(), e.to_string()); - return 1; - } + if let Err(e) = fs::create_dir(path) { + show_info!("{}: {}", path.display(), e.to_string()); + return 1; } if verbose { diff --git a/tests/test_mkdir.rs b/tests/test_mkdir.rs index 6e84233a7..91d4881f0 100644 --- a/tests/test_mkdir.rs +++ b/tests/test_mkdir.rs @@ -1,11 +1,12 @@ use common::util::*; - static TEST_DIR1: &'static str = "mkdir_test1"; static TEST_DIR2: &'static str = "mkdir_test2"; static TEST_DIR3: &'static str = "mkdir_test3"; static TEST_DIR4: &'static str = "mkdir_test4/mkdir_test4_1"; static TEST_DIR5: &'static str = "mkdir_test5/mkdir_test5_1"; +static TEST_DIR6: &'static str = "mkdir_test6"; +static TEST_FILE7: &'static str = "mkdir_test7"; #[test] fn test_mkdir_mkdir() { @@ -16,7 +17,7 @@ fn test_mkdir_mkdir() { fn test_mkdir_dup_dir() { let scene = TestScenario::new(util_name!()); scene.ucmd().arg(TEST_DIR2).succeeds(); - scene.ucmd().arg(TEST_DIR2).succeeds(); + scene.ucmd().arg(TEST_DIR2).fails(); } #[test] @@ -39,3 +40,19 @@ fn test_mkdir_parent() { fn test_mkdir_no_parent() { new_ucmd!().arg(TEST_DIR5).fails(); } + +#[test] +fn test_mkdir_dup_dir_parent() { + let scene = TestScenario::new(util_name!()); + scene.ucmd().arg(TEST_DIR6).succeeds(); + scene.ucmd().arg("-p").arg(TEST_DIR6).succeeds(); +} + +#[test] +fn test_mkdir_dup_file() { + let scene = TestScenario::new(util_name!()); + scene.fixtures.touch(TEST_FILE7); + scene.ucmd().arg(TEST_FILE7).fails(); + // mkdir should fail for a file even if -p is specified. + scene.ucmd().arg("-p").arg(TEST_FILE7).fails(); +}