forked from extern/nushell
# Description This fixes #12391. nushell/nushell@87c5f6e455 accidentally introduced a bug where the path was not being properly expanded according to the cwd. This makes both 'touch' and 'mkdir' use globs just like the rest of the commands to preserve tilde behavior while still expanding the paths properly. This doesn't actually expand the globs. Should it? # User-Facing Changes - Restore behavior of `mkdir`, `touch` - Help text now says they can take globs, but they won't actually expand them, maybe this should be changed # Tests + Formatting Regression tests added. # After Submitting This is severe enough and should be included in the point release.
106 lines
2.9 KiB
Rust
106 lines
2.9 KiB
Rust
use nu_engine::{command_prelude::*, current_dir};
|
|
|
|
use uu_mkdir::mkdir;
|
|
#[cfg(not(windows))]
|
|
use uucore::mode;
|
|
|
|
use super::util::get_rest_for_glob_pattern;
|
|
|
|
#[derive(Clone)]
|
|
pub struct UMkdir;
|
|
|
|
const IS_RECURSIVE: bool = true;
|
|
const DEFAULT_MODE: u32 = 0o777;
|
|
|
|
#[cfg(not(windows))]
|
|
fn get_mode() -> u32 {
|
|
!mode::get_umask() & DEFAULT_MODE
|
|
}
|
|
|
|
#[cfg(windows)]
|
|
fn get_mode() -> u32 {
|
|
DEFAULT_MODE
|
|
}
|
|
|
|
impl Command for UMkdir {
|
|
fn name(&self) -> &str {
|
|
"mkdir"
|
|
}
|
|
|
|
fn usage(&self) -> &str {
|
|
"Create directories, with intermediary directories if required using uutils/coreutils mkdir."
|
|
}
|
|
|
|
fn search_terms(&self) -> Vec<&str> {
|
|
vec!["directory", "folder", "create", "make_dirs", "coreutils"]
|
|
}
|
|
|
|
fn signature(&self) -> Signature {
|
|
Signature::build("mkdir")
|
|
.input_output_types(vec![(Type::Nothing, Type::Nothing)])
|
|
.rest(
|
|
"rest",
|
|
SyntaxShape::OneOf(vec![SyntaxShape::GlobPattern, SyntaxShape::Directory]),
|
|
"The name(s) of the path(s) to create.",
|
|
)
|
|
.switch(
|
|
"verbose",
|
|
"print a message for each created directory.",
|
|
Some('v'),
|
|
)
|
|
.category(Category::FileSystem)
|
|
}
|
|
|
|
fn run(
|
|
&self,
|
|
engine_state: &EngineState,
|
|
stack: &mut Stack,
|
|
call: &Call,
|
|
_input: PipelineData,
|
|
) -> Result<PipelineData, ShellError> {
|
|
let cwd = current_dir(engine_state, stack)?;
|
|
let mut directories = get_rest_for_glob_pattern(engine_state, stack, call, 0)?
|
|
.into_iter()
|
|
.map(|dir| nu_path::expand_path_with(dir.item.as_ref(), &cwd, dir.item.is_expand()))
|
|
.peekable();
|
|
|
|
let is_verbose = call.has_flag(engine_state, stack, "verbose")?;
|
|
|
|
if directories.peek().is_none() {
|
|
return Err(ShellError::MissingParameter {
|
|
param_name: "requires directory paths".to_string(),
|
|
span: call.head,
|
|
});
|
|
}
|
|
|
|
for dir in directories {
|
|
if let Err(error) = mkdir(&dir, IS_RECURSIVE, get_mode(), is_verbose) {
|
|
return Err(ShellError::GenericError {
|
|
error: format!("{}", error),
|
|
msg: format!("{}", error),
|
|
span: None,
|
|
help: None,
|
|
inner: vec![],
|
|
});
|
|
}
|
|
}
|
|
|
|
Ok(PipelineData::empty())
|
|
}
|
|
|
|
fn examples(&self) -> Vec<Example> {
|
|
vec![
|
|
Example {
|
|
description: "Make a directory named foo",
|
|
example: "mkdir foo",
|
|
result: None,
|
|
},
|
|
Example {
|
|
description: "Make multiple directories and show the paths created",
|
|
example: "mkdir -v foo/bar foo2",
|
|
result: None,
|
|
},
|
|
]
|
|
}
|
|
}
|