From: Michael Albinus Date: Fri, 12 Oct 2018 11:41:12 +0000 (+0200) Subject: Fix error in Tramp loading, uncovered by tramp-test43-* X-Git-Tag: emacs-27.0.90~4309 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=10cd2500afcad1c6d7ab01c8b8c336e69e9add96;p=emacs.git Fix error in Tramp loading, uncovered by tramp-test43-* * lisp/net/tramp-archive.el (tramp-archive-autoload-file-name-handler): New defalias. (tramp-register-archive-file-name-handler): Use it. * lisp/net/tramp.el (tramp-file-name-for-operation): Change it for `expand-file-name'. (tramp-file-name-handler): Unset `file-name-handler-alist' when autoloading a Tramp file name handler. (tramp-autoload-file-name-handler): Always unload Tramp file name handlers. (tramp-register-file-name-handlers) (tramp-unload-file-name-handlers): Simplify. --- diff --git a/lisp/net/tramp-archive.el b/lisp/net/tramp-archive.el index 5d7562f707e..bb87a83f10f 100644 --- a/lisp/net/tramp-archive.el +++ b/lisp/net/tramp-archive.el @@ -331,14 +331,18 @@ pass to the OPERATION." (save-match-data (apply (cdr fn) args)) (tramp-archive-run-real-handler operation args))))))) +;;;###autoload +(defalias + 'tramp-archive-autoload-file-name-handler 'tramp-autoload-file-name-handler) + ;;;###autoload (progn (defun tramp-register-archive-file-name-handler () "Add archive file name handler to `file-name-handler-alist'." (when tramp-archive-enabled (add-to-list 'file-name-handler-alist (cons (tramp-archive-autoload-file-name-regexp) - 'tramp-autoload-file-name-handler)) - (put 'tramp-archive-file-name-handler 'safe-magic t)))) + 'tramp-archive-autoload-file-name-handler)) + (put 'tramp-archive-autoload-file-name-handler 'safe-magic t)))) ;;;###autoload (progn diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el index 08a225602aa..e629ce17315 100644 --- a/lisp/net/tramp.el +++ b/lisp/net/tramp.el @@ -2138,7 +2138,7 @@ ARGS are the arguments OPERATION has been called with." default-directory)) ;; FILE DIRECTORY resp FILE1 FILE2. ((member operation - '(add-name-to-file copy-directory copy-file expand-file-name + '(add-name-to-file copy-directory copy-file file-equal-p file-in-directory-p file-name-all-completions file-name-completion ;; Starting with Emacs 26.1, just the 2nd argument of @@ -2152,6 +2152,13 @@ ARGS are the arguments OPERATION has been called with." ((tramp-tramp-file-p (nth 0 args)) (nth 0 args)) ((tramp-tramp-file-p (nth 1 args)) (nth 1 args)) (t default-directory)))) + ;; FILE DIRECTORY resp FILE1 FILE2. + ((eq operation 'expand-file-name) + (save-match-data + (cond + ((file-name-absolute-p (nth 0 args)) (nth 0 args)) + ((tramp-tramp-file-p (nth 1 args)) (nth 1 args)) + (t default-directory)))) ;; START END FILE. ((eq operation 'write-region) (if (file-name-absolute-p (nth 2 args)) @@ -2255,7 +2262,8 @@ Falls back to normal file name handler if no Tramp file name handler exists." ;; Tramp packages locally. (when (autoloadp sf) (let ((default-directory - (tramp-compat-temporary-file-directory))) + (tramp-compat-temporary-file-directory)) + file-name-handler-alist) (load (cadr sf) 'noerror 'nomessage))) ;; (tramp-message ;; v 4 "Running `%s'..." (cons operation args)) @@ -2349,10 +2357,10 @@ Falls back to normal file name handler if no Tramp file name handler exists." ;;;###autoload (progn (defun tramp-autoload-file-name-handler (operation &rest args) "Load Tramp file name handler, and perform OPERATION." + (tramp-unload-file-name-handlers) (if tramp-mode (let ((default-directory temporary-file-directory)) - (load "tramp" 'noerror 'nomessage)) - (tramp-unload-file-name-handlers)) + (load "tramp" 'noerror 'nomessage))) (apply operation args))) ;; `tramp-autoload-file-name-handler' must be registered before @@ -2396,15 +2404,8 @@ remote file names." (defun tramp-register-file-name-handlers () "Add Tramp file name handlers to `file-name-handler-alist'." ;; Remove autoloaded handlers from file name handler alist. Useful, - ;; if `tramp-syntax' has been changed. We cannot call - ;; `tramp-unload-file-name-handlers', this would result in recursive - ;; loading of Tramp. - (dolist (fnh '(tramp-file-name-handler - tramp-completion-file-name-handler - tramp-archive-file-name-handler - tramp-autoload-file-name-handler)) - (let ((a1 (rassq fnh file-name-handler-alist))) - (setq file-name-handler-alist (delq a1 file-name-handler-alist)))) + ;; if `tramp-syntax' has been changed. + (tramp-unload-file-name-handlers) ;; Add the handlers. We do not add anything to the `operations' ;; property of `tramp-file-name-handler' and @@ -2479,12 +2480,10 @@ Add operations defined in `HANDLER-alist' to `tramp-file-name-handler'." ;;;###autoload (progn (defun tramp-unload-file-name-handlers () "Unload Tramp file name handlers from `file-name-handler-alist'." - (dolist (fnh '(tramp-file-name-handler - tramp-completion-file-name-handler - tramp-archive-file-name-handler - tramp-autoload-file-name-handler)) - (let ((a1 (rassq fnh file-name-handler-alist))) - (setq file-name-handler-alist (delq a1 file-name-handler-alist)))))) + (dolist (fnh file-name-handler-alist) + (when (and (symbolp (cdr fnh)) + (string-prefix-p "tramp-" (symbol-name (cdr fnh)))) + (setq file-name-handler-alist (delq fnh file-name-handler-alist)))))) (add-hook 'tramp-unload-hook 'tramp-unload-file-name-handlers)