[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] ls: allow stat-free use of --color
From: |
Jim Meyering |
Subject: |
[PATCH] ls: allow stat-free use of --color |
Date: |
Wed, 11 May 2011 17:52:57 +0200 |
I expect to write an accompanying strace-using test case before pushing
the patch below:
For reference, to demonstrate that stat-free use of ls --color,
you have to disable all of these via dircolors/LS_COLORS:
CAPABILITY
EXEC
MISSING
ORPHAN
OTHER_WRITABLE
SETGID
SETUID
STICKY
STICKY_OTHER_WRITABLE
Here's one way to set LS_COLORS:
eval $(dircolors -p|perl -pe \
's/^((CAP|S[ET]|O[TR]|M|E)\w+).*/$1 00/'|dircolors -)
Then, strace -e file ./ls SOME_DIRECTORY
should show exactly one stat call and no lstat call.
>From b456a2e680b1969ddac61a770417493b52973dc0 Mon Sep 17 00:00:00 2001
From: Jim Meyering <address@hidden>
Date: Wed, 11 May 2011 17:13:53 +0200
Subject: [PATCH] ls: allow stat-free use of --color
Even on a system with d_type support, the default use of --color
makes ls stat every file in order to be able to honor settings like
EXEC, STICKY, ORPHAN, SETUID, etc. because those settings require
information that is not provided by dirent.d_type. However, if
for a potentially large performance gain, you are willing to disable
those setting, you can now make ls --color give type-related coloring
and perform no stat calls at all (other than the unavoidable call-per-
command-line argument). Before this change, even with all of those
attributes disabled, ls --color would still stat every directory.
* src/ls.c (gobble_file): With --color, don't stat a
non-command-line-specified directory when no directory-coloring
attribute is enabled.
Prompted by a query from Josef Bacik.
---
src/ls.c | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/src/ls.c b/src/ls.c
index 4262923..54876ce 100644
--- a/src/ls.c
+++ b/src/ls.c
@@ -2740,7 +2740,10 @@ gobble_file (char const *name, enum filetype type, ino_t
inode,
/* When coloring a directory (we may know the type from
direct.d_type), we have to stat it in order to indicate
sticky and/or other-writable attributes. */
- || (type == directory && print_with_color)
+ || (type == directory && print_with_color
+ && (is_colored (C_OTHER_WRITABLE)
+ || is_colored (C_STICKY)
+ || is_colored (C_STICKY_OTHER_WRITABLE)))
/* When dereferencing symlinks, the inode and type must come from
stat, but readdir provides the inode and type of lstat. */
|| ((print_inode || format_needs_type)
--
1.7.5.1.354.g761178
- [PATCH] ls: allow stat-free use of --color,
Jim Meyering <=