Abbreviate ls by default, add --full flag

This commit is contained in:
Jonathan Turner 2019-11-18 06:10:50 +13:00
parent 9c41f581a9
commit 2bb03d9813
7 changed files with 32 additions and 14 deletions

View file

@ -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(
"path",
SyntaxShape::Pattern,
"a path to get the directory contents from",
)
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)
}

View file

@ -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,10 +27,19 @@ pub(crate) fn dir_entry_dict(
};
dict.insert("type", Value::string(format!("{:?}", kind)));
dict.insert(
"readonly",
Value::boolean(metadata.permissions().readonly()),
);
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));

View file

@ -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);
}
}

View file

@ -129,6 +129,7 @@ impl Shell for HelpShell {
&self,
_pattern: Option<Tagged<PathBuf>>,
_context: &RunnableContext,
_full: bool,
) -> Result<OutputStream, ShellError> {
Ok(self
.commands()

View file

@ -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>;

View file

@ -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> {

View file

@ -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();