From 4429a75e170b41084fd41a6bffb679939d9d4eea Mon Sep 17 00:00:00 2001 From: Shaurya Shubham Date: Sat, 25 Jan 2020 21:50:33 +0530 Subject: [PATCH] Make ls show only the file name (#1276) * Make ls show only the file name * Refactor and remove unwraps * Put functionality in separate flag --- src/commands/ls.rs | 3 +++ src/shell/filesystem_shell.rs | 36 +++++++++++++++++++++++++++++++---- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/commands/ls.rs b/src/commands/ls.rs index 62aada27fa..18ee5ae745 100644 --- a/src/commands/ls.rs +++ b/src/commands/ls.rs @@ -11,6 +11,8 @@ pub struct Ls; pub struct LsArgs { pub path: Option>, pub full: bool, + #[serde(rename = "short-names")] + pub short_names: bool, } impl PerItemCommand for Ls { @@ -26,6 +28,7 @@ impl PerItemCommand for Ls { "a path to get the directory contents from", ) .switch("full", "list all available columns for each entry") + .switch("short-names", "only print the file names and not the path") } fn usage(&self) -> &str { diff --git a/src/shell/filesystem_shell.rs b/src/shell/filesystem_shell.rs index 7c3858edc3..9c7fabb2b5 100644 --- a/src/shell/filesystem_shell.rs +++ b/src/shell/filesystem_shell.rs @@ -88,7 +88,11 @@ impl Shell for FilesystemShell { fn ls( &self, - LsArgs { path, full }: LsArgs, + LsArgs { + path, + full, + short_names, + }: LsArgs, context: &RunnablePerItemContext, ) -> Result { let cwd = self.path(); @@ -144,12 +148,24 @@ impl Shell for FilesystemShell { if let Ok(entry) = entry { let filepath = entry.path(); if let Ok(metadata) = std::fs::symlink_metadata(&filepath) { - let filename = if let Ok(fname) = filepath.strip_prefix(&cwd) { + let mut filename = if let Ok(fname) = filepath.strip_prefix(&cwd) { fname } else { Path::new(&filepath) }; + if short_names { + filename = if let Some(fname) = filename.file_name() { + Path::new(fname) + } else { + let fname = filename + .file_name() + .or_else(|| Path::new(filename).file_name()) + .unwrap_or(filename.as_os_str()); + Path::new(fname) + } + } + let value = dir_entry_dict(filename, &metadata, &name_tag, full)?; yield ReturnSuccess::value(value); } @@ -183,12 +199,24 @@ impl Shell for FilesystemShell { } if let Ok(entry) = entry { if let Ok(metadata) = std::fs::symlink_metadata(&entry) { - let filename = if let Ok(fname) = entry.strip_prefix(&cwd) { + let mut filename = if let Ok(fname) = entry.strip_prefix(&cwd) { fname } else { - Path::new(&entry) + Path::new(&entry) }; + if short_names { + filename = if let Some(fname) = filename.file_name() { + Path::new(fname) + } else { + let fname = filename + .file_name() + .or_else(|| Path::new(filename).file_name()) + .unwrap_or(filename.as_os_str()); + Path::new(fname) + } + } + if let Ok(value) = dir_entry_dict(filename, &metadata, &name_tag, full) { yield ReturnSuccess::value(value); }