;;; esh-util.el --- general utilities
;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
-;; 2008, 2009 Free Software Foundation, Inc.
+;; 2008, 2009, 2010 Free Software Foundation, Inc.
;; Author: John Wiegley <johnw@gnu.org>
(defun eshell-directory-files-and-attributes (dir &optional full match nosort id-format)
"Make sure to use the handler for `directory-file-and-attributes'."
- (let* ((dir (expand-file-name dir))
- (dfh (find-file-name-handler dir 'directory-files)))
- (if (not dfh)
- (directory-files-and-attributes dir full match nosort id-format)
- (let ((files (funcall dfh 'directory-files dir full match nosort))
- (fah (find-file-name-handler dir 'file-attributes)))
- (mapcar
- (function
- (lambda (file)
- (cons file (if fah
- (eshell-file-attributes
- (expand-file-name file dir))
- (file-attributes (expand-file-name file dir))))))
- files)))))
+ (let* ((dir (expand-file-name dir)))
+ (if (string-equal (file-remote-p dir 'method) "ftp")
+ (let ((files (directory-files dir full match nosort)))
+ (mapcar
+ (lambda (file)
+ (cons file (eshell-file-attributes (expand-file-name file dir))))
+ files))
+ (directory-files-and-attributes dir full match nosort id-format))))
(defun eshell-current-ange-uids ()
(if (string-match "/\\([^@]+\\)@\\([^:]+\\):" default-directory)
(autoload 'parse-time-string "parse-time"))
(eval-when-compile
- (require 'ange-ftp nil t))
+ (require 'ange-ftp nil t)
+ (require 'tramp nil t))
(defun eshell-parse-ange-ls (dir)
- (let (entry)
+ (let ((ange-ftp-name-format
+ (list (nth 0 tramp-file-name-structure)
+ (nth 3 tramp-file-name-structure)
+ (nth 2 tramp-file-name-structure)
+ (nth 4 tramp-file-name-structure)))
+ ;; ange-ftp uses `ange-ftp-ftp-name-arg' and `ange-ftp-ftp-name-res'
+ ;; for optimization in `ange-ftp-ftp-name'. If Tramp wasn't active,
+ ;; there could be incorrect values from previous calls in case the
+ ;; "ftp" method is used in the Tramp file name. So we unset
+ ;; those values.
+ (ange-ftp-ftp-name-arg "")
+ (ange-ftp-ftp-name-res nil)
+ entry)
(with-temp-buffer
(insert (ange-ftp-ls dir "-la" nil))
(goto-char (point-min))
(forward-line)))
entry))
-(defun eshell-file-attributes (file)
- "Return the attributes of FILE, playing tricks if it's over ange-ftp."
+(defun eshell-file-attributes (file &optional id-format)
+ "Return the attributes of FILE, playing tricks if it's over ange-ftp.
+The optional argument ID-FORMAT specifies the preferred uid and
+gid format. Valid values are 'string and 'integer, defaulting to
+'integer. See `file-attributes'."
(let* ((file (expand-file-name file))
entry)
(if (string-equal (file-remote-p file 'method) "ftp")
(let ((base (file-name-nondirectory file))
(dir (file-name-directory file)))
+ (if (string-equal "" base) (setq base "."))
(if (boundp 'ange-cache)
(setq entry (cdr (assoc base (cdr (assoc dir ange-cache))))))
(unless entry
(let ((fentry (assoc base (cdr entry))))
(if fentry
(setq entry (cdr fentry))
- (setq entry nil))))))
- (file-attributes file))))
+ (setq entry nil)))))
+ entry)
+ (file-attributes file id-format))))
(defalias 'eshell-copy-tree 'copy-tree)