From d30dfc63c4080af688902bfee44ebd74363c3890 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20=C5=BD=C3=A1dn=C3=ADk?= Date: Sun, 21 Nov 2021 01:14:42 +0200 Subject: [PATCH] Fix reading of LS_COLORS; ls display symlink (#357) Also a swing-by fix removing a redundant call to std::fs::symlink_metadata(). --- crates/nu-command/src/filesystem/ls.rs | 13 ++++++++++--- crates/nu-command/src/viewers/griddle.rs | 12 +++++++++++- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/crates/nu-command/src/filesystem/ls.rs b/crates/nu-command/src/filesystem/ls.rs index dbf16057ba..21a8cd8e25 100644 --- a/crates/nu-command/src/filesystem/ls.rs +++ b/crates/nu-command/src/filesystem/ls.rs @@ -57,18 +57,23 @@ impl Command for Ls { let call_span = call.head; let glob = glob::glob(&pattern).unwrap(); - let ls_colors = LsColors::from_env().unwrap_or_default(); + let ls_colors = match stack.get_env_var("LS_COLORS") { + Some(s) => LsColors::from_string(&s), + None => LsColors::default(), + }; Ok(glob .into_iter() .map(move |x| match x { Ok(path) => match std::fs::symlink_metadata(&path) { Ok(metadata) => { + let is_symlink = metadata.file_type().is_symlink(); let is_file = metadata.is_file(); let is_dir = metadata.is_dir(); let filesize = metadata.len(); let mut cols = vec!["name".into(), "type".into(), "size".into()]; - let style = ls_colors.style_for_path(path.clone()); + let style = + ls_colors.style_for_path_with_metadata(path.clone(), Some(&metadata)); let ansi_style = style.map(Style::to_crossterm_style).unwrap_or_default(); let use_ls_colors = config.use_ls_colors; @@ -84,7 +89,9 @@ impl Command for Ls { span: call_span, } }, - if is_file { + if is_symlink { + Value::string("symlink", call_span) + } else if is_file { Value::string("file", call_span) } else if is_dir { Value::string("dir", call_span) diff --git a/crates/nu-command/src/viewers/griddle.rs b/crates/nu-command/src/viewers/griddle.rs index 9085bae487..6ad5c282c0 100644 --- a/crates/nu-command/src/viewers/griddle.rs +++ b/crates/nu-command/src/viewers/griddle.rs @@ -60,6 +60,8 @@ prints out the list properly."# let config = stack.get_config()?; + let env_str = stack.get_env_var("LS_COLORS"); + match input { PipelineData::Value(Value::List { vals, .. }) => { // dbg!("value::list"); @@ -71,6 +73,7 @@ prints out the list properly."# width_param, color_param, separator_param, + env_str, )) } else { Ok(PipelineData::new(call.head)) @@ -86,6 +89,7 @@ prints out the list properly."# width_param, color_param, separator_param, + env_str, )) } else { // dbg!(data); @@ -106,6 +110,7 @@ prints out the list properly."# width_param, color_param, separator_param, + env_str, )) } x => { @@ -123,8 +128,13 @@ fn create_grid_output2( width_param: Option, color_param: bool, separator_param: Option, + env_str: Option, ) -> PipelineData { - let ls_colors = LsColors::from_env().unwrap_or_default(); + let ls_colors = match env_str { + Some(s) => LsColors::from_string(&s), + None => LsColors::default(), + }; + let cols = if let Some(col) = width_param { col.parse::().unwrap_or(80) } else if let Some((Width(w), Height(_h))) = terminal_size::terminal_size() {