From edaf2d85cb05c4dc9dad720e2a11cdbde8c025c0 Mon Sep 17 00:00:00 2001 From: Gabriel Ganne Date: Thu, 20 Jun 2019 09:55:01 +0200 Subject: [PATCH 1/2] ls: implement --color flag MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GNU coreutils ls command implements the --color option as follow: --color[=WHEN] colorize the output; WHEN can be 'always' (default if omitted), 'auto', or 'never' With --color=auto, ls emits color codes only when standard output is connected to a terminal. Also, add support for the following aliases: - ‘always’, ‘yes’, ‘force’ - ‘never’, ‘no’, ‘none’ - ‘auto’, ‘tty’, ‘if-tty’ Signed-off-by: Gabriel Ganne --- src/ls/ls.rs | 11 +++++++++-- tests/test_ls.rs | 7 +++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/ls/ls.rs b/src/ls/ls.rs index 658be8d2c..86d9385bb 100644 --- a/src/ls/ls.rs +++ b/src/ls/ls.rs @@ -158,7 +158,7 @@ pub fn uumain(args: Vec) -> i32 { directory. This is especially useful when listing very large directories, \ since not doing any sorting can be noticeably faster.", ) - .optflag("", "color", "Color output based on file type.") + .optflagopt("", "color", "Color output based on file type.", "always|auto|never") .parse(args); list(matches); @@ -611,7 +611,14 @@ fn display_file_name( } let mut width = UnicodeWidthStr::width(&*name); - let color = options.opt_present("color"); + let color = match options.opt_str("color") { + None => true, + Some(val) => match val.as_ref() { + "always" | "yes" | "force" => true, + "auto" | "tty" | "if-tty" => true, /* TODO */ + "never" | "no" | "none" | _ => false, + }, + }; let classify = options.opt_present("classify"); let ext; diff --git a/tests/test_ls.rs b/tests/test_ls.rs index 374bfbb08..4cb5904af 100644 --- a/tests/test_ls.rs +++ b/tests/test_ls.rs @@ -11,3 +11,10 @@ fn test_ls_ls_i() { new_ucmd!().arg("-i").succeeds(); new_ucmd!().arg("-il").succeeds(); } + +#[test] +fn test_ls_ls_color() { + new_ucmd!().arg("--color").succeeds(); + new_ucmd!().arg("--color=always").succeeds(); + new_ucmd!().arg("--color=never").succeeds(); +} From 64009b090fe85afe380782e64653a75ceadd24fe Mon Sep 17 00:00:00 2001 From: Gabriel Ganne Date: Thu, 20 Jun 2019 10:00:31 +0200 Subject: [PATCH 2/2] ls: implement --color=auto behavior The automatic behavior is to turn on colors only of connected to a terminal. Introduce new external crate isatty to handle this. Signed-off-by: Gabriel Ganne --- src/ls/Cargo.toml | 1 + src/ls/ls.rs | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ls/Cargo.toml b/src/ls/Cargo.toml index feafa2c8d..37bb85a83 100644 --- a/src/ls/Cargo.toml +++ b/src/ls/Cargo.toml @@ -10,6 +10,7 @@ path = "ls.rs" [dependencies] getopts = "0.2.18" +isatty = "0.1" number_prefix = "0.2.8" term_grid = "0.1.5" termsize = "0.1.6" diff --git a/src/ls/ls.rs b/src/ls/ls.rs index 86d9385bb..1d9de943c 100644 --- a/src/ls/ls.rs +++ b/src/ls/ls.rs @@ -14,6 +14,8 @@ extern crate termsize; extern crate time; extern crate unicode_width; extern crate number_prefix; +extern crate isatty; +use isatty::stdout_isatty; use number_prefix::{Standalone, Prefixed, decimal_prefix}; use term_grid::{Cell, Direction, Filling, Grid, GridOptions}; use time::{strftime, Timespec}; @@ -615,7 +617,7 @@ fn display_file_name( None => true, Some(val) => match val.as_ref() { "always" | "yes" | "force" => true, - "auto" | "tty" | "if-tty" => true, /* TODO */ + "auto" | "tty" | "if-tty" => stdout_isatty(), "never" | "no" | "none" | _ => false, }, };