aboutsummaryrefslogtreecommitdiffstats
path: root/lisp
diff options
context:
space:
mode:
Diffstat (limited to 'lisp')
-rw-r--r--lisp/ChangeLog5
-rw-r--r--lisp/eshell/em-ls.el34
2 files changed, 27 insertions, 12 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 6d4c706274..2ef03c3fb3 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,8 @@
+2010-02-09 Chong Yidong <[email protected]>
+
+ * eshell/em-ls.el (eshell-ls-applicable): Frob file attributes
+ correctly (Bug#5548).
+
2010-02-08 Jose E. Marchesi <[email protected]>
* progmodes/ada-mode.el (ada-in-numeric-literal-p): New function.
diff --git a/lisp/eshell/em-ls.el b/lisp/eshell/em-ls.el
index 9b008cebf1..860ad5c77d 100644
--- a/lisp/eshell/em-ls.el
+++ b/lisp/eshell/em-ls.el
@@ -225,18 +225,28 @@ really need to stick around for very long."
(eq (aref (nth 8 attrs) 0) type)))
(defmacro eshell-ls-applicable (attrs index func file)
- "Test whether, for ATTRS, the user UID can do what corresponds to INDEX.
-This is really just for efficiency, to avoid having to stat the file
-yet again."
- `(if (numberp (nth 2 ,attrs))
- (if (= (user-uid) (nth 2 ,attrs))
- (not (eq (aref (nth 8 ,attrs) ,index) ?-))
- (,(eval func) ,file))
- (not (eq (aref (nth 8 ,attrs)
- (+ ,index (if (member (nth 2 ,attrs)
- (eshell-current-ange-uids))
- 0 6)))
- ?-))))
+ "Test whether, for ATTRS, the user can do what corresponds to INDEX.
+ATTRS is a string of file modes. See `file-attributes'.
+If we cannot determine the answer using ATTRS (e.g., if we need
+to know what group the user is in), compute the return value by
+calling FUNC with FILE as an argument."
+ `(let ((owner (nth 2 ,attrs))
+ (modes (nth 8 ,attrs)))
+ (cond ((cond ((numberp owner)
+ (= owner (user-uid)))
+ ((stringp owner)
+ (or (string-equal owner (user-login-name))
+ (member owner (eshell-current-ange-uids)))))
+ ;; The user owns this file.
+ (not (eq (aref modes ,index) ?-)))
+ ((eq (aref modes (+ ,index 3))
+ (aref modes (+ ,index 6)))
+ ;; If the "group" and "other" fields give identical
+ ;; results, use that.
+ (not (eq (aref modes (+ ,index 3)) ?-)))
+ (t
+ ;; Otherwise call FUNC.
+ (,(eval func) ,file)))))
(defcustom eshell-ls-highlight-alist nil
"*This alist correlates test functions to color.