]> git.eshelyaron.com Git - emacs.git/commitdiff
Tramp: Handle hops with "%" in their names
authorMichael Albinus <michael.albinus@gmx.de>
Fri, 26 Jul 2024 20:10:36 +0000 (22:10 +0200)
committerEshel Yaron <me@eshelyaron.com>
Sat, 27 Jul 2024 12:03:09 +0000 (14:03 +0200)
* lisp/net/tramp.el (tramp-dissect-file-name, tramp-compute-multi-hops):
Handle hops with "%" in their names, like USER%DOMAIN or POD%NAMESPACE.

(cherry picked from commit d7665595f7bfca86b65e75fa624b0fc7a63fbb41)

lisp/net/tramp.el

index 33ff3319367290622ae39ff32ed5a69b34518af3..0ca525b137b8f229d57a4df3060e5dfcb0519d28 100644 (file)
@@ -1768,17 +1768,23 @@ default values are used."
        (unless nodefault
          (when hop
            (setq v (tramp-dissect-hop-name hop)
-                 hop (and hop (tramp-make-tramp-hop-name v))))
+                 hop (tramp-make-tramp-hop-name v)))
          (let ((tramp-default-host
                 (or (and v (not (string-search "%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))))))
+                 host (tramp-find-host method user host))
+           (when hop
+             ;; Replace placeholders.  The hop could contain "%"
+             ;; which is not intended as format character, for
+             ;; example in USER%DOMAIN or POD%NAMESPACE.
+             (setq hop
+                   (replace-regexp-in-string
+                    (rx "%" (group (= 2 alnum))) "%%\\1" hop)
+                   hop
+                   (format-spec hop (format-spec-make ?h host ?u user))))))
 
        ;; Return result.
        (prog1
@@ -4920,8 +4926,13 @@ Do not set it manually, it is used buffer-local in `tramp-get-lock-pid'.")
        (if (null proxy)
            ;; No more hops needed.
            (setq choices nil)
-         ;; Replace placeholders.
+         ;; Replace placeholders.  The proxy could contain "%" which
+         ;; is not intended as format character, for example in
+         ;; USER%DOMAIN or POD%NAMESPACE.
          (setq proxy
+               (replace-regexp-in-string
+                (rx "%" (group (= 2 alnum))) "%%\\1" proxy)
+               proxy
                (format-spec
                 proxy
                 (format-spec-make