mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-07-28 11:37:44 +00:00
Merge pull request #3311 from uutils/mkdir2
mkdir: gnu compat: add support of mkdir -p foo/.
This commit is contained in:
commit
98376d8fd5
2 changed files with 40 additions and 4 deletions
|
@ -11,7 +11,7 @@
|
||||||
extern crate uucore;
|
extern crate uucore;
|
||||||
|
|
||||||
use clap::{crate_version, Arg, ArgMatches, Command, OsValues};
|
use clap::{crate_version, Arg, ArgMatches, Command, OsValues};
|
||||||
use std::path::Path;
|
use std::path::{Path, PathBuf};
|
||||||
use uucore::display::Quotable;
|
use uucore::display::Quotable;
|
||||||
#[cfg(not(windows))]
|
#[cfg(not(windows))]
|
||||||
use uucore::error::FromIo;
|
use uucore::error::FromIo;
|
||||||
|
@ -143,8 +143,17 @@ pub fn uu_app<'a>() -> Command<'a> {
|
||||||
*/
|
*/
|
||||||
fn exec(dirs: OsValues, recursive: bool, mode: u32, verbose: bool) -> UResult<()> {
|
fn exec(dirs: OsValues, recursive: bool, mode: u32, verbose: bool) -> UResult<()> {
|
||||||
for dir in dirs {
|
for dir in dirs {
|
||||||
let path = Path::new(dir);
|
// Special case to match GNU's behavior:
|
||||||
show_if_err!(mkdir(path, recursive, mode, verbose));
|
// mkdir -p foo/. should work and just create foo/
|
||||||
|
// std::fs::create_dir("foo/."); fails in pure Rust
|
||||||
|
let path = if recursive && dir.to_string_lossy().ends_with("/.") {
|
||||||
|
// Do a simple dance to strip the "/."
|
||||||
|
Path::new(dir).components().collect::<PathBuf>()
|
||||||
|
} else {
|
||||||
|
// Normal case
|
||||||
|
PathBuf::from(dir)
|
||||||
|
};
|
||||||
|
show_if_err!(mkdir(path.as_path(), recursive, mode, verbose));
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -190,7 +199,6 @@ fn create_dir(path: &Path, recursive: bool, verbose: bool) -> UResult<()> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
match std::fs::create_dir(path) {
|
match std::fs::create_dir(path) {
|
||||||
Ok(()) => {
|
Ok(()) => {
|
||||||
if verbose {
|
if verbose {
|
||||||
|
|
|
@ -11,6 +11,8 @@ static TEST_DIR6: &str = "mkdir_test6";
|
||||||
static TEST_FILE7: &str = "mkdir_test7";
|
static TEST_FILE7: &str = "mkdir_test7";
|
||||||
static TEST_DIR8: &str = "mkdir_test8/mkdir_test8_1/mkdir_test8_2";
|
static TEST_DIR8: &str = "mkdir_test8/mkdir_test8_1/mkdir_test8_2";
|
||||||
static TEST_DIR9: &str = "mkdir_test9/../mkdir_test9_1/../mkdir_test9_2";
|
static TEST_DIR9: &str = "mkdir_test9/../mkdir_test9_1/../mkdir_test9_2";
|
||||||
|
static TEST_DIR10: &str = "mkdir_test10/.";
|
||||||
|
static TEST_DIR11: &str = "mkdir_test11/..";
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_mkdir_mkdir() {
|
fn test_mkdir_mkdir() {
|
||||||
|
@ -123,3 +125,29 @@ fn test_recursive_reporting() {
|
||||||
.stdout_contains("created directory 'mkdir_test9/../mkdir_test9_1'")
|
.stdout_contains("created directory 'mkdir_test9/../mkdir_test9_1'")
|
||||||
.stdout_contains("created directory 'mkdir_test9/../mkdir_test9_1/../mkdir_test9_2'");
|
.stdout_contains("created directory 'mkdir_test9/../mkdir_test9_1/../mkdir_test9_2'");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_mkdir_trailing_dot() {
|
||||||
|
let scene2 = TestScenario::new("ls");
|
||||||
|
new_ucmd!()
|
||||||
|
.arg("-p")
|
||||||
|
.arg("-v")
|
||||||
|
.arg("mkdir_test10-2")
|
||||||
|
.succeeds();
|
||||||
|
|
||||||
|
new_ucmd!()
|
||||||
|
.arg("-p")
|
||||||
|
.arg("-v")
|
||||||
|
.arg(TEST_DIR10)
|
||||||
|
.succeeds()
|
||||||
|
.stdout_contains("created directory 'mkdir_test10'");
|
||||||
|
|
||||||
|
new_ucmd!()
|
||||||
|
.arg("-p")
|
||||||
|
.arg("-v")
|
||||||
|
.arg(TEST_DIR11)
|
||||||
|
.succeeds()
|
||||||
|
.stdout_contains("created directory 'mkdir_test11'");
|
||||||
|
let result = scene2.cmd("ls").arg("-al").run();
|
||||||
|
println!("ls dest {}", result.stdout_str());
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue