]> code.delx.au - gnu-emacs/blobdiff - lisp/ls-lisp.el
Check whether diff supports --label before using it
[gnu-emacs] / lisp / ls-lisp.el
index 55ec835831aff29be6cf28281e3292b752e1a07b..70ee4394b8855aec7352cdac1125b66b7edac453 100644 (file)
@@ -1,6 +1,6 @@
 ;;; ls-lisp.el --- emulate insert-directory completely in Emacs Lisp
 
-;; Copyright (C) 1992, 1994, 2000-201 Free Software Foundation, Inc.
+;; Copyright (C) 1992, 1994, 2000-2013 Free Software Foundation, Inc.
 
 ;; Author: Sebastian Kremer <sk@thp.uni-koeln.de>
 ;; Modified by: Francis J. Wright <F.J.Wright@maths.qmw.ac.uk>
@@ -62,8 +62,6 @@
 
 ;;; Code:
 
-(eval-when-compile (require 'cl))
-
 (defgroup ls-lisp nil
   "Emulate the ls program completely in Emacs Lisp."
   :version "21.1"
@@ -331,8 +329,9 @@ not contain `d', so that a full listing is expected."
             (max-gid-len 0)
             (max-file-size 0)
             ;; do all bindings here for speed
-            total-line files elt short file-size fil attr
+            total-line files elt short file-size attr
             fuid fgid uid-len gid-len)
+       (setq file-alist (ls-lisp-sanitize file-alist))
        (cond ((memq ?A switches)
               (setq file-alist
                     (ls-lisp-delete-matching "^\\.\\.?$" file-alist)))
@@ -439,6 +438,22 @@ not contain `d', so that a full listing is expected."
        (message "%s: doesn't exist or is inaccessible" file)
        (ding) (sit-for 2)))))          ; to show user the message!
 
+(defun ls-lisp-sanitize (file-alist)
+  "Sanitize the elements in FILE-ALIST.
+Fixes any elements in the alist for directory entries whose file
+attributes are nil (meaning that `file-attributes' failed for
+them).  This is known to happen for some network shares, in
+particular for the \"..\" directory entry.
+
+If the \"..\" directory entry has nil attributes, the attributes
+are copied from the \".\" entry, if they are non-nil.  Otherwise,
+the offending element is removed from the list, as are any
+elements for other directory entries with nil attributes."
+  (if (and (null (cdr (assoc ".." file-alist)))
+          (cdr (assoc "." file-alist)))
+      (setcdr (assoc ".." file-alist) (cdr (assoc "." file-alist))))
+  (rassq-delete-all nil file-alist))
+
 (defun ls-lisp-column-format (file-alist)
   "Insert the file names (only) in FILE-ALIST into the current buffer.
 Format in columns, sorted vertically, following GNU ls -C.
@@ -726,13 +741,7 @@ All ls time options, namely c, t and u, are handled."
                  ls-lisp-filesize-f-fmt
                ls-lisp-filesize-d-fmt)
              file-size)
-    (if (< file-size 1024)
-       (format " %4d" file-size)
-      (do ((file-size (/ file-size 1024.0) (/ file-size 1024.0))
-          ;; kilo, mega, giga, tera, peta, exa
-          (post-fixes (list "k" "M" "G" "T" "P" "E") (cdr post-fixes)))
-         ((< file-size 1024)
-          (format " %3.0f%s"  file-size (car post-fixes)))))))
+    (format " %7s" (file-size-human-readable file-size))))
 
 (provide 'ls-lisp)