forked from extern/nushell
Fix ls listing (#593)
This commit is contained in:
parent
e1c92e90ca
commit
de30236f38
@ -63,19 +63,45 @@ impl Command for Ls {
|
|||||||
|
|
||||||
let call_span = call.head;
|
let call_span = call.head;
|
||||||
|
|
||||||
let (pattern, arg_span) =
|
let pattern = if let Some(mut result) =
|
||||||
if let Some(mut result) = call.opt::<Spanned<String>>(engine_state, stack, 0)? {
|
call.opt::<Spanned<String>>(engine_state, stack, 0)?
|
||||||
|
{
|
||||||
let path = std::path::Path::new(&result.item);
|
let path = std::path::Path::new(&result.item);
|
||||||
|
|
||||||
|
if path.is_dir() {
|
||||||
|
if permission_denied(&path) {
|
||||||
|
#[cfg(unix)]
|
||||||
|
let error_msg = format!(
|
||||||
|
"The permissions of {:o} do not allow access for this user",
|
||||||
|
path.metadata()
|
||||||
|
.expect("this shouldn't be called since we already know there is a dir")
|
||||||
|
.permissions()
|
||||||
|
.mode()
|
||||||
|
& 0o0777
|
||||||
|
);
|
||||||
|
#[cfg(not(unix))]
|
||||||
|
let error_msg = String::from("Permission denied");
|
||||||
|
return Err(ShellError::SpannedLabeledError(
|
||||||
|
"Permission denied".into(),
|
||||||
|
error_msg,
|
||||||
|
result.span,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
if is_empty_dir(&path) {
|
||||||
|
return Ok(PipelineData::new(call_span));
|
||||||
|
}
|
||||||
|
|
||||||
if path.is_dir() {
|
if path.is_dir() {
|
||||||
if !result.item.ends_with(std::path::MAIN_SEPARATOR) {
|
if !result.item.ends_with(std::path::MAIN_SEPARATOR) {
|
||||||
result.item.push(std::path::MAIN_SEPARATOR);
|
result.item.push(std::path::MAIN_SEPARATOR);
|
||||||
}
|
}
|
||||||
result.item.push('*');
|
result.item.push('*');
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
(result.item, result.span)
|
result.item
|
||||||
} else {
|
} else {
|
||||||
("*".into(), call_span)
|
"*".into()
|
||||||
};
|
};
|
||||||
|
|
||||||
let glob = glob::glob(&pattern).map_err(|err| {
|
let glob = glob::glob(&pattern).map_err(|err| {
|
||||||
@ -93,32 +119,6 @@ impl Command for Ls {
|
|||||||
.into_iter()
|
.into_iter()
|
||||||
.filter_map(move |x| match x {
|
.filter_map(move |x| match x {
|
||||||
Ok(path) => {
|
Ok(path) => {
|
||||||
if permission_denied(&path) {
|
|
||||||
#[cfg(unix)]
|
|
||||||
let error_msg = format!(
|
|
||||||
"The permissions of {:o} do not allow access for this user",
|
|
||||||
path.metadata()
|
|
||||||
.expect(
|
|
||||||
"this shouldn't be called since we already know there is a dir"
|
|
||||||
)
|
|
||||||
.permissions()
|
|
||||||
.mode()
|
|
||||||
& 0o0777
|
|
||||||
);
|
|
||||||
#[cfg(not(unix))]
|
|
||||||
let error_msg = String::from("Permission denied");
|
|
||||||
return Some(Value::Error {
|
|
||||||
error: ShellError::SpannedLabeledError(
|
|
||||||
"Permission denied".into(),
|
|
||||||
error_msg,
|
|
||||||
arg_span,
|
|
||||||
),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
// if is_empty_dir(&p) {
|
|
||||||
// return Ok(ActionStream::empty());
|
|
||||||
// }
|
|
||||||
|
|
||||||
let metadata = match std::fs::symlink_metadata(&path) {
|
let metadata = match std::fs::symlink_metadata(&path) {
|
||||||
Ok(metadata) => Some(metadata),
|
Ok(metadata) => Some(metadata),
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
@ -193,6 +193,13 @@ fn is_hidden_dir(dir: impl AsRef<Path>) -> bool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_empty_dir(dir: impl AsRef<Path>) -> bool {
|
||||||
|
match dir.as_ref().read_dir() {
|
||||||
|
Err(_) => true,
|
||||||
|
Ok(mut s) => s.next().is_none(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn path_contains_hidden_folder(path: &Path, folders: &[PathBuf]) -> bool {
|
fn path_contains_hidden_folder(path: &Path, folders: &[PathBuf]) -> bool {
|
||||||
let path_str = path.to_str().expect("failed to read path");
|
let path_str = path.to_str().expect("failed to read path");
|
||||||
if folders
|
if folders
|
||||||
|
Loading…
Reference in New Issue
Block a user