changeset 106312:badff1777919

* eshell/esh-util.el (top): Require also Tramp when compiling. (eshell-directory-files-and-attributes): Check for FTP remote connection. (eshell-parse-ange-ls): Let-bind `ange-ftp-name-format', `ange-ftp-ftp-name-arg', `ange-ftp-ftp-name-res'. (eshell-file-attributes): Handle ".". Return `entry'.
author Michael Albinus <michael.albinus@gmx.de>
date Sun, 29 Nov 2009 20:18:59 +0000
parents 12c2a6b10caf
children af8417378024
files lisp/eshell/esh-util.el
diffstat 1 files changed, 26 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/eshell/esh-util.el	Sun Nov 29 20:10:29 2009 +0000
+++ b/lisp/eshell/esh-util.el	Sun Nov 29 20:18:59 2009 +0000
@@ -613,20 +613,14 @@
 
 (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)
@@ -643,10 +637,23 @@
     (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))
@@ -701,6 +708,7 @@
     (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
@@ -713,7 +721,8 @@
 		(let ((fentry (assoc base (cdr entry))))
 		  (if fentry
 		      (setq entry (cdr fentry))
-		    (setq entry nil))))))
+		    (setq entry nil)))))
+	  entry)
       (file-attributes file))))
 
 (defalias 'eshell-copy-tree 'copy-tree)