emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master 67d3b40: Expand host names in Tramp's ad-hoc multi-


From: Michael Albinus
Subject: [Emacs-diffs] master 67d3b40: Expand host names in Tramp's ad-hoc multi-hop file names
Date: Sat, 20 Oct 2018 07:38:41 -0400 (EDT)

branch: master
commit 67d3b40e0cba5f34b1c7aacc4e1ccea6300eae76
Author: Michael Albinus <address@hidden>
Commit: Michael Albinus <address@hidden>

    Expand host names in Tramp's ad-hoc multi-hop file names
    
    * doc/misc/tramp.texi (Quick Start Guide): Improve wording.
    (Change file name syntax): Say, that `tramp-file-name-regexp' is
    not constant.
    (Ad-hoc multi-hops): Explain host name expansion.
    
    * etc/NEWS: Mention that host names in Tramp ad-hoc multi-hop file
    names must match the previous hop for methods like "su" or "sudo".
    Fix typos.
    
    * lisp/net/tramp.el (tramp-find-method, tramp-find-user):
    Adapt docstring.
    (tramp-find-host): Mark default value.
    (tramp-dissect-file-name): Expand host name for hops.
    (tramp-dissect-hop-name, tramp-make-tramp-hop-name): New defuns.
    (tramp-clear-passwd): Simplify.
    
    * test/lisp/net/tramp-tests.el (tramp-test02-file-name-dissect)
    (tramp-test02-file-name-dissect-simplified)
    (tramp-test02-file-name-dissect-separate)
    (tramp-test26-file-name-completion): Extend tests.
---
 doc/misc/tramp.texi          |  26 ++++++---
 etc/NEWS                     |  12 ++--
 lisp/net/tramp.el            |  80 +++++++++++++++++---------
 test/lisp/net/tramp-tests.el | 131 +++++++++++++++++++++++++++++++++++--------
 4 files changed, 188 insertions(+), 61 deletions(-)

diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi
index 7c5ebf3..128501c 100644
--- a/doc/misc/tramp.texi
+++ b/doc/misc/tramp.texi
@@ -464,7 +464,7 @@ this case it is written as @code{host#port}.
 @cindex @option{plink} method
 
 If your local host runs an SSH client, and the remote host runs an SSH
-server, the most simple remote file name is
+server, the simplest remote file name is
 @address@hidden,user@@host,/path/to/file}}.  The remote file name
 @address@hidden,,}} opens a remote connection to yourself on the
 local host, and is taken often for testing @value{tramp}.
@@ -2459,9 +2459,10 @@ and @code{user@@} parts are optional.
 
 @defvar tramp-file-name-regexp
 This variable keeps a regexp which matches the selected remote file
-name syntax.  However, it is not recommended to use this variable in
-external packages, a call of @code{file-remote-p} is much more
-appropriate.
+name syntax.  Its value changes after every call of
address@hidden  However, it is not recommended to use
+this variable in external packages, a call of @code{file-remote-p} is
+much more appropriate.
 @ifinfo
 @pxref{Magic File Names, , , elisp}
 @end ifinfo
@@ -2585,9 +2586,9 @@ directory contents.
 @cindex multi-hop, ad-hoc
 @cindex proxy hosts, ad-hoc
 
address@hidden file name syntax can accommodate ad hoc specification of
address@hidden file name syntax can accommodate ad-hoc specification of
 multiple proxies without using @code{tramp-default-proxies-alist}
-configuration setup(@pxref{Multi-hops}).
+configuration setup (@pxref{Multi-hops}).
 
 Each proxy is specified using the same syntax as the remote host
 specification minus the file name part.  Each hop is separated by a
@@ -2600,8 +2601,6 @@ proxy @samp{bird@@bastion} to a remote file on 
@samp{you@@remotehost}:
 @kbd{C-x C-f @address@hidden@@bastion|address@hidden@@address@hidden/path 
@key{RET}}
 @end example
 
-Proxies can take patterns @code{%h} or @code{%u}.
-
 @value{tramp} adds the ad-hoc definitions on the fly to
 @code{tramp-default-proxies-alist} and is available for re-use
 during that Emacs session.  Subsequent @value{tramp} connections to
@@ -2618,6 +2617,17 @@ For ad-hoc definitions to be saved automatically in
 @end lisp
 @end defopt
 
+Ad-hoc proxies can take patterns @code{%h} or @code{%u} like in
address@hidden  The following file name expands
+to user @code{root} on host @code{remotehost}, starting with an
address@hidden session on host @code{remotehost}:
address@hidden@address@hidden|address@hidden@value{postfix}}.
+
+On the other hand, if a trailing hop does not specifiy a host name,
+the host name of the previous hop is reused. Therefore, the following
+file name is equivalent to the previous example:
address@hidden@address@hidden|address@hidden@value{postfix}}.
+
 
 @node Remote processes
 @section Integration with other Emacs packages
diff --git a/etc/NEWS b/etc/NEWS
index 09f0362..be6668e 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -172,7 +172,7 @@ the data.
 
 +++
 ** The Network Security Manager now allows more fine-grained control
-of what checks to run via the `network-security-protocol-checks'
+of what checks to run via the 'network-security-protocol-checks'
 variable.
 
 +++
@@ -356,7 +356,7 @@ shown in the currently selected window.
 ** Comint
 
 +++
-*** 'send-invisible' is now an obsolete alias for `comint-send-invisible'.
+*** 'send-invisible' is now an obsolete alias for 'comint-send-invisible'.
 Also, 'shell-strip-ctrl-m' is declared obsolete.
 
 +++
@@ -391,7 +391,7 @@ facilities to aid more casual SQL developers layout queries 
and
 complex expressions.
 
 *** 'sql-use-indent-support' (default t) enables SQL indention support.
-The `sql-indent' package from ELPA must be installed to get the
+The 'sql-indent' package from ELPA must be installed to get the
 indentation support in 'sql-mode' and 'sql-interactive-mode'.
 
 *** 'sql-mode-hook' and 'sql-interactive-mode-hook' changed.
@@ -420,7 +420,7 @@ This enables more efficient backends.  See the docstring of
 
 ** Package
 
-*** New function `package-get-version` lets packages query their own version.
+*** New function 'package-get-version' lets packages query their own version.
 Example use in auctex.el: (defconst auctex-version (package-get-version))
 
 *** New 'package-quickstart' feature.
@@ -747,6 +747,10 @@ are obsoleted in GVFS.
 *** The user option 'tramp-ignored-file-name-regexp' allows to disable
 Tramp for some look-alike remote file names.
 
++++
+*** For some connection methods, like "su" or "sudo", the host name in
+ad-hoc multi-hop file names must match the previous hop.
+
 ** Register
 ---
 *** The return value of method 'register-val-describe' includes the
diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index e629ce1..2e6cdf9 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -1267,7 +1267,7 @@ entry does not exist, return nil."
 (defun tramp-find-method (method user host)
   "Return the right method string to use.
 This is METHOD, if non-nil. Otherwise, do a lookup in
-`tramp-default-method-alist'."
+`tramp-default-method-alist' and `tramp-default-method'."
   (when (and method
             (or (string-equal method "")
                 (string-equal method tramp-default-method-marker)))
@@ -1292,7 +1292,7 @@ This is METHOD, if non-nil. Otherwise, do a lookup in
 (defun tramp-find-user (method user host)
   "Return the right user string to use.
 This is USER, if non-nil. Otherwise, do a lookup in
-`tramp-default-user-alist'."
+`tramp-default-user-alist' and `tramp-default-user'."
   (let ((result
         (or user
             (let ((choices tramp-default-user-alist)
@@ -1312,18 +1312,24 @@ This is USER, if non-nil. Otherwise, do a lookup in
 
 (defun tramp-find-host (method user host)
   "Return the right host string to use.
-This is HOST, if non-nil. Otherwise, it is `tramp-default-host'."
-  (or (and (> (length host) 0) host)
-      (let ((choices tramp-default-host-alist)
-           lhost item)
-       (while choices
-         (setq item (pop choices))
-         (when (and (string-match (or (nth 0 item) "") (or method ""))
-                    (string-match (or (nth 1 item) "") (or user "")))
-           (setq lhost (nth 2 item))
-           (setq choices nil)))
-       lhost)
-      tramp-default-host))
+This is HOST, if non-nil. Otherwise, do a lookup in
+`tramp-default-host-alist' and `tramp-default-host'."
+  (let ((result
+        (or (and (> (length host) 0) host)
+            (let ((choices tramp-default-host-alist)
+                  lhost item)
+              (while choices
+                (setq item (pop choices))
+                (when (and (string-match (or (nth 0 item) "") (or method ""))
+                           (string-match (or (nth 1 item) "") (or user "")))
+                  (setq lhost (nth 2 item))
+                  (setq choices nil)))
+              lhost)
+            tramp-default-host)))
+    ;; We must mark, whether a default value has been used.
+    (if (or (> (length host) 0) (null result))
+       result
+      (propertize result 'tramp-default t))))
 
 (defun tramp-dissect-file-name (name &optional nodefault)
   "Return a `tramp-file-name' structure of NAME, a remote file name.
@@ -1343,7 +1349,7 @@ default values are used."
            (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)
+           domain port v)
        (when user
          (when (string-match tramp-user-with-domain-regexp user)
            (setq domain (match-string 2 user)
@@ -1359,14 +1365,34 @@ default values are used."
            (setq host (replace-match "" nil t host))))
 
        (unless nodefault
-         (setq method (tramp-find-method method user host)
-               user (tramp-find-user method user host)
-               host (tramp-find-host method user host)))
+         (when hop
+           (setq v (tramp-dissect-hop-name hop)
+                 hop (and hop (tramp-make-tramp-hop-name v))))
+         (let ((tramp-default-host
+                (or (and v (not (string-match "%h" (tramp-file-name-host v)))
+                         (tramp-file-name-host v))
+                    tramp-default-host)))
+           (setq method (tramp-find-method method user host)
+                 user (tramp-find-user method user host)
+                 host (tramp-find-host method user host)
+                 hop
+                 (and hop
+                      (format-spec hop (format-spec-make ?h host ?u user))))))
 
        (make-tramp-file-name
         :method method :user user :domain domain :host host :port port
         :localname localname :hop hop)))))
 
+(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."
+  (tramp-dissect-file-name
+   (concat
+    tramp-prefix-format
+    (replace-regexp-in-string
+     (concat tramp-postfix-hop-regexp "$") tramp-postfix-host-format name))
+   nodefault))
+
 (defun tramp-buffer-name (vec)
   "A name for the connection buffer VEC."
   (let ((method (tramp-file-name-method vec))
@@ -1433,6 +1459,14 @@ the form (METHOD USER DOMAIN HOST PORT LOCALNAME 
&optional HOP)."
            tramp-postfix-host-format
            localname)))
 
+(defun tramp-make-tramp-hop-name (vec)
+  "Construct a Tramp hop name from VEC."
+  (replace-regexp-in-string
+   tramp-prefix-regexp ""
+   (replace-regexp-in-string
+    (concat tramp-postfix-host-regexp "$") tramp-postfix-hop-format
+    (tramp-make-tramp-file-name vec 'noloc))))
+
 (defun tramp-completion-make-tramp-file-name (method user host localname)
   "Construct 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
@@ -2313,7 +2347,7 @@ Falls back to normal file name handler if no Tramp file 
name handler exists."
                       (tramp-message
                        v 1 "Interrupt received in operation %s"
                        (cons operation args)))
-                    ;; Propagate the quit signal.
+                    ;; Propagate the signal.
                     (signal (car err) (cdr err)))
 
                    ;; When we are in completion mode, some failed
@@ -4508,13 +4542,7 @@ Invokes `password-read' if available, `read-passwd' 
else."
        (hop (tramp-file-name-hop vec)))
     (when hop
       ;; Clear also the passwords of the hops.
-      (tramp-clear-passwd
-       (tramp-dissect-file-name
-       (concat
-        tramp-prefix-format
-        (replace-regexp-in-string
-         (concat tramp-postfix-hop-regexp "$")
-         tramp-postfix-host-format hop)))))
+      (tramp-clear-passwd (tramp-dissect-hop-name hop)))
     (auth-source-forget
      `(:max 1 ,(and user-domain :user) ,user-domain
        :host ,host-port :port ,method))
diff --git a/test/lisp/net/tramp-tests.el b/test/lisp/net/tramp-tests.el
index 6a08cbb..ceda709 100644
--- a/test/lisp/net/tramp-tests.el
+++ b/test/lisp/net/tramp-tests.el
@@ -763,8 +763,8 @@ handled properly.  BODY shall not contain a timeout."
        "|-:address@hidden"
        "|-:address@hidden:/path/to/file"))
       (format "/%s:address@hidden|%s:address@hidden|%s:address@hidden:"
-             "-" "user1" "host1"
-             "-" "user2" "host2"
+             "method1" "user1" "host1"
+             "method2" "user2" "host2"
              "method3" "user3" "host3")))
 
     ;; Expand `tramp-default-user-alist'.
@@ -778,9 +778,9 @@ handled properly.  BODY shall not contain a timeout."
        "/method1:host1"
        "|method2:host2"
        "|method3:host3:/path/to/file"))
-      (format "/%s:%s|%s:%s|%s:address@hidden:"
-             "method1" "host1"
-             "method2" "host2"
+      (format "/%s:address@hidden|%s:address@hidden|%s:address@hidden:"
+             "method1" "user1" "host1"
+             "method2" "user2" "host2"
              "method3" "user3" "host3")))
 
     ;; Expand `tramp-default-host-alist'.
@@ -794,9 +794,36 @@ handled properly.  BODY shall not contain a timeout."
        "/method1:user1@"
        "|method2:user2@"
        "|method3:user3@:/path/to/file"))
-      (format "/%s:%s@|%s:%s@|%s:address@hidden:"
-             "method1" "user1"
-             "method2" "user2"
+      (format "/%s:address@hidden|%s:address@hidden|%s:address@hidden:"
+             "method1" "user1" "host1"
+             "method2" "user2" "host2"
+             "method3" "user3" "host3")))
+
+    ;; Ad-hoc user name and host name expansion.
+    (setq tramp-default-method-alist nil
+         tramp-default-user-alist nil
+         tramp-default-host-alist nil)
+    (should
+     (string-equal
+      (file-remote-p
+       (concat
+       "/method1:address@hidden"
+       "|method2:user2@"
+       "|method3:user3@:/path/to/file"))
+      (format "/%s:address@hidden|%s:address@hidden|%s:address@hidden:"
+             "method1" "user1" "host1"
+             "method2" "user2" "host1"
+             "method3" "user3" "host1")))
+    (should
+     (string-equal
+      (file-remote-p
+       (concat
+       "/method1:address@hidden"
+       "|method2:address@hidden"
+       "|method3:address@hidden:/path/to/file"))
+      (format "/%s:address@hidden|%s:address@hidden|%s:address@hidden:"
+             "method1" "user3" "host3"
+             "method2" "user3" "host3"
              "method3" "user3" "host3")))))
 
 (ert-deftest tramp-test02-file-name-dissect-simplified ()
@@ -1067,9 +1094,9 @@ handled properly.  BODY shall not contain a timeout."
              "/host1"
              "|host2"
              "|host3:/path/to/file"))
-           (format "/%s|%s|address@hidden:"
-                   "host1"
-                   "host2"
+           (format "/address@hidden|address@hidden|address@hidden:"
+                   "user1" "host1"
+                   "user2" "host2"
                    "user3" "host3")))
 
          ;; Expand `tramp-default-host-alist'.
@@ -1083,9 +1110,35 @@ handled properly.  BODY shall not contain a timeout."
              "/user1@"
              "|user2@"
              "|user3@:/path/to/file"))
-           (format "/%s@|%s@|address@hidden:"
-                   "user1"
-                   "user2"
+           (format "/address@hidden|address@hidden|address@hidden:"
+                   "user1" "host1"
+                   "user2" "host2"
+                   "user3" "host3")))
+
+         ;; Ad-hoc user name and host name expansion.
+         (setq tramp-default-user-alist nil
+               tramp-default-host-alist nil)
+         (should
+          (string-equal
+           (file-remote-p
+            (concat
+             "/address@hidden"
+             "|user2@"
+             "|user3@:/path/to/file"))
+           (format "/address@hidden|address@hidden|address@hidden:"
+                   "user1" "host1"
+                   "user2" "host1"
+                   "user3" "host1")))
+         (should
+          (string-equal
+           (file-remote-p
+            (concat
+             "/address@hidden"
+             "|address@hidden"
+             "|address@hidden:/path/to/file"))
+           (format "/address@hidden|address@hidden|address@hidden:"
+                   "user3" "host3"
+                   "user3" "host3"
                    "user3" "host3"))))
 
       ;; Exit.
@@ -1670,9 +1723,9 @@ handled properly.  BODY shall not contain a timeout."
              "/[/address@hidden"
              "|/address@hidden"
              "|/address@hidden/path/to/file"))
-           (format "/[/address@hidden|/address@hidden|%s/address@hidden"
-                   "user1" "host1"
-                   "user2" "host2"
+           (format "/[%s/address@hidden|%s/address@hidden|%s/address@hidden"
+                   "method1" "user1" "host1"
+                   "method2" "user2" "host2"
                    "method3" "user3" "host3")))
 
          ;; Expand `tramp-default-user-alist'.
@@ -1686,9 +1739,9 @@ handled properly.  BODY shall not contain a timeout."
              "/[method1/host1"
              "|method2/host2"
              "|method3/host3]/path/to/file"))
-           (format "/[%s/%s|%s/%s|%s/address@hidden"
-                   "method1" "host1"
-                   "method2" "host2"
+           (format "/[%s/address@hidden|%s/address@hidden|%s/address@hidden"
+                   "method1" "user1" "host1"
+                   "method2" "user2" "host2"
                    "method3" "user3" "host3")))
 
          ;; Expand `tramp-default-host-alist'.
@@ -1702,9 +1755,36 @@ handled properly.  BODY shall not contain a timeout."
              "/[method1/user1@"
              "|method2/user2@"
              "|method3/address@hidden/path/to/file"))
