Further optimization in Tramp's file name decomposition

* lisp/net/tramp.el (tramp-syntax): Recompute all file name
components.  Call `custom-set-variables' after loading.
(tramp-build-prefix-format, tramp-build-prefix-regexp)
(tramp-build-method-regexp)
(tramp-build-postfix-method-format)
(tramp-build-postfix-method-regexp)
(tramp-build-prefix-ipv6-format)
(tramp-build-prefix-ipv6-regexp)
(tramp-build-postfix-ipv6-format)
(tramp-build-postfix-ipv6-regexp)
(tramp-build-postfix-host-format)
(tramp-build-postfix-host-regexp)
(tramp-build-file-name-regexp)
(tramp-build-completion-file-name-regexp): New defuns.
(tramp-prefix-format, tramp-prefix-regexp)
(tramp-method-regexp, tramp-postfix-method-format)
(tramp-postfix-method-regexp, tramp-prefix-ipv6-format)
(tramp-prefix-ipv6-regexp, tramp-postfix-ipv6-format)
(tramp-postfix-ipv6-regexp, tramp-postfix-host-format)
(tramp-postfix-host-regexp)
(tramp-remote-file-name-spec-regexp)
(tramp-file-name-structure, tramp-file-name-regexp)
(tramp-completion-file-name-regexp): Convert defuns into defvars.
(tramp-prefix-regexp-alist)
(tramp-postfix-method-regexp-alist)
(tramp-prefix-ipv6-regexp-alist)
(tramp-postfix-ipv6-regexp-alist)
(tramp-postfix-host-regexp-alist)
(tramp-remote-file-name-spec-regexp-alist): Remove.
(tramp-build-remote-file-name-spec-regexp)
(tramp-build-file-name-structure): Simplify.
(tramp-completion-file-name-regexp-alist): New defconst.
(tramp-tramp-file-p, tramp-dissect-file-name)
(tramp-make-tramp-file-name)
(tramp-completion-make-tramp-file-name)
(tramp-rfn-eshadow-update-overlay-regexp)
(tramp-register-file-name-handlers)
(tramp-completion-handle-file-name-all-completions)
(tramp-completion-dissect-file-name, tramp-clear-passwd):
* lisp/net/tramp-ftp.el (tramp-ftp-file-name-handler):
* lisp/net/tramp-sh.el (tramp-sh-handle-vc-registered)
(tramp-compute-multi-hops): Use variables but functions for
file name components.

* test/lisp/net/tramp-tests.el (tramp-test24-file-name-completion):
Use variables but functions for file name components.
This commit is contained in:
Michael Albinus 2017-09-11 17:12:32 +02:00
parent 29963648dd
commit 7004545244
4 changed files with 193 additions and 203 deletions

View file

@ -121,10 +121,10 @@ pass to the OPERATION."
(or (boundp 'ange-ftp-name-format)
(let (file-name-handler-alist) (require 'ange-ftp)))
(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))))
(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

View file

@ -3437,7 +3437,7 @@ the result will be a local, non-Tramp, file name."
(let (tramp-vc-registered-file-names
(remote-file-name-inhibit-cache (current-time))
(file-name-handler-alist
`((,(tramp-file-name-regexp) . tramp-vc-file-name-handler))))
`((,tramp-file-name-regexp . tramp-vc-file-name-handler))))
;; Here we collect only file names, which need an operation.
(tramp-with-demoted-errors
@ -4468,7 +4468,7 @@ Goes through the list `tramp-inline-compress-commands'."
(let ((user (tramp-file-name-user item))
(host (tramp-file-name-host item))
(proxy (concat
(tramp-prefix-format) proxy (tramp-postfix-host-format))))
tramp-prefix-format proxy tramp-postfix-host-format)))
(tramp-message
vec 5 "Add proxy (\"%s\" \"%s\" \"%s\")"
(and (stringp host) (regexp-quote host))

View file

@ -689,11 +689,34 @@ Do not change the value by `setq', it must be changed only by
(tramp-cleanup-all-buffers))
;; Set the value:
(set-default symbol value)
;; Reset `tramp-file-name-regexp'.
(setq tramp-file-name-regexp (tramp-file-name-regexp))
;; Reset the depending variables.
(with-no-warnings
(setq tramp-prefix-format (tramp-build-prefix-format)
tramp-prefix-regexp (tramp-build-prefix-regexp)
tramp-method-regexp (tramp-build-method-regexp)
tramp-postfix-method-format (tramp-build-postfix-method-format)
tramp-postfix-method-regexp (tramp-build-postfix-method-regexp)
tramp-prefix-ipv6-format (tramp-build-prefix-ipv6-format)
tramp-prefix-ipv6-regexp (tramp-build-prefix-ipv6-regexp)
tramp-postfix-ipv6-format (tramp-build-postfix-ipv6-format)
tramp-postfix-ipv6-regexp (tramp-build-postfix-ipv6-regexp)
tramp-postfix-host-format (tramp-build-postfix-host-format)
tramp-postfix-host-regexp (tramp-build-postfix-host-regexp)
tramp-remote-file-name-spec-regexp
(tramp-build-remote-file-name-spec-regexp)
tramp-file-name-structure (tramp-build-file-name-structure)
tramp-file-name-regexp (tramp-build-file-name-regexp)
tramp-completion-file-name-regexp
(tramp-build-completion-file-name-regexp)))
;; Rearrange file name handlers.
(tramp-register-file-name-handlers)))
;; Initialize the Tramp syntax variables. We want to override initial
;; values of `tramp-file-name-regexp' and
;; `tramp-completion-file-name-regexp'.
(eval-after-load 'tramp
'(custom-set-variables `(tramp-syntax ',(tramp-compat-tramp-syntax))))
(defun tramp-syntax-values ()
"Return possible values of `tramp-syntax', a list"
(let ((values (cdr (get 'tramp-syntax 'custom-type))))
@ -712,22 +735,19 @@ Raise an error if `tramp-syntax' is invalid."
(separate . "/["))
"Alist mapping Tramp syntax to strings beginning Tramp file names.")
(defun tramp-prefix-format ()
"String matching the very beginning of Tramp file names.
Used in `tramp-make-tramp-file-name'."
(defun tramp-build-prefix-format ()
(tramp-lookup-syntax tramp-prefix-format-alist))
(defconst tramp-prefix-regexp-alist
(mapcar (lambda (x)
(cons (car x) (concat "^" (regexp-quote (cdr x)))))
tramp-prefix-format-alist)
"Alist of regexps matching the beginnings of Tramp file names.
Keyed by Tramp syntax. Derived from `tramp-prefix-format-alist'.")
(defvar tramp-prefix-format (tramp-build-prefix-format)
"String matching the very beginning of Tramp file names.
Used in `tramp-make-tramp-file-name'.")
(defun tramp-prefix-regexp ()
(defun tramp-build-prefix-regexp ()
(concat "^" (regexp-quote tramp-prefix-format)))
(defvar tramp-prefix-regexp (tramp-build-prefix-regexp)
"Regexp matching the very beginning of Tramp file names.
Should always start with \"^\". Derived from `tramp-prefix-format'."
(tramp-lookup-syntax tramp-prefix-regexp-alist))
Should always start with \"^\". Derived from `tramp-prefix-format'.")
(defconst tramp-method-regexp-alist
'((default . "[a-zA-Z0-9-]+")
@ -735,34 +755,33 @@ Should always start with \"^\". Derived from `tramp-prefix-format'."
(separate . "[a-zA-Z0-9-]*"))
"Alist mapping Tramp syntax to regexps matching methods identifiers.")
(defun tramp-method-regexp ()
"Regexp matching methods identifiers.
The `ftp' syntax does not support methods."
(defun tramp-build-method-regexp ()
(tramp-lookup-syntax tramp-method-regexp-alist))
(defvar tramp-method-regexp (tramp-build-method-regexp)
"Regexp matching methods identifiers.
The `ftp' syntax does not support methods.")
(defconst tramp-postfix-method-format-alist
'((default . ":")
(simplified . "")
(separate . "/"))
"Alist mapping Tramp syntax to the delimiter after the method.")
(defun tramp-postfix-method-format ()
"String matching delimiter between method and user or host names.
The `ftp' syntax does not support methods.
Used in `tramp-make-tramp-file-name'."
(defun tramp-build-postfix-method-format ()
(tramp-lookup-syntax tramp-postfix-method-format-alist))
(defconst tramp-postfix-method-regexp-alist
(mapcar (lambda (x)
(cons (car x) (regexp-quote (cdr x))))
tramp-postfix-method-format-alist)
"Alist mapping Tramp syntax to regexp matching delimiter after method.
Derived from `tramp-postfix-method-format-alist'.")
(defvar tramp-postfix-method-format (tramp-build-postfix-method-format)
"String matching delimiter between method and user or host names.
The `ftp' syntax does not support methods.
Used in `tramp-make-tramp-file-name'.")
(defun tramp-postfix-method-regexp ()
(defun tramp-build-postfix-method-regexp ()
(regexp-quote tramp-postfix-method-format))
(defvar tramp-postfix-method-regexp (tramp-build-postfix-method-regexp)
"Regexp matching delimiter between method and user or host names.
Derived from `tramp-postfix-method-format'."
(tramp-lookup-syntax tramp-postfix-method-regexp-alist))
Derived from `tramp-postfix-method-format'.")
(defconst tramp-user-regexp "[^/|: \t]+"
"Regexp matching user names.")
@ -772,8 +791,7 @@ Derived from `tramp-postfix-method-format'."
"String matching delimiter between user and domain names.")
;;;###tramp-autoload
(defconst tramp-prefix-domain-regexp
(regexp-quote tramp-prefix-domain-format)
(defconst tramp-prefix-domain-regexp (regexp-quote tramp-prefix-domain-format)
"Regexp matching delimiter between user and domain names.
Derived from `tramp-prefix-domain-format'.")
@ -790,8 +808,7 @@ Derived from `tramp-prefix-domain-format'.")
"String matching delimiter between user and host names.
Used in `tramp-make-tramp-file-name'.")
(defconst tramp-postfix-user-regexp
(regexp-quote tramp-postfix-user-format)
(defconst tramp-postfix-user-regexp (regexp-quote tramp-postfix-user-format)
"Regexp matching delimiter between user and host names.
Derived from `tramp-postfix-user-format'.")
@ -804,28 +821,24 @@ Derived from `tramp-postfix-user-format'.")
(separate . ""))
"Alist mapping Tramp syntax to strings prefixing IPv6 addresses.")
(defun tramp-prefix-ipv6-format ()
"String matching left hand side of IPv6 addresses.
Used in `tramp-make-tramp-file-name'."
(defun tramp-build-prefix-ipv6-format ()
(tramp-lookup-syntax tramp-prefix-ipv6-format-alist))
(defconst tramp-prefix-ipv6-regexp-alist
(mapcar (lambda (x)
(cons (car x) (regexp-quote (cdr x))))
tramp-prefix-ipv6-format-alist)
"Alist mapping Tramp syntax to regexp matching prefix of IPv6 addresses.
Derived from `tramp-prefix-ipv6-format-alist'")
(defvar tramp-prefix-ipv6-format (tramp-build-prefix-ipv6-format)
"String matching left hand side of IPv6 addresses.
Used in `tramp-make-tramp-file-name'.")
(defun tramp-prefix-ipv6-regexp ()
(defun tramp-build-prefix-ipv6-regexp ()
(regexp-quote tramp-prefix-ipv6-format))
(defvar tramp-prefix-ipv6-regexp (tramp-build-prefix-ipv6-regexp)
"Regexp matching left hand side of IPv6 addresses.
Derived from `tramp-prefix-ipv6-format'."
(tramp-lookup-syntax tramp-prefix-ipv6-regexp-alist))
Derived from `tramp-prefix-ipv6-format'.")
;; The following regexp is a bit sloppy. But it shall serve our
;; purposes. It covers also IPv4 mapped IPv6 addresses, like in
;; "::ffff:192.168.0.1".
(defconst tramp-ipv6-regexp
"\\(?:\\(?:[a-zA-Z0-9]+\\)?:\\)+[a-zA-Z0-9.]+"
(defconst tramp-ipv6-regexp "\\(?:\\(?:[a-zA-Z0-9]+\\)?:\\)+[a-zA-Z0-9.]+"
"Regexp matching IPv6 addresses.")
(defconst tramp-postfix-ipv6-format-alist
@ -834,28 +847,24 @@ Derived from `tramp-prefix-ipv6-format'."
(separate . ""))
"Alist mapping Tramp syntax to suffix for IPv6 addresses.")
(defun tramp-postfix-ipv6-format ()
(defun tramp-build-postfix-ipv6-format ()
(tramp-lookup-syntax tramp-postfix-ipv6-format-alist))
(defvar tramp-postfix-ipv6-format (tramp-build-postfix-ipv6-format)
"String matching right hand side of IPv6 addresses.
Used in `tramp-make-tramp-file-name'."
(tramp-lookup-syntax tramp-postfix-ipv6-format-alist))
Used in `tramp-make-tramp-file-name'.")
(defconst tramp-postfix-ipv6-regexp-alist
(mapcar (lambda (x)
(cons (car x) (regexp-quote (cdr x))))
tramp-postfix-ipv6-format-alist)
"Alist mapping Tramp syntax to regexps matching IPv6 suffixes.
Derived from `tramp-postfix-ipv6-format-alist'.")
(defun tramp-build-postfix-ipv6-regexp ()
(regexp-quote tramp-postfix-ipv6-format))
(defun tramp-postfix-ipv6-regexp ()
(defvar tramp-postfix-ipv6-regexp (tramp-build-postfix-ipv6-regexp)
"Regexp matching right hand side of IPv6 addresses.
Derived from `tramp-postfix-ipv6-format'."
(tramp-lookup-syntax tramp-postfix-ipv6-format-alist))
Derived from `tramp-postfix-ipv6-format'.")
(defconst tramp-prefix-port-format "#"
"String matching delimiter between host names and port numbers.")
(defconst tramp-prefix-port-regexp
(regexp-quote tramp-prefix-port-format)
(defconst tramp-prefix-port-regexp (regexp-quote tramp-prefix-port-format)
"Regexp matching delimiter between host names and port numbers.
Derived from `tramp-prefix-port-format'.")
@ -871,8 +880,7 @@ Derived from `tramp-prefix-port-format'.")
(defconst tramp-postfix-hop-format "|"
"String matching delimiter after ad-hoc hop definitions.")
(defconst tramp-postfix-hop-regexp
(regexp-quote tramp-postfix-hop-format)
(defconst tramp-postfix-hop-regexp (regexp-quote tramp-postfix-hop-format)
"Regexp matching delimiter after ad-hoc hop definitions.
Derived from `tramp-postfix-hop-format'.")
@ -882,22 +890,19 @@ Derived from `tramp-postfix-hop-format'.")
(separate . "]"))
"Alist mapping Tramp syntax to strings between host and local names.")
(defun tramp-postfix-host-format ()
"String matching delimiter between host names and localnames.
Used in `tramp-make-tramp-file-name'."
(defun tramp-build-postfix-host-format ()
(tramp-lookup-syntax tramp-postfix-host-format-alist))
(defconst tramp-postfix-host-regexp-alist
(mapcar (lambda (x)
(cons (car x) (regexp-quote (cdr x))))
tramp-postfix-host-format-alist)
"Alist mapping Tramp syntax to regexp matching name delimiters.
Derived from `tramp-postfix-host-format-alist'.")
(defvar tramp-postfix-host-format (tramp-build-postfix-host-format)
"String matching delimiter between host names and localnames.
Used in `tramp-make-tramp-file-name'.")
(defun tramp-postfix-host-regexp ()
(defun tramp-build-postfix-host-regexp ()
(regexp-quote tramp-postfix-host-format))
(defvar tramp-postfix-host-regexp (tramp-build-postfix-host-regexp)
"Regexp matching delimiter between host names and localnames.
Derived from `tramp-postfix-host-format'."
(tramp-lookup-syntax tramp-postfix-host-regexp-alist))
Derived from `tramp-postfix-host-format'.")
(defconst tramp-localname-regexp ".*$"
"Regexp matching localnames.")
@ -910,48 +915,35 @@ Derived from `tramp-postfix-host-format'."
;;; File name format:
(defun tramp-build-remote-file-name-spec-regexp (syntax)
"Construct a regexp matching a Tramp file name for a Tramp SYNTAX."
(let ((tramp-syntax syntax))
(concat
"\\(" (tramp-method-regexp) "\\)" (tramp-postfix-method-regexp)
"\\(?:" "\\(" tramp-user-regexp "\\)" tramp-postfix-user-regexp "\\)?"
"\\(" "\\(?:" tramp-host-regexp "\\|"
(tramp-prefix-ipv6-regexp)
"\\(?:" tramp-ipv6-regexp "\\)?"
(tramp-postfix-ipv6-regexp) "\\)?"
"\\(?:" tramp-prefix-port-regexp tramp-port-regexp "\\)?" "\\)?")))
(defun tramp-build-remote-file-name-spec-regexp ()
"Construct a regexp matching a Tramp file name for a Tramp syntax.
It is expected, that `tramp-syntax' has the proper value."
(concat
"\\(" tramp-method-regexp "\\)" tramp-postfix-method-regexp
"\\(?:" "\\(" tramp-user-regexp "\\)" tramp-postfix-user-regexp "\\)?"
"\\(" "\\(?:" tramp-host-regexp "\\|"
tramp-prefix-ipv6-regexp "\\(?:" tramp-ipv6-regexp "\\)?"
tramp-postfix-ipv6-regexp "\\)"
"\\(?:" tramp-prefix-port-regexp tramp-port-regexp "\\)?" "\\)?"))
(defconst tramp-remote-file-name-spec-regexp-alist
`((default . ,(tramp-build-remote-file-name-spec-regexp 'default))
(simplified . ,(tramp-build-remote-file-name-spec-regexp 'simplified))
(separate . ,(tramp-build-remote-file-name-spec-regexp 'separate)))
"Alist mapping Tramp syntax to regexps matching Tramp file names.")
(defvar tramp-remote-file-name-spec-regexp
(tramp-build-remote-file-name-spec-regexp)
"Regular expression matching a Tramp file name between prefix and postfix.")
(defun tramp-remote-file-name-spec-regexp ()
"Regular expression matching a Tramp file name between prefix and postfix."
(tramp-lookup-syntax tramp-remote-file-name-spec-regexp-alist))
(defun tramp-build-file-name-structure (syntax)
"Construct the Tramp file name structure for SYNTAX.
(defun tramp-build-file-name-structure ()
"Construct the Tramp file name structure for a Tramp syntax.
It is expected, that `tramp-syntax' has the proper value.
See `tramp-file-name-structure'."
(let ((tramp-syntax syntax))
(list
(concat
(tramp-prefix-regexp)
"\\(" "\\(?:" (tramp-remote-file-name-spec-regexp)
tramp-postfix-hop-regexp "\\)+" "\\)?"
(tramp-remote-file-name-spec-regexp) (tramp-postfix-host-regexp)
"\\(" tramp-localname-regexp "\\)")
5 6 7 8 1)))
(list
(concat
tramp-prefix-regexp
"\\(" "\\(?:" tramp-remote-file-name-spec-regexp
tramp-postfix-hop-regexp "\\)+" "\\)?"
tramp-remote-file-name-spec-regexp tramp-postfix-host-regexp
"\\(" tramp-localname-regexp "\\)")
5 6 7 8 1))
(defconst tramp-file-name-structure-alist
`((default . ,(tramp-build-file-name-structure 'default))
(simplified . ,(tramp-build-file-name-structure 'simplified))
(separate . ,(tramp-build-file-name-structure 'separate)))
"Alist mapping Tramp syntax to the file name structure for that syntax.")
(defun tramp-file-name-structure ()
(defvar tramp-file-name-structure (tramp-build-file-name-structure)
"List of six elements (REGEXP METHOD USER HOST FILE HOP), detailing \
the Tramp file name structure.
@ -969,25 +961,22 @@ cascade of several hops.
These numbers are passed directly to `match-string', which see. That
means the opening parentheses are counted to identify the pair.
See also `tramp-file-name-regexp'."
(tramp-lookup-syntax tramp-file-name-structure-alist))
See also `tramp-file-name-regexp'.")
(defun tramp-file-name-regexp ()
"Regular expression matching file names handled by Tramp.
This regexp should match Tramp file names but no other file names."
(car (tramp-file-name-structure)))
(defun tramp-build-file-name-regexp ()
(car tramp-file-name-structure))
;;;###autoload
(defconst tramp-initial-file-name-regexp "\\`/.+:.*:"
"Value for `tramp-file-name-regexp' for autoload.
It must match the initial `tramp-syntax' settings.")
;; External packages use constant `tramp-file-name-regexp'. In order
;; not to break them, we still provide it. It is a variable now.
;;;###autoload
(defvar tramp-file-name-regexp tramp-initial-file-name-regexp
"Value for `tramp-file-name-regexp' for autoload.
It must match the initial `tramp-syntax' settings.")
"Regular expression matching file names handled by Tramp.
This regexp should match Tramp file names but no other file
names. When calling `tramp-register-file-name-handlers', the
initial value is overwritten by the car of `tramp-file-name-structure'.")
;;;###autoload
(defconst tramp-completion-file-name-regexp-default
@ -1031,7 +1020,17 @@ On W32 systems, the volume letter must be ignored.")
"Value for `tramp-completion-file-name-regexp' for separate remoting.
See `tramp-file-name-structure' for more explanations.")
(defun tramp-completion-file-name-regexp ()
(defconst tramp-completion-file-name-regexp-alist
`((default . ,tramp-completion-file-name-regexp-default)
(simplified . ,tramp-completion-file-name-regexp-simplified)
(separate . ,tramp-completion-file-name-regexp-separate))
"Alist mapping incomplete Tramp file names.")
(defun tramp-build-completion-file-name-regexp ()
(tramp-lookup-syntax tramp-completion-file-name-regexp-alist))
(defvar tramp-completion-file-name-regexp
(tramp-build-completion-file-name-regexp)
"Regular expression matching file names handled by Tramp completion.
This regexp should match partial Tramp file names only.
@ -1040,14 +1039,7 @@ this file \(tramp.el) is loaded. This means that this variable must be set
before loading tramp.el. Alternatively, `file-name-handler-alist' can be
updated after changing this variable.
Also see `tramp-file-name-structure'."
(cond ((eq (tramp-compat-tramp-syntax) 'default)
tramp-completion-file-name-regexp-default)
((eq (tramp-compat-tramp-syntax) 'simplified)
tramp-completion-file-name-regexp-simplified)
((eq (tramp-compat-tramp-syntax) 'separate)
tramp-completion-file-name-regexp-separate)
(t (error "Wrong `tramp-syntax' %s" tramp-syntax))))
Also see `tramp-file-name-structure'.")
;;;###autoload
(defconst tramp-initial-completion-file-name-regexp
@ -1284,7 +1276,7 @@ entry does not exist, return nil."
(if (memq system-type '(cygwin windows-nt))
"^/[[:alpha:]]?:" "^/:")
name))
(string-match (tramp-file-name-regexp) name))))
(string-match tramp-file-name-regexp name))))
(defun tramp-find-method (method user host)
"Return the right method string to use.
@ -1356,13 +1348,13 @@ values."
(save-match-data
(unless (tramp-tramp-file-p name)
(tramp-compat-user-error nil "Not a Tramp file name: \"%s\"" name))
(if (not (string-match (nth 0 (tramp-file-name-structure)) name))
(if (not (string-match (nth 0 tramp-file-name-structure) name))
(error "`tramp-file-name-structure' didn't match!")
(let ((method (match-string (nth 1 (tramp-file-name-structure)) name))
(user (match-string (nth 2 (tramp-file-name-structure)) name))
(host (match-string (nth 3 (tramp-file-name-structure)) name))
(localname (match-string (nth 4 (tramp-file-name-structure)) name))
(hop (match-string (nth 5 (tramp-file-name-structure)) name))
(let ((method (match-string (nth 1 tramp-file-name-structure) name))
(user (match-string (nth 2 tramp-file-name-structure) name))
(host (match-string (nth 3 tramp-file-name-structure) name))
(localname (match-string (nth 4 tramp-file-name-structure) name))
(hop (match-string (nth 5 tramp-file-name-structure) name))
domain port)
(when user
(when (string-match tramp-user-with-domain-regexp user)
@ -1373,9 +1365,9 @@ values."
(when (string-match tramp-host-with-port-regexp host)
(setq port (match-string 2 host)
host (match-string 1 host)))
(when (string-match (tramp-prefix-ipv6-regexp) host)
(when (string-match tramp-prefix-ipv6-regexp host)
(setq host (replace-match "" nil t host)))
(when (string-match (tramp-postfix-ipv6-regexp) host)
(when (string-match tramp-postfix-ipv6-regexp host)
(setq host (replace-match "" nil t host))))
(unless nodefault
@ -1400,42 +1392,41 @@ values."
(method user domain host port localname &optional hop)
"Constructs a Tramp file name from METHOD, USER, HOST and LOCALNAME.
When not nil, optional DOMAIN, PORT and HOP are used."
(concat (tramp-prefix-format) hop
(concat tramp-prefix-format hop
(unless (or (zerop (length method))
(zerop (length (tramp-postfix-method-format))))
(concat method (tramp-postfix-method-format)))
(zerop (length tramp-postfix-method-format)))
(concat method tramp-postfix-method-format))
user
(unless (zerop (length domain))
(concat tramp-prefix-domain-format domain))
(unless (zerop (length user))
tramp-postfix-user-format)
tramp-postfix-user-format)
(when host
(if (string-match tramp-ipv6-regexp host)
(concat
(tramp-prefix-ipv6-format) host (tramp-postfix-ipv6-format))
(concat tramp-prefix-ipv6-format host tramp-postfix-ipv6-format)
host))
(unless (zerop (length port))
(concat tramp-prefix-port-format port))
(tramp-postfix-host-format)
tramp-postfix-host-format
(when localname localname)))
(defun tramp-completion-make-tramp-file-name (method user host localname)
"Constructs a Tramp file name from METHOD, USER, HOST and LOCALNAME.
It must not be a complete Tramp file name, but as long as there are
necessary only. This function will be used in file name completion."
(concat (tramp-prefix-format)
(concat tramp-prefix-format
(unless (or (zerop (length method))
(zerop (length (tramp-postfix-method-format))))
(concat method (tramp-postfix-method-format)))
(zerop (length tramp-postfix-method-format)))
(concat method tramp-postfix-method-format))
(unless (zerop (length user))
(concat user tramp-postfix-user-format))
(unless (zerop (length host))
(concat
(if (string-match tramp-ipv6-regexp host)
(concat
(tramp-prefix-ipv6-format) host (tramp-postfix-ipv6-format))
tramp-prefix-ipv6-format host tramp-postfix-ipv6-format)
host)
(tramp-postfix-host-format)))
tramp-postfix-host-format))
(when localname localname)))
(defun tramp-get-buffer (vec)
@ -1947,7 +1938,7 @@ special handling of `substitute-in-file-name'."
'tramp-rfn-eshadow-setup-minibuffer)))
(defun tramp-rfn-eshadow-update-overlay-regexp ()
(format "[^%s/~]*\\(/\\|~\\)" (tramp-postfix-host-format)))
(format "[^%s/~]*\\(/\\|~\\)" tramp-postfix-host-format))
(defun tramp-rfn-eshadow-update-overlay ()
"Update `rfn-eshadow-overlay' to cover shadowed part of minibuffer input.
@ -2365,11 +2356,11 @@ remote file names."
;; 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))
(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)
(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.
@ -2473,8 +2464,8 @@ not in completion mode."
;; Suppress hop from completion.
(when (string-match
(concat
(tramp-prefix-regexp)
"\\(" "\\(" (tramp-remote-file-name-spec-regexp)
tramp-prefix-regexp
"\\(" "\\(" tramp-remote-file-name-spec-regexp
tramp-postfix-hop-regexp
"\\)+" "\\)")
fullname)
@ -2519,9 +2510,8 @@ not in completion mode."
;; Unify list, add hop, remove nil elements.
(dolist (elt result)
(when elt
(string-match (tramp-prefix-regexp) elt)
(setq elt
(replace-match (concat (tramp-prefix-format) hop) nil nil elt))
(string-match tramp-prefix-regexp elt)
(setq elt (replace-match (concat tramp-prefix-format hop) nil nil elt))
(push
(substring elt (length (tramp-drop-volume-letter directory)))
result1)))
@ -2569,58 +2559,58 @@ They are collected by `tramp-completion-dissect-file-name1'."
(tramp-completion-ipv6-regexp
(format
"[^%s]*"
(if (zerop (length (tramp-postfix-ipv6-format)))
(tramp-postfix-host-format)
(tramp-postfix-ipv6-format))))
(if (zerop (length tramp-postfix-ipv6-format))
tramp-postfix-host-format
tramp-postfix-ipv6-format)))
;; "/method" "/[method"
(tramp-completion-file-name-structure1
(list
(concat
(tramp-prefix-regexp)
"\\(" (tramp-method-regexp) x-nil "\\)$")
tramp-prefix-regexp
"\\(" tramp-method-regexp x-nil "\\)$")
1 nil nil nil))
;; "/method:user" "/[method/user"
(tramp-completion-file-name-structure2
(list
(concat
(tramp-prefix-regexp)
"\\(" (tramp-method-regexp) "\\)" (tramp-postfix-method-regexp)
"\\(" tramp-user-regexp x-nil "\\)$")
tramp-prefix-regexp
"\\(" tramp-method-regexp "\\)" tramp-postfix-method-regexp
"\\(" tramp-user-regexp x-nil "\\)$")
1 2 nil nil))
;; "/method:host" "/[method/host"
(tramp-completion-file-name-structure3
(list
(concat
(tramp-prefix-regexp)
"\\(" (tramp-method-regexp) "\\)" (tramp-postfix-method-regexp)
"\\(" tramp-host-regexp x-nil "\\)$")
tramp-prefix-regexp
"\\(" tramp-method-regexp "\\)" tramp-postfix-method-regexp
"\\(" tramp-host-regexp x-nil "\\)$")
1 nil 2 nil))
;; "/method:[ipv6" "/[method/ipv6"
(tramp-completion-file-name-structure4
(list
(concat
(tramp-prefix-regexp)
"\\(" (tramp-method-regexp) "\\)" (tramp-postfix-method-regexp)
(tramp-prefix-ipv6-regexp)
tramp-prefix-regexp
"\\(" tramp-method-regexp "\\)" tramp-postfix-method-regexp
tramp-prefix-ipv6-regexp
"\\(" tramp-completion-ipv6-regexp x-nil "\\)$")
1 nil 2 nil))
;; "/method:user@host" "/[method/user@host"
(tramp-completion-file-name-structure5
(list
(concat
(tramp-prefix-regexp)
"\\(" (tramp-method-regexp) "\\)" (tramp-postfix-method-regexp)
"\\(" tramp-user-regexp "\\)" tramp-postfix-user-regexp
"\\(" tramp-host-regexp x-nil "\\)$")
tramp-prefix-regexp
"\\(" tramp-method-regexp "\\)" tramp-postfix-method-regexp
"\\(" tramp-user-regexp "\\)" tramp-postfix-user-regexp
"\\(" tramp-host-regexp x-nil "\\)$")
1 2 3 nil))
;; "/method:user@[ipv6" "/[method/user@ipv6"
(tramp-completion-file-name-structure6
(list
(concat
(tramp-prefix-regexp)
"\\(" (tramp-method-regexp) "\\)" (tramp-postfix-method-regexp)
"\\(" tramp-user-regexp "\\)" tramp-postfix-user-regexp
(tramp-prefix-ipv6-regexp)
tramp-prefix-regexp
"\\(" tramp-method-regexp "\\)" tramp-postfix-method-regexp
"\\(" tramp-user-regexp "\\)" tramp-postfix-user-regexp
tramp-prefix-ipv6-regexp
"\\(" tramp-completion-ipv6-regexp x-nil "\\)$")
1 2 3 nil)))
(delq
@ -4479,10 +4469,10 @@ Invokes `password-read' if available, `read-passwd' else."
(tramp-clear-passwd
(tramp-dissect-file-name
(concat
(tramp-prefix-format)
tramp-prefix-format
(replace-regexp-in-string
(concat tramp-postfix-hop-regexp "$")
(tramp-postfix-host-format) hop)))))
tramp-postfix-host-format hop)))))
(auth-source-forget
`(:max 1 ,(and user-domain :user) ,user-domain
:host ,host-port :port ,method))

View file

@ -2852,16 +2852,16 @@ This tests also `make-symbolic-link', `file-truename' and `add-name-to-file'."
(tramp-change-syntax syntax)
(let ;; This is needed for the `simplified' syntax.
((method-marker
(if (zerop (length (tramp-method-regexp)))
(if (zerop (length tramp-method-regexp))
"" tramp-default-method-marker))
;; This is needed for the `separate' syntax.
(prefix-format (substring (tramp-prefix-format) 1)))
(prefix-format (substring tramp-prefix-format 1)))
;; Complete method name.
(unless (or (zerop (length method))
(zerop (length (tramp-method-regexp))))
(zerop (length tramp-method-regexp)))
(should
(member
(concat prefix-format method (tramp-postfix-method-format))
(concat prefix-format method tramp-postfix-method-format)
(file-name-all-completions
(concat prefix-format (substring method 0 1)) "/"))))
;; Complete host name for default method. With gvfs
@ -2873,25 +2873,25 @@ This tests also `make-symbolic-link', `file-truename' and `add-name-to-file'."
(should
(member
(concat
prefix-format method-marker (tramp-postfix-method-format)
host (tramp-postfix-host-format))
prefix-format method-marker tramp-postfix-method-format
host tramp-postfix-host-format)
(file-name-all-completions
(concat
prefix-format method-marker (tramp-postfix-method-format)
prefix-format method-marker tramp-postfix-method-format
(substring host 0 1))
"/")))))
;; Complete host name.
(unless (or (zerop (length method))
(zerop (length (tramp-method-regexp)))
(zerop (length tramp-method-regexp))
(zerop (length host))
(tramp--test-gvfs-p method))
(should
(member
(concat
prefix-format method (tramp-postfix-method-format)
host (tramp-postfix-host-format))
prefix-format method tramp-postfix-method-format
host tramp-postfix-host-format)
(file-name-all-completions
(concat prefix-format method (tramp-postfix-method-format))
(concat prefix-format method tramp-postfix-method-format)
"/"))))))
;; Cleanup.