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)] #[derive(Deserialize)]
pub struct LsArgs { pub struct LsArgs {
path: Option<Tagged<PathBuf>>, path: Option<Tagged<PathBuf>>,
full: bool,
} }
impl WholeStreamCommand for LS { impl WholeStreamCommand for LS {
@ -16,11 +17,13 @@ impl WholeStreamCommand for LS {
} }
fn signature(&self) -> Signature { fn signature(&self) -> Signature {
Signature::build("ls").optional( Signature::build("ls")
.optional(
"path", "path",
SyntaxShape::Pattern, SyntaxShape::Pattern,
"a path to get the directory contents from", "a path to get the directory contents from",
) )
.switch("full", "list all available columns for each entry")
} }
fn usage(&self) -> &str { fn usage(&self) -> &str {
@ -37,6 +40,6 @@ impl WholeStreamCommand for LS {
} }
} }
fn ls(LsArgs { path }: LsArgs, context: RunnableContext) -> Result<OutputStream, ShellError> { fn ls(LsArgs { path, full }: LsArgs, context: RunnableContext) -> Result<OutputStream, ShellError> {
context.shell_manager.ls(path, &context) context.shell_manager.ls(path, &context, full)
} }

View file

@ -13,6 +13,7 @@ pub(crate) fn dir_entry_dict(
filename: &std::path::Path, filename: &std::path::Path,
metadata: &std::fs::Metadata, metadata: &std::fs::Metadata,
tag: impl Into<Tag>, tag: impl Into<Tag>,
full: bool,
) -> Result<Tagged<Value>, ShellError> { ) -> Result<Tagged<Value>, ShellError> {
let mut dict = TaggedDictBuilder::new(tag); let mut dict = TaggedDictBuilder::new(tag);
dict.insert("name", Value::string(filename.to_string_lossy())); 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))); dict.insert("type", Value::string(format!("{:?}", kind)));
if full {
dict.insert( dict.insert(
"readonly", "readonly",
Value::boolean(metadata.permissions().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)); dict.insert("size", Value::bytes(metadata.len() as u64));
match metadata.created() { match metadata.created() {

View file

@ -86,6 +86,7 @@ impl Shell for FilesystemShell {
&self, &self,
pattern: Option<Tagged<PathBuf>>, pattern: Option<Tagged<PathBuf>>,
context: &RunnableContext, context: &RunnableContext,
full: bool,
) -> Result<OutputStream, ShellError> { ) -> Result<OutputStream, ShellError> {
let cwd = self.path(); let cwd = self.path();
let mut full_path = PathBuf::from(self.path()); let mut full_path = PathBuf::from(self.path());
@ -136,7 +137,7 @@ impl Shell for FilesystemShell {
Path::new(&filepath) 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); yield ReturnSuccess::value(value);
} }
} }
@ -175,7 +176,7 @@ impl Shell for FilesystemShell {
Path::new(&entry) 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); yield ReturnSuccess::value(value);
} }
} }

View file

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

View file

@ -16,6 +16,7 @@ pub trait Shell: std::fmt::Debug {
&self, &self,
pattern: Option<Tagged<PathBuf>>, pattern: Option<Tagged<PathBuf>>,
context: &RunnableContext, context: &RunnableContext,
full: bool,
) -> Result<OutputStream, ShellError>; ) -> Result<OutputStream, ShellError>;
fn cd(&self, args: EvaluatedWholeStreamCommandArgs) -> Result<OutputStream, ShellError>; fn cd(&self, args: EvaluatedWholeStreamCommandArgs) -> Result<OutputStream, ShellError>;
fn cp(&self, args: CopyArgs, name: Tag, path: &str) -> Result<OutputStream, ShellError>; fn cp(&self, args: CopyArgs, name: Tag, path: &str) -> Result<OutputStream, ShellError>;

View file

@ -127,10 +127,11 @@ impl ShellManager {
&self, &self,
path: Option<Tagged<PathBuf>>, path: Option<Tagged<PathBuf>>,
context: &RunnableContext, context: &RunnableContext,
full: bool,
) -> Result<OutputStream, ShellError> { ) -> Result<OutputStream, ShellError> {
let env = self.shells.lock().unwrap(); 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> { pub fn cd(&self, args: EvaluatedWholeStreamCommandArgs) -> Result<OutputStream, ShellError> {

View file

@ -90,6 +90,7 @@ impl Shell for ValueShell {
&self, &self,
target: Option<Tagged<PathBuf>>, target: Option<Tagged<PathBuf>>,
context: &RunnableContext, context: &RunnableContext,
_full: bool,
) -> Result<OutputStream, ShellError> { ) -> Result<OutputStream, ShellError> {
let mut full_path = PathBuf::from(self.path()); let mut full_path = PathBuf::from(self.path());
let name_tag = context.name.clone(); let name_tag = context.name.clone();