bug-coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] ls: support disabling colors on all subtypes


From: Pádraig Brady
Subject: Re: [PATCH] ls: support disabling colors on all subtypes
Date: Tue, 15 Sep 2009 15:54:55 +0100
User-agent: Thunderbird 2.0.0.6 (X11/20071008)

Pádraig Brady wrote:
> I was trying to disable the green colors today in my ls listing
> and noticed that if you do that the directories are shown
> without color rather than falling back to the standard color
> for directories (blue).
> 
> The attached patch fixes that up.

It deserves NEWS and a test I think.
Updated patch attached.

cheers,
Pádraig.
>From b5ad7958680c1ca14d739469ee5efebad4c8ae21 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?P=C3=A1draig=20Brady?= <address@hidden>
Date: Mon, 14 Sep 2009 13:37:37 +0100
Subject: [PATCH] ls: allow disabling colors on all file types

* src/ls.c (print_color_indicator): Use consistent syntax for
all file and directory subtypes, and fall back to the color
of the base type if there is no enabled color for the subtype.
This allows turning off specific colors for o+w dirs for example.
* tests/ls/color-dtype-dir: Add a case to test that turning off
coloring for o+w directories, falls back to standard dir color.
* NEWS: Mention the fix
Introduced by commit ac467814, 2005-09-05,
"Colorize set-user-ID ... files and sticky ... directories."
---
 NEWS                     |    3 +++
 src/ls.c                 |   24 +++++++++++++-----------
 tests/ls/color-dtype-dir |   20 ++++++++++++++++++++
 3 files changed, 36 insertions(+), 11 deletions(-)

diff --git a/NEWS b/NEWS
index 0f44816..6ef2dea 100644
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,9 @@ GNU coreutils NEWS                                    -*- 
outline -*-
   to accommodate leap seconds.
   [the bug dates back to the initial implementation]
 
+  ls --color now reverts to the color of a base file type consistently
+  when the color of a more specific type is disabled.
+
 ** Changes in behavior
 
   id no longer prints SELinux " context=..." when the POSIXLY_CORRECT
diff --git a/src/ls.c b/src/ls.c
index b62ea12..efdc0b4 100644
--- a/src/ls.c
+++ b/src/ls.c
@@ -4102,7 +4102,7 @@ print_color_indicator (const char *name, mode_t mode, int 
linkok,
                        bool stat_ok, enum filetype filetype,
                        nlink_t nlink)
 {
-  int type;
+  enum indicator_no type;
   struct color_ext_type *ext;  /* Color extension */
   size_t len;                  /* Length of name */
 
@@ -4120,27 +4120,29 @@ print_color_indicator (const char *name, mode_t mode, 
int linkok,
       if (S_ISREG (mode))
         {
           type = C_FILE;
-          if ((mode & S_ISUID) != 0)
+
+          if ((mode & S_ISUID) != 0 && is_colored (C_SETUID))
             type = C_SETUID;
-          else if ((mode & S_ISGID) != 0)
+          else if ((mode & S_ISGID) != 0 && is_colored (C_SETGID))
             type = C_SETGID;
-          else if (is_colored (C_CAP) && has_capability (name))
+          else if (has_capability (name) && is_colored (C_CAP))
             type = C_CAP;
-          else if ((mode & S_IXUGO) != 0)
+          else if ((mode & S_IXUGO) != 0 && is_colored (C_EXEC))
             type = C_EXEC;
-          else if (is_colored (C_MULTIHARDLINK) && (1 < nlink))
+          else if ((1 < nlink) && is_colored (C_MULTIHARDLINK))
             type = C_MULTIHARDLINK;
         }
       else if (S_ISDIR (mode))
         {
-          if ((mode & S_ISVTX) && (mode & S_IWOTH))
+          type = C_DIR;
+
+          if ((mode & S_ISVTX) && (mode & S_IWOTH)
+              && is_colored (C_STICKY_OTHER_WRITABLE))
             type = C_STICKY_OTHER_WRITABLE;
-          else if ((mode & S_IWOTH) != 0)
+          else if ((mode & S_IWOTH) != 0 && is_colored (C_OTHER_WRITABLE))
             type = C_OTHER_WRITABLE;
-          else if ((mode & S_ISVTX) != 0)
+          else if ((mode & S_ISVTX) != 0 && is_colored (C_STICKY))
             type = C_STICKY;
-          else
-            type = C_DIR;
         }
       else if (S_ISLNK (mode))
         type = ((!linkok && color_indicator[C_ORPHAN].string)
diff --git a/tests/ls/color-dtype-dir b/tests/ls/color-dtype-dir
index 5381a66..3ccf10e 100755
--- a/tests/ls/color-dtype-dir
+++ b/tests/ls/color-dtype-dir
@@ -50,4 +50,24 @@ EOF
 
 compare out exp || fail=1
 
+rm exp
+
+# Turn off colors for other-writable dirs and ensure
+# we fall back to the color for standard directories.
+
+LS_COLORS="ow=:" ls --color=always > out || fail=1
+cat -A out > o1 || fail=1
+echo >> o1 || fail=1
+mv o1 out || fail=1
+
+cat <<\EOF > exp || fail=1
+^[[0m^[[01;34md^[[0m$
+^[[01;34mother-writable^[[0m$
+out$
+^[[37;44msticky^[[0m$
+^[[m
+EOF
+
+compare out exp || fail=1
+
 Exit $fail
-- 
1.6.2.5


reply via email to

[Prev in Thread] Current Thread [Next in Thread]