From 6653bb45d3697c9372cc77773c49f52399740b51 Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Thu, 17 Nov 2016 12:38:58 +0100 Subject: [PATCH] Fix Bug#24947 (Tramp + ido) * lisp/ido.el (ido-read-internal): Prevent eager Tramp connection. * lisp/net/tramp.el (tramp-handle-file-name-case-insensitive-p): Run remote tests only if a connection is established only. (Bug#24947) --- lisp/ido.el | 1 + lisp/net/tramp.el | 62 +++++++++++++++++++++++++++++-------------------------- 2 files changed, 34 insertions(+), 29 deletions(-) diff --git a/lisp/ido.el b/lisp/ido.el index 0e74cbc7a2d..9df89c9fb61 100644 --- a/lisp/ido.el +++ b/lisp/ido.el @@ -1882,6 +1882,7 @@ If INITIAL is non-nil, it specifies the initial input string." ido-selected ido-final-text (done nil) + (non-essential t) ;; prevent eager Tramp connection (icomplete-mode nil) ;; prevent icomplete starting up ;; Exported dynamic variables: ido-cur-list diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el index b0391ec7714..e9697ff2e1e 100644 --- a/lisp/net/tramp.el +++ b/lisp/net/tramp.el @@ -2905,35 +2905,39 @@ User is always nil." (or ;; Maybe there is a default value. (tramp-get-method-parameter v 'tramp-case-insensitive) - ;; There isn't. So we must check. - (with-tramp-connection-property v "case-insensitive" - ;; The idea is to compare a file with lower case letters with - ;; the same file with upper case letters. - (let ((candidate (directory-file-name filename)) - tmpfile) - ;; Check, whether we find an existing file with lower case - ;; letters. This avoids us to create a temporary file. - (while (and (string-match "[a-z]" (file-remote-p candidate 'localname)) - (not (file-exists-p candidate))) - (setq candidate - (directory-file-name (file-name-directory candidate)))) - ;; Nothing found, so we must use a temporary file for - ;; comparision. `make-nearby-temp-file' is added to Emacs - ;; 26+ like `file-name-case-insensitive-p', so there is no - ;; compatibility problem calling it. - (unless (string-match "[a-z]" (file-remote-p candidate 'localname)) - (setq tmpfile - (let ((default-directory (file-name-directory filename))) - (tramp-compat-funcall 'make-nearby-temp-file "tramp.")) - candidate tmpfile)) - ;; Check for the existence of the same file with upper case letters. - (unwind-protect - (file-exists-p - (concat - (file-remote-p candidate) - (upcase (file-remote-p candidate 'localname)))) - ;; Cleanup. - (when tmpfile (delete-file tmpfile)))))))) + ;; There isn't. So we must check, in case there's a connection already. + (and (tramp-connectable-p filename) + (with-tramp-connection-property v "case-insensitive" + ;; The idea is to compare a file with lower case letters + ;; with the same file with upper case letters. + (let ((candidate (directory-file-name filename)) + tmpfile) + ;; Check, whether we find an existing file with lower case + ;; letters. This avoids us to create a temporary file. + (while (and (string-match + "[a-z]" (file-remote-p candidate 'localname)) + (not (file-exists-p candidate))) + (setq candidate + (directory-file-name (file-name-directory candidate)))) + ;; Nothing found, so we must use a temporary file for + ;; comparision. `make-nearby-temp-file' is added to + ;; Emacs 26+ like `file-name-case-insensitive-p', so + ;; there is no compatibility problem calling it. + (unless + (string-match "[a-z]" (file-remote-p candidate 'localname)) + (setq tmpfile + (let ((default-directory (file-name-directory filename))) + (tramp-compat-funcall 'make-nearby-temp-file "tramp.")) + candidate tmpfile)) + ;; Check for the existence of the same file with upper + ;; case letters. + (unwind-protect + (file-exists-p + (concat + (file-remote-p candidate) + (upcase (file-remote-p candidate 'localname)))) + ;; Cleanup. + (when tmpfile (delete-file tmpfile))))))))) (defun tramp-handle-file-name-completion (filename directory &optional predicate) -- 2.11.4.GIT