-           (format "/[%s/%s@|%s/%s@|%s/address@hidden"
-                   "method1" "user1"
-                   "method2" "user2"
+           (format "/[%s/address@hidden|%s/address@hidden|%s/address@hidden"
+                   "method1" "user1" "host1"
+                   "method2" "user2" "host2"
+                   "method3" "user3" "host3")))
+
+         ;; Ad-hoc user name and host name expansion.
+         (setq tramp-default-method-alist nil
+               tramp-default-user-alist nil
+               tramp-default-host-alist nil)
+         (should
+          (string-equal
+           (file-remote-p
+            (concat
+             "/[method1/address@hidden"
+             "|method2/user2@"
+             "|method3/address@hidden/path/to/file"))
+           (format "/[%s/address@hidden|%s/address@hidden|%s/address@hidden"
+                   "method1" "user1" "host1"
+                   "method2" "user2" "host1"
+                   "method3" "user3" "host1")))
+         (should
+          (string-equal
+           (file-remote-p
+            (concat
+             "/[method1/address@hidden"
+             "|method2/address@hidden"
+             "|method3/address@hidden/path/to/file"))
+           (format "/[%s/address@hidden|%s/address@hidden|%s/address@hidden"
+                   "method1" "user3" "host3"
+                   "method2" "user3" "host3"
                    "method3" "user3" "host3"))))
 
       ;; Exit.
@@ -3491,6 +3571,7 @@ This tests also `make-symbolic-link', `file-truename' and 
`add-name-to-file'."
   (when (not (memq system-type '(cygwin windows-nt)))
     (let ((method (file-remote-p tramp-test-temporary-file-directory 'method))
          (host (file-remote-p tramp-test-temporary-file-directory 'host))
+         (vec (tramp-dissect-file-name tramp-test-temporary-file-directory))
           (orig-syntax tramp-syntax))
       (when (and (stringp host) (string-match tramp-host-with-port-regexp 
host))
        (setq host (match-string 1 host)))
@@ -3501,6 +3582,10 @@ This tests also `make-symbolic-link', `file-truename' 
and `add-name-to-file'."
               (if (tramp--test-expensive-test)
                   (tramp-syntax-values) `(,orig-syntax)))
             (tramp-change-syntax syntax)
+           ;; This has cleaned up all connection data, which are used
+           ;; for completion.  We must refill the cache.
+           (tramp-set-connection-property vec "property" nil)
+
             (let ;; This is needed for the `simplified' syntax.
                 ((method-marker
                   (if (zerop (length tramp-method-regexp))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]