Fix Bug#26258
* lisp/net/tramp-adb.el (tramp-adb-file-name-handler-alist): * lisp/net/tramp-gvfs.el (tramp-gvfs-file-name-handler-alist): * lisp/net/tramp-sh.el (tramp-sh-file-name-handler-alist): * lisp/net/tramp-smb.el (tramp-smb-file-name-handler-alist): Autoload. Call `tramp-register-foreign-file-name-handler'. (Bug#26258) * lisp/net/tramp.el (tramp-autoload-file-name-handler): Remove. (tramp-register-autoload-file-name-handlers) (tramp-register-file-name-handlers): Do not handle `tramp-autoload-file-name-handler' anymore. Mark `operations' the handlers are responsible for. (tramp-register-foreign-file-name-handler): New defun.
This commit is contained in:
parent
082e2cb3f4
commit
8884baf3c8
5 changed files with 57 additions and 46 deletions
|
@ -94,9 +94,6 @@ It is used for TCP/IP devices."
|
|||
tramp-adb-method '((tramp-adb-parse-device-names ""))))
|
||||
|
||||
;;;###tramp-autoload
|
||||
(add-to-list 'tramp-foreign-file-name-handler-alist
|
||||
(cons 'tramp-adb-file-name-p 'tramp-adb-file-name-handler))
|
||||
|
||||
(defconst tramp-adb-file-name-handler-alist
|
||||
'((access-file . ignore)
|
||||
(add-name-to-file . tramp-adb-handle-copy-file)
|
||||
|
@ -189,6 +186,10 @@ pass to the OPERATION."
|
|||
(save-match-data (apply (cdr fn) args))
|
||||
(tramp-run-real-handler operation args))))
|
||||
|
||||
;;;###tramp-autoload
|
||||
(tramp-register-foreign-file-name-handler
|
||||
'tramp-adb-file-name-p 'tramp-adb-file-name-handler)
|
||||
|
||||
;;;###tramp-autoload
|
||||
(defun tramp-adb-parse-device-names (_ignore)
|
||||
"Return a list of (nil host) tuples allowed to access."
|
||||
|
|
|
@ -452,6 +452,7 @@ Every entry is a list (NAME ADDRESS).")
|
|||
|
||||
|
||||
;; New handlers should be added here.
|
||||
;;;###tramp-autoload
|
||||
(defconst tramp-gvfs-file-name-handler-alist
|
||||
'((access-file . ignore)
|
||||
(add-name-to-file . tramp-gvfs-handle-copy-file)
|
||||
|
@ -548,12 +549,10 @@ pass to the OPERATION."
|
|||
(save-match-data (apply (cdr fn) args))
|
||||
(tramp-run-real-handler operation args))))
|
||||
|
||||
;; This might be moved to tramp.el. It shall be the first file name
|
||||
;; handler.
|
||||
;;;###tramp-autoload
|
||||
(when (featurep 'dbusbind)
|
||||
(add-to-list 'tramp-foreign-file-name-handler-alist
|
||||
(cons 'tramp-gvfs-file-name-p 'tramp-gvfs-file-name-handler)))
|
||||
(tramp-register-foreign-file-name-handler
|
||||
'tramp-gvfs-file-name-p 'tramp-gvfs-file-name-handler))
|
||||
|
||||
|
||||
;; D-Bus helper function.
|
||||
|
|
|
@ -981,6 +981,7 @@ here-document, otherwise the command could exceed maximum length
|
|||
of command line.")
|
||||
|
||||
;; New handlers should be added here.
|
||||
;;;###tramp-autoload
|
||||
(defconst tramp-sh-file-name-handler-alist
|
||||
'(;; `access-file' performed by default handler.
|
||||
(add-name-to-file . tramp-sh-handle-add-name-to-file)
|
||||
|
@ -1054,11 +1055,6 @@ of command line.")
|
|||
"Alist of handler functions.
|
||||
Operations not mentioned here will be handled by the normal Emacs functions.")
|
||||
|
||||
;; This must be the last entry, because `identity' always matches.
|
||||
;;;###tramp-autoload
|
||||
(add-to-list 'tramp-foreign-file-name-handler-alist
|
||||
'(identity . tramp-sh-file-name-handler) 'append)
|
||||
|
||||
;;; File Name Handler Functions:
|
||||
|
||||
(defun tramp-sh-handle-make-symbolic-link
|
||||
|
@ -3536,6 +3532,11 @@ Fall back to normal file name handler if no Tramp handler exists."
|
|||
(tramp-run-real-handler operation args)))))
|
||||
(setq tramp-locked tl))))
|
||||
|
||||
;; This must be the last entry, because `identity' always matches.
|
||||
;;;###tramp-autoload
|
||||
(tramp-register-foreign-file-name-handler
|
||||
'identity 'tramp-sh-file-name-handler 'append)
|
||||
|
||||
(defun tramp-vc-file-name-handler (operation &rest args)
|
||||
"Invoke special file name handler, which collects files to be handled."
|
||||
(save-match-data
|
||||
|
|
|
@ -217,6 +217,7 @@ This list is used for smbcacls actions.
|
|||
See `tramp-actions-before-shell' for more info.")
|
||||
|
||||
;; New handlers should be added here.
|
||||
;;;###tramp-autoload
|
||||
(defconst tramp-smb-file-name-handler-alist
|
||||
'(;; `access-file' performed by default handler.
|
||||
(add-name-to-file . tramp-smb-handle-add-name-to-file)
|
||||
|
@ -340,9 +341,8 @@ pass to the OPERATION."
|
|||
|
||||
;;;###tramp-autoload
|
||||
(unless (memq system-type '(cygwin windows-nt))
|
||||
(add-to-list 'tramp-foreign-file-name-handler-alist
|
||||
(cons 'tramp-smb-file-name-p 'tramp-smb-file-name-handler)))
|
||||
|
||||
(tramp-register-foreign-file-name-handler
|
||||
'tramp-smb-file-name-p 'tramp-smb-file-name-handler))
|
||||
|
||||
;; File name primitives.
|
||||
|
||||
|
|
|
@ -2121,41 +2121,26 @@ Falls back to normal file name handler if no Tramp file name handler exists."
|
|||
(save-match-data (apply (cdr fn) args))
|
||||
(tramp-run-real-handler operation args))))
|
||||
|
||||
;; Mark `operations' the handler is responsible for.
|
||||
;;;###autoload
|
||||
(put 'tramp-completion-file-name-handler 'operations
|
||||
(mapcar 'car tramp-completion-file-name-handler-alist))
|
||||
|
||||
;;;###autoload
|
||||
(progn (defun tramp-autoload-file-name-handler (operation &rest args)
|
||||
"Load Tramp file name handler, and perform OPERATION."
|
||||
(if (and
|
||||
;; Do not load tramp.el just for "/".
|
||||
(not (and (stringp (car args)) (string-equal (car args) "/")))
|
||||
;; Avoid recursive loading of tramp.el.
|
||||
(let ((default-directory temporary-file-directory))
|
||||
(and (null load-in-progress) (load "tramp" 'noerror 'nomessage))))
|
||||
(apply operation args)
|
||||
;; tramp.el not needed or not available for loading, fall back.
|
||||
(tramp-run-real-handler operation args))))
|
||||
|
||||
;; `tramp-autoload-file-name-handler' must be registered before
|
||||
;; evaluation of site-start and init files, because there might exist
|
||||
;; remote files already, f.e. files kept via recentf-mode. We cannot
|
||||
;; autoload `tramp-file-name-handler', because it would result in
|
||||
;; recursive loading of tramp.el when `default-directory' is set to
|
||||
;; remote.
|
||||
;; `tramp-file-name-handler' must be registered before evaluation of
|
||||
;; site-start and init files, because there might exist remote files
|
||||
;; already, f.e. files kept via recentf-mode.
|
||||
;;;###autoload
|
||||
(progn (defun tramp-register-autoload-file-name-handlers ()
|
||||
"Add Tramp file name handlers to `file-name-handler-alist' during autoload."
|
||||
(add-to-list 'file-name-handler-alist
|
||||
(cons tramp-file-name-regexp
|
||||
'tramp-autoload-file-name-handler))
|
||||
(put 'tramp-autoload-file-name-handler 'safe-magic t)
|
||||
(cons tramp-file-name-regexp 'tramp-file-name-handler))
|
||||
(put 'tramp-file-name-handler 'safe-magic t)
|
||||
;; Mark `operations' the handler is responsible for. It's a short list ...
|
||||
(put 'tramp-file-name-handler 'operations
|
||||
'(file-name-all-completions file-name-completion file-remote-p))
|
||||
|
||||
(add-to-list 'file-name-handler-alist
|
||||
(cons tramp-completion-file-name-regexp
|
||||
'tramp-completion-file-name-handler))
|
||||
(put 'tramp-completion-file-name-handler 'safe-magic t)))
|
||||
(put 'tramp-completion-file-name-handler 'safe-magic t)
|
||||
;; Mark `operations' the handler is responsible for.
|
||||
(put 'tramp-completion-file-name-handler 'operations
|
||||
(mapcar 'car tramp-completion-file-name-handler-alist))))
|
||||
|
||||
;;;###autoload
|
||||
(tramp-register-autoload-file-name-handlers)
|
||||
|
@ -2165,22 +2150,29 @@ Falls back to normal file name handler if no Tramp file name handler exists."
|
|||
;; Remove autoloaded handlers from file name handler alist. Useful,
|
||||
;; if `tramp-syntax' has been changed.
|
||||
(dolist (fnh '(tramp-file-name-handler
|
||||
tramp-completion-file-name-handler
|
||||
tramp-autoload-file-name-handler))
|
||||
tramp-completion-file-name-handler))
|
||||
(let ((a1 (rassq fnh file-name-handler-alist)))
|
||||
(setq file-name-handler-alist (delq a1 file-name-handler-alist))))
|
||||
|
||||
;; The initial value of `tramp-file-name-regexp' is too simple
|
||||
;; minded, but we cannot give it the real value in the autoload
|
||||
;; pattern. See Bug#24889.
|
||||
(setq tramp-file-name-regexp (car tramp-file-name-structure))
|
||||
;; Add the handlers.
|
||||
;; Add the handlers. We do not add anything to the `operations'
|
||||
;; property of `tramp-file-name-handler', this shall be done by the
|
||||
;; respective foreign handlers.
|
||||
(add-to-list 'file-name-handler-alist
|
||||
(cons tramp-file-name-regexp 'tramp-file-name-handler))
|
||||
(put 'tramp-file-name-handler 'safe-magic t)
|
||||
|
||||
(add-to-list 'file-name-handler-alist
|
||||
(cons tramp-completion-file-name-regexp
|
||||
'tramp-completion-file-name-handler))
|
||||
(put 'tramp-completion-file-name-handler 'safe-magic t)
|
||||
;; Mark `operations' the handler is responsible for.
|
||||
(put 'tramp-completion-file-name-handler 'operations
|
||||
(mapcar 'car tramp-completion-file-name-handler-alist))
|
||||
|
||||
;; If jka-compr or epa-file are already loaded, move them to the
|
||||
;; front of `file-name-handler-alist'.
|
||||
(dolist (fnh '(epa-file-handler jka-compr-handler))
|
||||
|
@ -2191,6 +2183,24 @@ Falls back to normal file name handler if no Tramp file name handler exists."
|
|||
|
||||
(eval-after-load 'tramp (tramp-register-file-name-handlers))
|
||||
|
||||
;;;###tramp-autoload
|
||||
(progn (defun tramp-register-foreign-file-name-handler
|
||||
(func handler &optional append)
|
||||
"Register (FUNC . HANDLER) in `tramp-foreign-file-name-handler-alist'.
|
||||
FUNC is the function, which determines whether HANDLER is to be called.
|
||||
Add operations defined in `HANDLER-alist' to `tramp-file-name-handler'."
|
||||
(add-to-list
|
||||
'tramp-foreign-file-name-handler-alist `(,func . ,handler) append)
|
||||
;; Mark `operations' the handler is responsible for.
|
||||
(put 'tramp-file-name-handler
|
||||
'operations
|
||||
(cl-delete-duplicates
|
||||
(append
|
||||
(get 'tramp-file-name-handler 'operations)
|
||||
(mapcar
|
||||
'car
|
||||
(symbol-value (intern (concat (symbol-name handler) "-alist")))))))))
|
||||
|
||||
(defun tramp-exists-file-name-handler (operation &rest args)
|
||||
"Check, whether OPERATION runs a file name handler."
|
||||
;; The file name handler is determined on base of either an
|
||||
|
|
Loading…
Add table
Reference in a new issue