Improve performance of 'file-name-case-insensitive-p' for Tramp files
Previously, each function in 'tramp-foreign-file-name-handler-alist' would call 'tramp-dissect-file-name', resulting in it being called several times whenever 'tramp-find-foreign-file-name-handler' was called. Now, functions take the dissected file name to avoid this duplicated effort. (Bug#51699) * etc/NEWS: Announce this change. * lisp/net/tramp-adb.el (tramp-adb-file-name-p): * lisp/net/tramp-ftp.el (tramp-ftp-file-name-p): * lisp/net/tramp-gvfs.el (tramp-gvfs-file-name-p): * lisp/net/tramp-rclone.el (tramp-rclone-file-name-p): * lisp/net/tramp-smb.el (tramp-smb-file-name-p): * lisp/net/tramp-sshfs.el (tramp-sshfs-file-name-p): * lisp/net/tramp-sudoedit.el (tramp-sudoedit-file-name-p): Accept dissected file names. * lisp/net/tramp.el (tramp-ensure-dissected-file-name): New function. (tramp-find-foreign-file-name-handler): Pass dissected file name to functions. (tramp-connectable-p): Use 'tramp-ensure-dissected-file-name'.
This commit is contained in:
parent
585e2103df
commit
6c9ac53249
9 changed files with 53 additions and 44 deletions
6
etc/NEWS
6
etc/NEWS
|
@ -532,6 +532,12 @@ get proper locale-dependent downcasing, the string has to be converted
|
|||
to multibyte first. (This goes for the other case-changing functions,
|
||||
too.)
|
||||
|
||||
---
|
||||
** Functions in 'tramp-foreign-file-name-handler-alist' have changed.
|
||||
Functions to determine which Tramp file name handler to use are now
|
||||
passed a file name in dissected form (via 'tramp-dissect-file-name')
|
||||
instead of in string form.
|
||||
|
||||
---
|
||||
** 'def' indentation changes.
|
||||
In 'emacs-lisp-mode', forms with a symbol with a name that start with
|
||||
|
|
|
@ -191,11 +191,10 @@ It is used for TCP/IP devices."
|
|||
;; It must be a `defsubst' in order to push the whole code into
|
||||
;; tramp-loaddefs.el. Otherwise, there would be recursive autoloading.
|
||||
;;;###tramp-autoload
|
||||
(defsubst tramp-adb-file-name-p (filename)
|
||||
"Check if it's a FILENAME for ADB."
|
||||
(and (tramp-tramp-file-p filename)
|
||||
(string= (tramp-file-name-method (tramp-dissect-file-name filename))
|
||||
tramp-adb-method)))
|
||||
(defsubst tramp-adb-file-name-p (vec-or-filename)
|
||||
"Check if it's a VEC-OR-FILENAME for ADB."
|
||||
(when-let* ((vec (tramp-ensure-dissected-file-name vec-or-filename)))
|
||||
(string= (tramp-file-name-method vec) tramp-adb-method)))
|
||||
|
||||
;;;###tramp-autoload
|
||||
(defun tramp-adb-file-name-handler (operation &rest args)
|
||||
|
|
|
@ -175,11 +175,10 @@ pass to the OPERATION."
|
|||
;; It must be a `defsubst' in order to push the whole code into
|
||||
;; tramp-loaddefs.el. Otherwise, there would be recursive autoloading.
|
||||
;;;###tramp-autoload
|
||||
(defsubst tramp-ftp-file-name-p (filename)
|
||||
"Check if it's a FILENAME that should be forwarded to Ange-FTP."
|
||||
(and (tramp-tramp-file-p filename)
|
||||
(string= (tramp-file-name-method (tramp-dissect-file-name filename))
|
||||
tramp-ftp-method)))
|
||||
(defsubst tramp-ftp-file-name-p (vec-or-filename)
|
||||
"Check if it's a VEC-OR-FILENAME that should be forwarded to Ange-FTP."
|
||||
(when-let* ((vec (tramp-ensure-dissected-file-name vec-or-filename)))
|
||||
(string= (tramp-file-name-method vec) tramp-ftp-method)))
|
||||
|
||||
;;;###tramp-autoload
|
||||
(tramp--with-startup
|
||||
|
|
|
@ -834,12 +834,11 @@ Operations not mentioned here will be handled by the default Emacs primitives.")
|
|||
;; It must be a `defsubst' in order to push the whole code into
|
||||
;; tramp-loaddefs.el. Otherwise, there would be recursive autoloading.
|
||||
;;;###tramp-autoload
|
||||
(defsubst tramp-gvfs-file-name-p (filename)
|
||||
"Check if it's a FILENAME handled by the GVFS daemon."
|
||||
(and (tramp-tramp-file-p filename)
|
||||
(let ((method
|
||||
(tramp-file-name-method (tramp-dissect-file-name filename))))
|
||||
(and (stringp method) (member method tramp-gvfs-methods)))))
|
||||
(defsubst tramp-gvfs-file-name-p (vec-or-filename)
|
||||
"Check if it's a VEC-OR-FILENAME handled by the GVFS daemon."
|
||||
(when-let* ((vec (tramp-ensure-dissected-file-name vec-or-filename)))
|
||||
(let ((method (tramp-file-name-method vec)))
|
||||
(and (stringp method) (member method tramp-gvfs-methods)))))
|
||||
|
||||
;;;###tramp-autoload
|
||||
(defun tramp-gvfs-file-name-handler (operation &rest args)
|
||||
|
|
|
@ -156,11 +156,10 @@ Operations not mentioned here will be handled by the default Emacs primitives.")
|
|||
;; It must be a `defsubst' in order to push the whole code into
|
||||
;; tramp-loaddefs.el. Otherwise, there would be recursive autoloading.
|
||||
;;;###tramp-autoload
|
||||
(defsubst tramp-rclone-file-name-p (filename)
|
||||
"Check if it's a FILENAME for rclone."
|
||||
(and (tramp-tramp-file-p filename)
|
||||
(string= (tramp-file-name-method (tramp-dissect-file-name filename))
|
||||
tramp-rclone-method)))
|
||||
(defsubst tramp-rclone-file-name-p (vec-or-filename)
|
||||
"Check if it's a VEC-OR-FILENAME for rclone."
|
||||
(when-let* ((vec (tramp-ensure-dissected-file-name vec-or-filename)))
|
||||
(string= (tramp-file-name-method vec) tramp-rclone-method)))
|
||||
|
||||
;;;###tramp-autoload
|
||||
(defun tramp-rclone-file-name-handler (operation &rest args)
|
||||
|
|
|
@ -330,11 +330,10 @@ This can be used to disable echo etc."
|
|||
;; It must be a `defsubst' in order to push the whole code into
|
||||
;; tramp-loaddefs.el. Otherwise, there would be recursive autoloading.
|
||||
;;;###tramp-autoload
|
||||
(defsubst tramp-smb-file-name-p (filename)
|
||||
"Check if it's a FILENAME for SMB servers."
|
||||
(and (tramp-tramp-file-p filename)
|
||||
(string= (tramp-file-name-method (tramp-dissect-file-name filename))
|
||||
tramp-smb-method)))
|
||||
(defsubst tramp-smb-file-name-p (vec-or-filename)
|
||||
"Check if it's a VEC-OR-FILENAME for SMB servers."
|
||||
(when-let* ((vec (tramp-ensure-dissected-file-name vec-or-filename)))
|
||||
(string= (tramp-file-name-method vec) tramp-smb-method)))
|
||||
|
||||
;;;###tramp-autoload
|
||||
(defun tramp-smb-file-name-handler (operation &rest args)
|
||||
|
|
|
@ -156,11 +156,10 @@ Operations not mentioned here will be handled by the default Emacs primitives.")
|
|||
;; It must be a `defsubst' in order to push the whole code into
|
||||
;; tramp-loaddefs.el. Otherwise, there would be recursive autoloading.
|
||||
;;;###tramp-autoload
|
||||
(defsubst tramp-sshfs-file-name-p (filename)
|
||||
"Check if it's a FILENAME for sshfs."
|
||||
(and (tramp-tramp-file-p filename)
|
||||
(string= (tramp-file-name-method (tramp-dissect-file-name filename))
|
||||
tramp-sshfs-method)))
|
||||
(defsubst tramp-sshfs-file-name-p (vec-or-filename)
|
||||
"Check if it's a VEC-OR-FILENAME for sshfs."
|
||||
(when-let* ((vec (tramp-ensure-dissected-file-name vec-or-filename)))
|
||||
(string= (tramp-file-name-method vec) tramp-sshfs-method)))
|
||||
|
||||
;;;###tramp-autoload
|
||||
(defun tramp-sshfs-file-name-handler (operation &rest args)
|
||||
|
|
|
@ -148,11 +148,10 @@ See `tramp-actions-before-shell' for more info.")
|
|||
;; It must be a `defsubst' in order to push the whole code into
|
||||
;; tramp-loaddefs.el. Otherwise, there would be recursive autoloading.
|
||||
;;;###tramp-autoload
|
||||
(defsubst tramp-sudoedit-file-name-p (filename)
|
||||
"Check if it's a FILENAME for SUDOEDIT."
|
||||
(and (tramp-tramp-file-p filename)
|
||||
(string= (tramp-file-name-method (tramp-dissect-file-name filename))
|
||||
tramp-sudoedit-method)))
|
||||
(defsubst tramp-sudoedit-file-name-p (vec-or-filename)
|
||||
"Check if it's a VEC-OR-FILENAME for SUDOEDIT."
|
||||
(when-let* ((vec (tramp-ensure-dissected-file-name vec-or-filename)))
|
||||
(string= (tramp-file-name-method vec) tramp-sudoedit-method)))
|
||||
|
||||
;;;###tramp-autoload
|
||||
(defun tramp-sudoedit-file-name-handler (operation &rest args)
|
||||
|
|
|
@ -1669,6 +1669,16 @@ default values are used."
|
|||
|
||||
(put #'tramp-dissect-file-name 'tramp-suppress-trace t)
|
||||
|
||||
(defun tramp-ensure-dissected-file-name (vec-or-filename)
|
||||
"Return a `tramp-file-name' structure for VEC-OR-FILENAME.
|
||||
|
||||
VEC-OR-FILENAME may be either a string or a `tramp-file-name'.
|
||||
If it's not a Tramp filename, return nil."
|
||||
(cond
|
||||
((tramp-file-name-p vec-or-filename) vec-or-filename)
|
||||
((tramp-tramp-file-p vec-or-filename)
|
||||
(tramp-dissect-file-name vec-or-filename))))
|
||||
|
||||
(defun tramp-dissect-hop-name (name &optional nodefault)
|
||||
"Return a `tramp-file-name' structure of `hop' part of NAME.
|
||||
See `tramp-dissect-file-name' for details."
|
||||
|
@ -2552,11 +2562,14 @@ Must be handled by the callers."
|
|||
"Return foreign file name handler if exists."
|
||||
(when (tramp-tramp-file-p filename)
|
||||
(let ((handler tramp-foreign-file-name-handler-alist)
|
||||
(vec (tramp-dissect-file-name filename))
|
||||
elt res)
|
||||
(while handler
|
||||
(setq elt (car handler)
|
||||
handler (cdr handler))
|
||||
(when (funcall (car elt) filename)
|
||||
;; Previously, this function was called with FILENAME, but now
|
||||
;; it's called with the VEC.
|
||||
(when (with-demoted-errors "Error: %S" (funcall (car elt) vec))
|
||||
(setq handler nil
|
||||
res (cdr elt))))
|
||||
res)))
|
||||
|
@ -2755,8 +2768,9 @@ remote file names."
|
|||
(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'."
|
||||
FUNC is the function, which takes a dissected filename and 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.
|
||||
|
@ -2814,11 +2828,7 @@ They are completed by \"M-x TAB\" only if the current buffer is remote."
|
|||
This is true, if either the remote host is already connected, or if we are
|
||||
not in completion mode."
|
||||
(let ((tramp-verbose 0)
|
||||
(vec
|
||||
(cond
|
||||
((tramp-file-name-p vec-or-filename) vec-or-filename)
|
||||
((tramp-tramp-file-p vec-or-filename)
|
||||
(tramp-dissect-file-name vec-or-filename)))))
|
||||
(vec (tramp-ensure-dissected-file-name vec-or-filename)))
|
||||
(or ;; We check this for the process related to
|
||||
;; `tramp-buffer-name'; otherwise `start-file-process'
|
||||
;; wouldn't run ever when `non-essential' is non-nil.
|
||||
|
|
Loading…
Add table
Reference in a new issue