forked from extern/nushell
Merge pull request #979 from jonathandturner/abbrev_ls
Abbreviate ls by default, add --full flag
This commit is contained in:
commit
54c0603263
@ -8,6 +8,7 @@ pub struct LS;
|
||||
#[derive(Deserialize)]
|
||||
pub struct LsArgs {
|
||||
path: Option<Tagged<PathBuf>>,
|
||||
full: bool,
|
||||
}
|
||||
|
||||
impl WholeStreamCommand for LS {
|
||||
@ -16,11 +17,13 @@ impl WholeStreamCommand for LS {
|
||||
}
|
||||
|
||||
fn signature(&self) -> Signature {
|
||||
Signature::build("ls").optional(
|
||||
Signature::build("ls")
|
||||
.optional(
|
||||
"path",
|
||||
SyntaxShape::Pattern,
|
||||
"a path to get the directory contents from",
|
||||
)
|
||||
.switch("full", "list all available columns for each entry")
|
||||
}
|
||||
|
||||
fn usage(&self) -> &str {
|
||||
@ -37,6 +40,6 @@ impl WholeStreamCommand for LS {
|
||||
}
|
||||
}
|
||||
|
||||
fn ls(LsArgs { path }: LsArgs, context: RunnableContext) -> Result<OutputStream, ShellError> {
|
||||
context.shell_manager.ls(path, &context)
|
||||
fn ls(LsArgs { path, full }: LsArgs, context: RunnableContext) -> Result<OutputStream, ShellError> {
|
||||
context.shell_manager.ls(path, &context, full)
|
||||
}
|
||||
|
@ -13,6 +13,7 @@ pub(crate) fn dir_entry_dict(
|
||||
filename: &std::path::Path,
|
||||
metadata: &std::fs::Metadata,
|
||||
tag: impl Into<Tag>,
|
||||
full: bool,
|
||||
) -> Result<Tagged<Value>, ShellError> {
|
||||
let mut dict = TaggedDictBuilder::new(tag);
|
||||
dict.insert("name", Value::string(filename.to_string_lossy()));
|
||||
@ -26,11 +27,20 @@ pub(crate) fn dir_entry_dict(
|
||||
};
|
||||
|
||||
dict.insert("type", Value::string(format!("{:?}", kind)));
|
||||
|
||||
if full {
|
||||
dict.insert(
|
||||
"readonly",
|
||||
Value::boolean(metadata.permissions().readonly()),
|
||||
);
|
||||
|
||||
#[cfg(unix)]
|
||||
{
|
||||
use std::os::unix::fs::PermissionsExt;
|
||||
dict.insert("mode", Value::int(metadata.permissions().mode()));
|
||||
}
|
||||
}
|
||||
|
||||
dict.insert("size", Value::bytes(metadata.len() as u64));
|
||||
|
||||
match metadata.created() {
|
||||
|
@ -1,12 +1,13 @@
|
||||
use crate::commands::classified::InternalCommand;
|
||||
use crate::commands::ClassifiedCommand;
|
||||
use crate::env::host::BasicHost;
|
||||
use crate::parser::hir;
|
||||
use crate::parser::hir::syntax_shape::*;
|
||||
use crate::parser::hir::TokensIterator;
|
||||
use crate::parser::hir::{self, named::NamedValue, NamedArguments};
|
||||
use crate::parser::parse::token_tree_builder::{CurriedToken, TokenTreeBuilder as b};
|
||||
use crate::parser::TokenNode;
|
||||
use crate::{HasSpan, Span, SpannedItem, Tag, Text};
|
||||
use indexmap::IndexMap;
|
||||
use pretty_assertions::assert_eq;
|
||||
use std::fmt::Debug;
|
||||
|
||||
@ -67,6 +68,9 @@ fn test_parse_command() {
|
||||
|
||||
eprintln!("{:?} {:?} {:?}", bare, pat, bare.until(pat));
|
||||
|
||||
let mut map = IndexMap::new();
|
||||
map.insert("full".to_string(), NamedValue::AbsentSwitch);
|
||||
|
||||
ClassifiedCommand::Internal(InternalCommand::new(
|
||||
"ls".to_string(),
|
||||
Tag {
|
||||
@ -76,7 +80,7 @@ fn test_parse_command() {
|
||||
hir::Call {
|
||||
head: Box::new(hir::RawExpression::Command(bare).spanned(bare)),
|
||||
positional: Some(vec![hir::Expression::pattern("*.txt", pat)]),
|
||||
named: None,
|
||||
named: Some(NamedArguments { named: map }),
|
||||
}
|
||||
.spanned(bare.until(pat)),
|
||||
))
|
||||
|
@ -86,6 +86,7 @@ impl Shell for FilesystemShell {
|
||||
&self,
|
||||
pattern: Option<Tagged<PathBuf>>,
|
||||
context: &RunnableContext,
|
||||
full: bool,
|
||||
) -> Result<OutputStream, ShellError> {
|
||||
let cwd = self.path();
|
||||
let mut full_path = PathBuf::from(self.path());
|
||||
@ -136,7 +137,7 @@ impl Shell for FilesystemShell {
|
||||
Path::new(&filepath)
|
||||
};
|
||||
|
||||
let value = dir_entry_dict(filename, &metadata, &name_tag)?;
|
||||
let value = dir_entry_dict(filename, &metadata, &name_tag, full)?;
|
||||
yield ReturnSuccess::value(value);
|
||||
}
|
||||
}
|
||||
@ -175,7 +176,7 @@ impl Shell for FilesystemShell {
|
||||
Path::new(&entry)
|
||||
};
|
||||
|
||||
if let Ok(value) = dir_entry_dict(filename, &metadata, &name_tag) {
|
||||
if let Ok(value) = dir_entry_dict(filename, &metadata, &name_tag, full) {
|
||||
yield ReturnSuccess::value(value);
|
||||
}
|
||||
}
|
||||
|
@ -129,6 +129,7 @@ impl Shell for HelpShell {
|
||||
&self,
|
||||
_pattern: Option<Tagged<PathBuf>>,
|
||||
_context: &RunnableContext,
|
||||
_full: bool,
|
||||
) -> Result<OutputStream, ShellError> {
|
||||
Ok(self
|
||||
.commands()
|
||||
|
@ -16,6 +16,7 @@ pub trait Shell: std::fmt::Debug {
|
||||
&self,
|
||||
pattern: Option<Tagged<PathBuf>>,
|
||||
context: &RunnableContext,
|
||||
full: bool,
|
||||
) -> Result<OutputStream, ShellError>;
|
||||
fn cd(&self, args: EvaluatedWholeStreamCommandArgs) -> Result<OutputStream, ShellError>;
|
||||
fn cp(&self, args: CopyArgs, name: Tag, path: &str) -> Result<OutputStream, ShellError>;
|
||||
|
@ -127,10 +127,11 @@ impl ShellManager {
|
||||
&self,
|
||||
path: Option<Tagged<PathBuf>>,
|
||||
context: &RunnableContext,
|
||||
full: bool,
|
||||
) -> Result<OutputStream, ShellError> {
|
||||
let env = self.shells.lock().unwrap();
|
||||
|
||||
env[self.current_shell()].ls(path, context)
|
||||
env[self.current_shell()].ls(path, context, full)
|
||||
}
|
||||
|
||||
pub fn cd(&self, args: EvaluatedWholeStreamCommandArgs) -> Result<OutputStream, ShellError> {
|
||||
|
@ -90,6 +90,7 @@ impl Shell for ValueShell {
|
||||
&self,
|
||||
target: Option<Tagged<PathBuf>>,
|
||||
context: &RunnableContext,
|
||||
_full: bool,
|
||||
) -> Result<OutputStream, ShellError> {
|
||||
let mut full_path = PathBuf::from(self.path());
|
||||
let name_tag = context.name.clone();
|
||||
|
Loading…
Reference in New Issue
Block a user