From 54bf671a50a10132534e60e31e144dc1dfd28840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linards=20Kalv=C4=81ns?= Date: Mon, 9 Mar 2020 15:02:53 +0200 Subject: [PATCH] =?UTF-8?q?Fix=20deleting=20/=20showing=20`ls`=20named=20p?= =?UTF-8?q?ipes=20and=20other=20fs=20objects=20no=E2=80=A6=20(#1461)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix deleting named pipes * Use std::os::unix::fs::FileTypeExt to show correct type for unix-specific fs objects; Fix formatting Co-authored-by: Linards Kalvāns --- crates/nu-cli/src/data/files.rs | 62 +++++++++++++++------ crates/nu-cli/src/shell/filesystem_shell.rs | 2 +- 2 files changed, 45 insertions(+), 19 deletions(-) diff --git a/crates/nu-cli/src/data/files.rs b/crates/nu-cli/src/data/files.rs index 3b69c4f097..257ab96624 100644 --- a/crates/nu-cli/src/data/files.rs +++ b/crates/nu-cli/src/data/files.rs @@ -2,6 +2,35 @@ use crate::prelude::*; use nu_errors::ShellError; use nu_protocol::{TaggedDictBuilder, UntaggedValue, Value}; +#[cfg(unix)] +use std::os::unix::fs::FileTypeExt; + +fn get_file_type(md: &std::fs::Metadata) -> &str { + let ft = md.file_type(); + let mut file_type = "Unknown"; + if ft.is_dir() { + file_type = "Dir"; + } else if ft.is_file() { + file_type = "File"; + } else if ft.is_symlink() { + file_type = "Symlink"; + } else { + #[cfg(unix)] + { + if ft.is_block_device() { + file_type = "Block device"; + } else if ft.is_char_device() { + file_type = "Char device"; + } else if ft.is_fifo() { + file_type = "Pipe"; + } else if ft.is_socket() { + file_type = "Socket"; + } + } + } + file_type +} + pub(crate) fn dir_entry_dict( filename: &std::path::Path, metadata: Option<&std::fs::Metadata>, @@ -29,31 +58,28 @@ pub(crate) fn dir_entry_dict( dict.insert_untagged("name", UntaggedValue::string(name)); if let Some(md) = metadata { - if md.is_dir() { - dict.insert_untagged("type", UntaggedValue::string("Dir")); - } else if md.is_file() { - dict.insert_untagged("type", UntaggedValue::string("File")); - } else { - dict.insert_untagged("type", UntaggedValue::string("Symlink")); - } + dict.insert_untagged("type", get_file_type(md)); } else { dict.insert_untagged("type", UntaggedValue::nothing()); } if full || with_symlink_targets { if let Some(md) = metadata { - if md.is_dir() || md.is_file() { - dict.insert_untagged("target", UntaggedValue::nothing()); - } else if let Ok(path_to_link) = filename.read_link() { - dict.insert_untagged( - "target", - UntaggedValue::string(path_to_link.to_string_lossy()), - ); + let ft = md.file_type(); + if ft.is_symlink() { + if let Ok(path_to_link) = filename.read_link() { + dict.insert_untagged( + "target", + UntaggedValue::string(path_to_link.to_string_lossy()), + ); + } else { + dict.insert_untagged( + "target", + UntaggedValue::string("Could not obtain target file's path"), + ); + } } else { - dict.insert_untagged( - "target", - UntaggedValue::string("Could not obtain target file's path"), - ); + dict.insert_untagged("target", UntaggedValue::nothing()); } } else { dict.insert_untagged("target", UntaggedValue::nothing()); diff --git a/crates/nu-cli/src/shell/filesystem_shell.rs b/crates/nu-cli/src/shell/filesystem_shell.rs index fd829efa5a..91c3768fa0 100644 --- a/crates/nu-cli/src/shell/filesystem_shell.rs +++ b/crates/nu-cli/src/shell/filesystem_shell.rs @@ -978,7 +978,7 @@ impl Shell for FilesystemShell { }; let valid_target = - f.is_file() || (f.is_dir() && (is_empty || recursive.item)); + f.exists() && (!f.is_dir() || (is_empty || recursive.item)); if valid_target { if trash.item { match SendToTrash::remove(f) {