ls: fix color of broken symlinks colored as target
authorEric Blake <ebb9@byu.net>
Fri, 1 Jan 2010 14:39:29 +0000 (07:39 -0700)
committerEric Blake <ebb9@byu.net>
Fri, 1 Jan 2010 20:41:46 +0000 (13:41 -0700)
* src/ls.c (print_color_indicator): When using 'LINK target' in
dircolors, treat broken symlink as C_ORPHAN.
* tests/misc/ls-misc (sl-dangle2, sl-dangle3, sl-dangle4)
(sl-dangle5): Test for it, and add more coverage.
* NEWS: Document it.
* THANKS: Update.
Reported by Chris Jones.

NEWS
THANKS
src/ls.c
tests/misc/ls-misc

diff --git a/NEWS b/NEWS
index 7aedfca..7f012e4 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,10 @@ GNU coreutils NEWS                                    -*- outline -*-
 
 ** Bug fixes
 
+  ls -l --color no longer prints "argetm" in front of dangling
+  symlinks when the 'LINK target' directive was given to dircolors.
+  [bug introduced in fileutils-4.0]
+
   rm -r --one-file-system works once again.
   The rewrite to make rm use fts introduced a regression whereby
   a commmand of the above form would fail for all subdirectories.
diff --git a/THANKS b/THANKS
index ce196a4..5ed26b9 100644 (file)
--- a/THANKS
+++ b/THANKS
@@ -105,6 +105,7 @@ Chip Salzenberg                     chip@valinux.com
 Chris Clayton                       chris2553@googlemail.com
 Chris Faylor                        cgf@cygnus.com
 Chris J. Bednar                     cjb@AdvancedDataSolutions.com
+Chris Jones                         cjns1989@gmail.com
 Chris Lesniewski                    ctl@mit.edu
 Chris Sylvain                       csylvain@umm.edu
 Chris Yeo                           cyeo@biking.org
index 04fa93c..aa601fd 100644 (file)
--- a/src/ls.c
+++ b/src/ls.c
@@ -4164,7 +4164,9 @@ print_color_indicator (const struct fileinfo *f, bool symlink_target)
             type = C_STICKY;
         }
       else if (S_ISLNK (mode))
-        type = ((!linkok && color_indicator[C_ORPHAN].string)
+        type = ((!linkok
+                 && (!strncmp (color_indicator[C_LINK].string, "target", 6)
+                     || color_indicator[C_ORPHAN].string))
                 ? C_ORPHAN : C_LINK);
       else if (S_ISFIFO (mode))
         type = C_FIFO;
index a077482..27de57c 100755 (executable)
@@ -185,6 +185,44 @@ my @Tests =
                     restore_ls_colors; }},
      ],
 
+     # Test for a bug fixed after coreutils-8.2.
+     ['sl-dangle2', '-o --color=always l',
+      {OUT_SUBST => 's/.*[0-9][0-9]:[0-9][0-9] //'},
+      {OUT => "l -> nowhere\n"},
+      {PRE => sub {symlink 'nowhere', 'l' or die "l: $!\n";
+                   push_ls_colors('ln=target')
+       }},
+      {POST => sub {unlink 'l' or die "l: $!\n";
+                    restore_ls_colors; }},
+     ],
+     ['sl-dangle3', '-o --color=always l',
+      {OUT_SUBST => 's/.*[0-9][0-9]:[0-9][0-9] //'},
+      {OUT => "$e\e[40ml$e -> \e[34mnowhere$e\n\e[m"},
+      {PRE => sub {symlink 'nowhere', 'l' or die "l: $!\n";
+                   push_ls_colors('ln=target:or=40:mi=34:')
+       }},
+      {POST => sub {unlink 'l' or die "l: $!\n";
+                    restore_ls_colors; }},
+     ],
+     ['sl-dangle4', '-o --color=always l',
+      {OUT_SUBST => 's/.*[0-9][0-9]:[0-9][0-9] //'},
+      {OUT => "$e\e[36ml$e -> \e[35mnowhere$e\n\e[m"},
+      {PRE => sub {symlink 'nowhere', 'l' or die "l: $!\n";
+                   push_ls_colors('ln=34:mi=35:or=36:')
+       }},
+      {POST => sub {unlink 'l' or die "l: $!\n";
+                    restore_ls_colors; }},
+     ],
+     ['sl-dangle5', '-o --color=always l',
+      {OUT_SUBST => 's/.*[0-9][0-9]:[0-9][0-9] //'},
+      {OUT => "$e\e[34ml$e -> \e[35mnowhere$e\n\e[m"},
+      {PRE => sub {symlink 'nowhere', 'l' or die "l: $!\n";
+                   push_ls_colors('ln=34:mi=35:')
+       }},
+      {POST => sub {unlink 'l' or die "l: $!\n";
+                    restore_ls_colors; }},
+     ],
+
      # Test for a bug that was introduced in coreutils-4.5.4; fixed in 4.5.5.
      # To demonstrate it, the file in question (with executable bit set)
      # must not be a command line argument.