[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/tramp 4d846b9: Tramp ELPA version 2.4.3 released
From: |
Michael Albinus |
Subject: |
[elpa] externals/tramp 4d846b9: Tramp ELPA version 2.4.3 released |
Date: |
Sun, 29 Dec 2019 06:00:12 -0500 (EST) |
branch: externals/tramp
commit 4d846b94a06a6c76d57bc017305cac8042f1fe57
Author: Michael Albinus <address@hidden>
Commit: Michael Albinus <address@hidden>
Tramp ELPA version 2.4.3 released
---
test/tramp-tests.el | 1251 +++++++++++++++++++++++++++-----------------------
texi/tramp.texi | 31 ++
texi/trampver.texi | 2 +-
tramp-adb.el | 10 +-
tramp-cmds.el | 2 +-
tramp-compat.el | 5 +
tramp-integration.el | 79 +++-
tramp-loaddefs.el | 2 +-
tramp-sh.el | 180 ++++----
tramp-smb.el | 3 +-
tramp.el | 64 ++-
tramp.info | 157 ++++---
trampver.el | 7 +-
13 files changed, 1036 insertions(+), 757 deletions(-)
diff --git a/test/tramp-tests.el b/test/tramp-tests.el
index 4b887e7..9cf466d 100644
--- a/test/tramp-tests.el
+++ b/test/tramp-tests.el
@@ -67,6 +67,14 @@
(defvar tramp-remote-path)
(defvar tramp-remote-process-environment)
+;; Needed for Emacs 24.
+(defvar inhibit-message)
+;; Needed for Emacs 25.
+(defvar connection-local-criteria-alist)
+(defvar connection-local-profile-alist)
+;; Needed for Emacs 26.
+(defvar async-shell-command-width)
+
;; Beautify batch mode.
(when noninteractive
;; Suppress nasty messages.
@@ -221,79 +229,89 @@ properly. BODY shall not contain a timeout."
(ert-deftest tramp-test01-file-name-syntax ()
"Check remote file name syntax."
- ;; Simple cases.
- (should (tramp-tramp-file-p "/method::"))
- (should (tramp-tramp-file-p "/method:host:"))
- (should (tramp-tramp-file-p "/method:user@:"))
- (should (tramp-tramp-file-p "/method:user@host:"))
- (should (tramp-tramp-file-p "/method:user@email@host:"))
-
- ;; Using a port.
- (should (tramp-tramp-file-p "/method:host#1234:"))
- (should (tramp-tramp-file-p "/method:user@host#1234:"))
-
- ;; Using an IPv4 address.
- (should (tramp-tramp-file-p "/method:1.2.3.4:"))
- (should (tramp-tramp-file-p "/method:user@1.2.3.4:"))
-
- ;; Using an IPv6 address.
- (should (tramp-tramp-file-p "/method:[::1]:"))
- (should (tramp-tramp-file-p "/method:user@[::1]:"))
-
- ;; Using an IPv4 mapped IPv6 address.
- (should (tramp-tramp-file-p "/method:[::ffff:1.2.3.4]:"))
- (should (tramp-tramp-file-p "/method:user@[::ffff:1.2.3.4]:"))
-
- ;; Local file name part.
- (should (tramp-tramp-file-p "/method:::"))
- (should (tramp-tramp-file-p "/method::/:"))
- (should (tramp-tramp-file-p "/method::/path/to/file"))
- (should (tramp-tramp-file-p "/method::/:/path/to/file"))
- (should (tramp-tramp-file-p "/method::file"))
- (should (tramp-tramp-file-p "/method::/:file"))
-
- ;; Multihop.
- (should (tramp-tramp-file-p "/method1:|method2::"))
- (should (tramp-tramp-file-p "/method1:host1|method2:host2:"))
- (should (tramp-tramp-file-p "/method1:user1@host1|method2:user2@host2:"))
- (should (tramp-tramp-file-p
- "/method1:user1@host1|method2:user2@host2|method3:user3@host3:"))
-
- ;; No strings.
- (should-not (tramp-tramp-file-p nil))
- (should-not (tramp-tramp-file-p 'symbol))
- ;; No newline or linefeed.
- (should-not (tramp-tramp-file-p "/method::file\nname"))
- (should-not (tramp-tramp-file-p "/method::file\rname"))
- ;; Ange-FTP syntax.
- (should-not (tramp-tramp-file-p "/host:"))
- (should-not (tramp-tramp-file-p "/user@host:"))
- (should-not (tramp-tramp-file-p "/1.2.3.4:"))
- (should-not (tramp-tramp-file-p "/[]:"))
- (should-not (tramp-tramp-file-p "/[::1]:"))
- (should-not (tramp-tramp-file-p "/[::ffff:1.2.3.4]:"))
- (should-not (tramp-tramp-file-p "/host:/:"))
- (should-not (tramp-tramp-file-p "/host1|host2:"))
- (should-not (tramp-tramp-file-p "/user1@host1|user2@host2:"))
- ;; Quote with "/:" suppresses file name handlers.
- (should-not (tramp-tramp-file-p "/::"))
- (should-not (tramp-tramp-file-p "/:@:"))
- (should-not (tramp-tramp-file-p "/:[]:"))
- ;; When `tramp-mode' is nil, Tramp is not activated.
- (let (tramp-mode)
- (should-not (tramp-tramp-file-p "/method:user@host:")))
- ;; `tramp-ignored-file-name-regexp' suppresses Tramp.
- (let ((tramp-ignored-file-name-regexp "^/method:user@host:"))
- (should-not (tramp-tramp-file-p "/method:user@host:")))
- ;; Methods shall be at least two characters on MS Windows, except
- ;; the default method.
- (let ((system-type 'windows-nt))
- (should-not (tramp-tramp-file-p "/c:/path/to/file"))
- (should-not (tramp-tramp-file-p "/c::/path/to/file"))
- (should (tramp-tramp-file-p "/-::/path/to/file")))
- (let ((system-type 'gnu/linux))
- (should (tramp-tramp-file-p "/-:h:/path/to/file"))
- (should (tramp-tramp-file-p "/m::/path/to/file"))))
+ (let ((syntax tramp-syntax))
+ (unwind-protect
+ (progn
+ (tramp-change-syntax 'default)
+ ;; Simple cases.
+ (should (tramp-tramp-file-p "/method::"))
+ (should (tramp-tramp-file-p "/method:host:"))
+ (should (tramp-tramp-file-p "/method:user@:"))
+ (should (tramp-tramp-file-p "/method:user@host:"))
+ (should (tramp-tramp-file-p "/method:user@email@host:"))
+
+ ;; Using a port.
+ (should (tramp-tramp-file-p "/method:host#1234:"))
+ (should (tramp-tramp-file-p "/method:user@host#1234:"))
+
+ ;; Using an IPv4 address.
+ (should (tramp-tramp-file-p "/method:1.2.3.4:"))
+ (should (tramp-tramp-file-p "/method:user@1.2.3.4:"))
+
+ ;; Using an IPv6 address.
+ (should (tramp-tramp-file-p "/method:[::1]:"))
+ (should (tramp-tramp-file-p "/method:user@[::1]:"))
+
+ ;; Using an IPv4 mapped IPv6 address.
+ (should (tramp-tramp-file-p "/method:[::ffff:1.2.3.4]:"))
+ (should (tramp-tramp-file-p "/method:user@[::ffff:1.2.3.4]:"))
+
+ ;; Local file name part.
+ (should (tramp-tramp-file-p "/method:::"))
+ (should (tramp-tramp-file-p "/method::/:"))
+ (should (tramp-tramp-file-p "/method::/path/to/file"))
+ (should (tramp-tramp-file-p "/method::/:/path/to/file"))
+ (should (tramp-tramp-file-p "/method::file"))
+ (should (tramp-tramp-file-p "/method::/:file"))
+
+ ;; Multihop.
+ (should (tramp-tramp-file-p "/method1:|method2::"))
+ (should
+ (tramp-tramp-file-p "/method1:host1|method2:host2:"))
+ (should
+ (tramp-tramp-file-p "/method1:user1@host1|method2:user2@host2:"))
+ (should
+ (tramp-tramp-file-p
+ "/method1:user1@host1|method2:user2@host2|method3:user3@host3:"))
+
+ ;; No strings.
+ (should-not (tramp-tramp-file-p nil))
+ (should-not (tramp-tramp-file-p 'symbol))
+ ;; No newline or linefeed.
+ (should-not (tramp-tramp-file-p "/method::file\nname"))
+ (should-not (tramp-tramp-file-p "/method::file\rname"))
+ ;; Ange-FTP syntax.
+ (should-not (tramp-tramp-file-p "/host:"))
+ (should-not (tramp-tramp-file-p "/user@host:"))
+ (should-not (tramp-tramp-file-p "/1.2.3.4:"))
+ (should-not (tramp-tramp-file-p "/[]:"))
+ (should-not (tramp-tramp-file-p "/[::1]:"))
+ (should-not (tramp-tramp-file-p "/[::ffff:1.2.3.4]:"))
+ (should-not (tramp-tramp-file-p "/host:/:"))
+ (should-not (tramp-tramp-file-p "/host1|host2:"))
+ (should-not (tramp-tramp-file-p "/user1@host1|user2@host2:"))
+ ;; Quote with "/:" suppresses file name handlers.
+ (should-not (tramp-tramp-file-p "/::"))
+ (should-not (tramp-tramp-file-p "/:@:"))
+ (should-not (tramp-tramp-file-p "/:[]:"))
+ ;; When `tramp-mode' is nil, Tramp is not activated.
+ (let (tramp-mode)
+ (should-not (tramp-tramp-file-p "/method:user@host:")))
+ ;; `tramp-ignored-file-name-regexp' suppresses Tramp.
+ (let ((tramp-ignored-file-name-regexp "^/method:user@host:"))
+ (should-not (tramp-tramp-file-p "/method:user@host:")))
+ ;; Methods shall be at least two characters on MS Windows,
+ ;; except the default method.
+ (let ((system-type 'windows-nt))
+ (should-not (tramp-tramp-file-p "/c:/path/to/file"))
+ (should-not (tramp-tramp-file-p "/c::/path/to/file"))
+ (should (tramp-tramp-file-p "/-::/path/to/file")))
+ (let ((system-type 'gnu/linux))
+ (should (tramp-tramp-file-p "/-:h:/path/to/file"))
+ (should (tramp-tramp-file-p "/m::/path/to/file"))))
+
+ ;; Exit.
+ (tramp-change-syntax syntax))))
(ert-deftest tramp-test01-file-name-syntax-simplified ()
"Check simplified file name syntax."
@@ -424,442 +442,499 @@ properly. BODY shall not contain a timeout."
(non-essential t)
;; Suppress check for multihops.
(tramp-cache-data (make-hash-table :test #'equal))
- (tramp-connection-properties '((nil "login-program" t))))
- ;; An unknown method shall raise an error.
- (let (non-essential)
- (should-error
- (expand-file-name "/method:user@host:")
- :type 'user-error))
-
- ;; Expand `tramp-default-user' and `tramp-default-host'.
- (should (string-equal
- (file-remote-p "/method::")
- (format "/%s:%s@%s:" "method" "default-user" "default-host")))
- (should (string-equal (file-remote-p "/method::" 'method) "method"))
- (should (string-equal (file-remote-p "/method::" 'user) "default-user"))
- (should (string-equal (file-remote-p "/method::" 'host) "default-host"))
- (should (string-equal (file-remote-p "/method::" 'localname) ""))
- (should (string-equal (file-remote-p "/method::" 'hop) nil))
-
- ;; Expand `tramp-default-method' and `tramp-default-user'.
- (should (string-equal
- (file-remote-p "/-:host:")
- (format "/%s:%s@%s:" "default-method" "default-user" "host")))
- (should (string-equal (file-remote-p "/-:host:" 'method) "default-method"))
- (should (string-equal (file-remote-p "/-:host:" 'user) "default-user"))
- (should (string-equal (file-remote-p "/-:host:" 'host) "host"))
- (should (string-equal (file-remote-p "/-:host:" 'localname) ""))
- (should (string-equal (file-remote-p "/-:host:" 'hop) nil))
-
- ;; Expand `tramp-default-method' and `tramp-default-host'.
- (should (string-equal
- (file-remote-p "/-:user@:")
- (format "/%s:%s@%s:" "default-method" "user" "default-host")))
- (should (string-equal (file-remote-p "/-:user@:" 'method)
"default-method"))
- (should (string-equal (file-remote-p "/-:user@:" 'user) "user"))
- (should (string-equal (file-remote-p "/-:user@:" 'host) "default-host"))
- (should (string-equal (file-remote-p "/-:user@:" 'localname) ""))
- (should (string-equal (file-remote-p "/-:user@:" 'hop) nil))
-
- ;; Expand `tramp-default-method'.
- (should (string-equal
- (file-remote-p "/-:user@host:")
- (format "/%s:%s@%s:" "default-method" "user" "host")))
- (should (string-equal
- (file-remote-p "/-:user@host:" 'method) "default-method"))
- (should (string-equal (file-remote-p "/-:user@host:" 'user) "user"))
- (should (string-equal (file-remote-p "/-:user@host:" 'host) "host"))
- (should (string-equal (file-remote-p "/-:user@host:" 'localname) ""))
- (should (string-equal (file-remote-p "/-:user@host:" 'hop) nil))
-
- ;; Expand `tramp-default-user'.
- (should (string-equal
- (file-remote-p "/method:host:")
- (format "/%s:%s@%s:" "method" "default-user" "host")))
- (should (string-equal (file-remote-p "/method:host:" 'method) "method"))
- (should (string-equal (file-remote-p "/method:host:" 'user)
"default-user"))
- (should (string-equal (file-remote-p "/method:host:" 'host) "host"))
- (should (string-equal (file-remote-p "/method:host:" 'localname) ""))
- (should (string-equal (file-remote-p "/method:host:" 'hop) nil))
-
- ;; Expand `tramp-default-host'.
- (should (string-equal
- (file-remote-p "/method:user@:")
- (format "/%s:%s@%s:" "method" "user" "default-host")))
- (should (string-equal (file-remote-p "/method:user@:" 'method) "method"))
- (should (string-equal (file-remote-p "/method:user@:" 'user) "user"))
- (should (string-equal (file-remote-p "/method:user@:" 'host)
- "default-host"))
- (should (string-equal (file-remote-p "/method:user@:" 'localname) ""))
- (should (string-equal (file-remote-p "/method:user@:" 'hop) nil))
-
- ;; No expansion.
- (should (string-equal
- (file-remote-p "/method:user@host:")
- (format "/%s:%s@%s:" "method" "user" "host")))
- (should (string-equal
- (file-remote-p "/method:user@host:" 'method) "method"))
- (should (string-equal (file-remote-p "/method:user@host:" 'user) "user"))
- (should (string-equal (file-remote-p "/method:user@host:" 'host) "host"))
- (should (string-equal (file-remote-p "/method:user@host:" 'localname) ""))
- (should (string-equal (file-remote-p "/method:user@host:" 'hop) nil))
-
- ;; No expansion.
- (should (string-equal
- (file-remote-p "/method:user@email@host:")
- (format "/%s:%s@%s:" "method" "user@email" "host")))
- (should (string-equal
- (file-remote-p "/method:user@email@host:" 'method) "method"))
- (should (string-equal
- (file-remote-p "/method:user@email@host:" 'user) "user@email"))
- (should (string-equal
- (file-remote-p "/method:user@email@host:" 'host) "host"))
- (should (string-equal
- (file-remote-p "/method:user@email@host:" 'localname) ""))
- (should (string-equal
- (file-remote-p "/method:user@email@host:" 'hop) nil))
-
- ;; Expand `tramp-default-method' and `tramp-default-user'.
- (should (string-equal
- (file-remote-p "/-:host#1234:")
- (format "/%s:%s@%s:" "default-method" "default-user" "host#1234")))
- (should (string-equal
- (file-remote-p "/-:host#1234:" 'method) "default-method"))
- (should (string-equal (file-remote-p "/-:host#1234:" 'user)
"default-user"))
- (should (string-equal (file-remote-p "/-:host#1234:" 'host) "host#1234"))
- (should (string-equal (file-remote-p "/-:host#1234:" 'localname) ""))
- (should (string-equal (file-remote-p "/-:host#1234:" 'hop) nil))
-
- ;; Expand `tramp-default-method'.
- (should (string-equal
- (file-remote-p "/-:user@host#1234:")
- (format "/%s:%s@%s:" "default-method" "user" "host#1234")))
- (should (string-equal
- (file-remote-p "/-:user@host#1234:" 'method) "default-method"))
- (should (string-equal (file-remote-p "/-:user@host#1234:" 'user) "user"))
- (should (string-equal
- (file-remote-p "/-:user@host#1234:" 'host) "host#1234"))
- (should (string-equal (file-remote-p "/-:user@host#1234:" 'localname) ""))
- (should (string-equal (file-remote-p "/-:user@host#1234:" 'hop) nil))
-
- ;; Expand `tramp-default-user'.
- (should (string-equal
- (file-remote-p "/method:host#1234:")
- (format "/%s:%s@%s:" "method" "default-user" "host#1234")))
- (should (string-equal
- (file-remote-p "/method:host#1234:" 'method) "method"))
- (should (string-equal
- (file-remote-p "/method:host#1234:" 'user) "default-user"))
- (should (string-equal
- (file-remote-p "/method:host#1234:" 'host) "host#1234"))
- (should (string-equal (file-remote-p "/method:host#1234:" 'localname) ""))
- (should (string-equal (file-remote-p "/method:host#1234:" 'hop) nil))
-
- ;; No expansion.
- (should (string-equal
- (file-remote-p "/method:user@host#1234:")
- (format "/%s:%s@%s:" "method" "user" "host#1234")))
- (should (string-equal
- (file-remote-p "/method:user@host#1234:" 'method) "method"))
- (should (string-equal
- (file-remote-p "/method:user@host#1234:" 'user) "user"))
- (should (string-equal
- (file-remote-p "/method:user@host#1234:" 'host) "host#1234"))
- (should (string-equal
- (file-remote-p "/method:user@host#1234:" 'localname) ""))
- (should (string-equal
- (file-remote-p "/method:user@host#1234:" 'hop) nil))
-
- ;; Expand `tramp-default-method' and `tramp-default-user'.
- (should (string-equal
- (file-remote-p "/-:1.2.3.4:")
- (format "/%s:%s@%s:" "default-method" "default-user" "1.2.3.4")))
- (should (string-equal
- (file-remote-p "/-:1.2.3.4:" 'method) "default-method"))
- (should (string-equal (file-remote-p "/-:1.2.3.4:" 'user) "default-user"))
- (should (string-equal (file-remote-p "/-:1.2.3.4:" 'host) "1.2.3.4"))
- (should (string-equal (file-remote-p "/-:1.2.3.4:" 'localname) ""))
- (should (string-equal (file-remote-p "/-:1.2.3.4:" 'hop) nil))
-
- ;; Expand `tramp-default-method'.
- (should (string-equal
- (file-remote-p "/-:user@1.2.3.4:")
- (format "/%s:%s@%s:" "default-method" "user" "1.2.3.4")))
- (should (string-equal
- (file-remote-p "/-:user@1.2.3.4:" 'method) "default-method"))
- (should (string-equal (file-remote-p "/-:user@1.2.3.4:" 'user) "user"))
- (should (string-equal (file-remote-p "/-:user@1.2.3.4:" 'host) "1.2.3.4"))
- (should (string-equal (file-remote-p "/-:user@1.2.3.4:" 'localname) ""))
- (should (string-equal (file-remote-p "/-:user@1.2.3.4:" 'hop) nil))
-
- ;; Expand `tramp-default-user'.
- (should (string-equal
- (file-remote-p "/method:1.2.3.4:")
- (format "/%s:%s@%s:" "method" "default-user" "1.2.3.4")))
- (should (string-equal (file-remote-p "/method:1.2.3.4:" 'method) "method"))
- (should (string-equal
- (file-remote-p "/method:1.2.3.4:" 'user) "default-user"))
- (should (string-equal (file-remote-p "/method:1.2.3.4:" 'host) "1.2.3.4"))
- (should (string-equal (file-remote-p "/method:1.2.3.4:" 'localname) ""))
- (should (string-equal (file-remote-p "/method:1.2.3.4:" 'hop) nil))
-
- ;; No expansion.
- (should (string-equal
- (file-remote-p "/method:user@1.2.3.4:")
- (format "/%s:%s@%s:" "method" "user" "1.2.3.4")))
- (should (string-equal
- (file-remote-p "/method:user@1.2.3.4:" 'method) "method"))
- (should (string-equal (file-remote-p "/method:user@1.2.3.4:" 'user)
"user"))
- (should (string-equal
- (file-remote-p "/method:user@1.2.3.4:" 'host) "1.2.3.4"))
- (should (string-equal
- (file-remote-p "/method:user@1.2.3.4:" 'localname) ""))
- (should (string-equal
- (file-remote-p "/method:user@1.2.3.4:" 'hop) nil))
-
- ;; Expand `tramp-default-method', `tramp-default-user' and
- ;; `tramp-default-host'.
- (should (string-equal
- (file-remote-p "/-:[]:")
- (format
- "/%s:%s@%s:" "default-method" "default-user" "default-host")))
- (should (string-equal (file-remote-p "/-:[]:" 'method) "default-method"))
- (should (string-equal (file-remote-p "/-:[]:" 'user) "default-user"))
- (should (string-equal (file-remote-p "/-:[]:" 'host) "default-host"))
- (should (string-equal (file-remote-p "/-:[]:" 'localname) ""))
- (should (string-equal (file-remote-p "/-:[]:" 'hop) nil))
-
- ;; Expand `tramp-default-method' and `tramp-default-user'.
- (let ((tramp-default-host "::1"))
- (should (string-equal
- (file-remote-p "/-:[]:")
- (format "/%s:%s@%s:" "default-method" "default-user" "[::1]")))
- (should (string-equal (file-remote-p "/-:[]:" 'method) "default-method"))
- (should (string-equal (file-remote-p "/-:[]:" 'user) "default-user"))
- (should (string-equal (file-remote-p "/-:[]:" 'host) "::1"))
- (should (string-equal (file-remote-p "/-:[]:" 'localname) ""))
- (should (string-equal (file-remote-p "/-:[]:" 'hop) nil)))
-
- ;; Expand `tramp-default-method' and `tramp-default-user'.
- (should (string-equal
- (file-remote-p "/-:[::1]:")
- (format "/%s:%s@%s:" "default-method" "default-user" "[::1]")))
- (should (string-equal (file-remote-p "/-:[::1]:" 'method)
"default-method"))
- (should (string-equal (file-remote-p "/-:[::1]:" 'user) "default-user"))
- (should (string-equal (file-remote-p "/-:[::1]:" 'host) "::1"))
- (should (string-equal (file-remote-p "/-:[::1]:" 'localname) ""))
- (should (string-equal (file-remote-p "/-:[::1]:" 'hop) nil))
-
- ;; Expand `tramp-default-method'.
- (should (string-equal
- (file-remote-p "/-:user@[::1]:")
- (format "/%s:%s@%s:" "default-method" "user" "[::1]")))
- (should (string-equal
- (file-remote-p "/-:user@[::1]:" 'method) "default-method"))
- (should (string-equal (file-remote-p "/-:user@[::1]:" 'user) "user"))
- (should (string-equal (file-remote-p "/-:user@[::1]:" 'host) "::1"))
- (should (string-equal (file-remote-p "/-:user@[::1]:" 'localname) ""))
- (should (string-equal (file-remote-p "/-:user@[::1]:" 'hop) nil))
-
- ;; Expand `tramp-default-user'.
- (should (string-equal
- (file-remote-p "/method:[::1]:")
- (format "/%s:%s@%s:" "method" "default-user" "[::1]")))
- (should (string-equal (file-remote-p "/method:[::1]:" 'method) "method"))
- (should (string-equal
- (file-remote-p "/method:[::1]:" 'user) "default-user"))
- (should (string-equal (file-remote-p "/method:[::1]:" 'host) "::1"))
- (should (string-equal (file-remote-p "/method:[::1]:" 'localname) ""))
- (should (string-equal (file-remote-p "/method:[::1]:" 'hop) nil))
-
- ;; No expansion.
- (should (string-equal
- (file-remote-p "/method:user@[::1]:")
- (format "/%s:%s@%s:" "method" "user" "[::1]")))
- (should (string-equal
- (file-remote-p "/method:user@[::1]:" 'method) "method"))
- (should (string-equal (file-remote-p "/method:user@[::1]:" 'user) "user"))
- (should (string-equal (file-remote-p "/method:user@[::1]:" 'host) "::1"))
- (should (string-equal
- (file-remote-p "/method:user@[::1]:" 'localname) ""))
- (should (string-equal (file-remote-p "/method:user@[::1]:" 'hop) nil))
-
- ;; Local file name part.
- (should (string-equal (file-remote-p "/-:host:/:" 'localname) "/:"))
- (should (string-equal (file-remote-p "/method:::" 'localname) ":"))
- (should (string-equal (file-remote-p "/method:: " 'localname) " "))
- (should (string-equal (file-remote-p "/method::file" 'localname) "file"))
- (should (string-equal
- (file-remote-p "/method::/path/to/file" 'localname)
- "/path/to/file"))
-
- ;; Multihop.
- (should
- (string-equal
- (file-remote-p "/method1:user1@host1|method2:user2@host2:/path/to/file")
- (format "/%s:%s@%s|%s:%s@%s:"
- "method1" "user1" "host1" "method2" "user2" "host2")))
- (should
- (string-equal
- (file-remote-p
- "/method1:user1@host1|method2:user2@host2:/path/to/file" 'method)
- "method2"))
- (should
- (string-equal
- (file-remote-p
- "/method1:user1@host1|method2:user2@host2:/path/to/file" 'user)
- "user2"))
- (should
- (string-equal
- (file-remote-p
- "/method1:user1@host1|method2:user2@host2:/path/to/file" 'host)
- "host2"))
- (should
- (string-equal
- (file-remote-p
- "/method1:user1@host1|method2:user2@host2:/path/to/file" 'localname)
- "/path/to/file"))
- (should
- (string-equal
- (file-remote-p
- "/method1:user1@host1|method2:user2@host2:/path/to/file" 'hop)
- (format "%s:%s@%s|"
- "method1" "user1" "host1")))
+ (tramp-connection-properties '((nil "login-program" t)))
+ (syntax tramp-syntax))
+ (unwind-protect
+ (progn
+ (tramp-change-syntax 'default)
+ ;; An unknown method shall raise an error.
+ (let (non-essential)
+ (should-error
+ (expand-file-name "/method:user@host:")
+ :type 'user-error))
- (should
- (string-equal
- (file-remote-p
- (concat
- "/method1:user1@host1"
- "|method2:user2@host2"
- "|method3:user3@host3:/path/to/file"))
- (format "/%s:%s@%s|%s:%s@%s|%s:%s@%s:"
- "method1" "user1" "host1"
- "method2" "user2" "host2"
- "method3" "user3" "host3")))
- (should
- (string-equal
- (file-remote-p
- (concat
- "/method1:user1@host1"
- "|method2:user2@host2"
- "|method3:user3@host3:/path/to/file")
- 'method)
- "method3"))
- (should
- (string-equal
- (file-remote-p
- (concat
- "/method1:user1@host1"
- "|method2:user2@host2"
- "|method3:user3@host3:/path/to/file")
- 'user)
- "user3"))
- (should
- (string-equal
- (file-remote-p
- (concat
- "/method1:user1@host1"
- "|method2:user2@host2"
- "|method3:user3@host3:/path/to/file")
- 'host)
- "host3"))
- (should
- (string-equal
- (file-remote-p
- (concat
- "/method1:user1@host1"
- "|method2:user2@host2"
- "|method3:user3@host3:/path/to/file")
- 'localname)
- "/path/to/file"))
- (should
- (string-equal
- (file-remote-p
- (concat
- "/method1:user1@host1"
- "|method2:user2@host2"
- "|method3:user3@host3:/path/to/file")
- 'hop)
- (format "%s:%s@%s|%s:%s@%s|"
- "method1" "user1" "host1" "method2" "user2" "host2")))
-
- ;; Expand `tramp-default-method-alist'.
- (add-to-list 'tramp-default-method-alist '("host1" "user1" "method1"))
- (add-to-list 'tramp-default-method-alist '("host2" "user2" "method2"))
- (add-to-list 'tramp-default-method-alist '("host3" "user3" "method3"))
- (should
- (string-equal
- (file-remote-p
- (concat
- "/-:user1@host1"
- "|-:user2@host2"
- "|-:user3@host3:/path/to/file"))
- (format "/%s:%s@%s|%s:%s@%s|%s:%s@%s:"
- "method1" "user1" "host1"
- "method2" "user2" "host2"
- "method3" "user3" "host3")))
-
- ;; Expand `tramp-default-user-alist'.
- (add-to-list 'tramp-default-user-alist '("method1" "host1" "user1"))
- (add-to-list 'tramp-default-user-alist '("method2" "host2" "user2"))
- (add-to-list 'tramp-default-user-alist '("method3" "host3" "user3"))
- (should
- (string-equal
- (file-remote-p
- (concat
- "/method1:host1"
- "|method2:host2"
- "|method3:host3:/path/to/file"))
- (format "/%s:%s@%s|%s:%s@%s|%s:%s@%s:"
- "method1" "user1" "host1"
- "method2" "user2" "host2"
- "method3" "user3" "host3")))
-
- ;; Expand `tramp-default-host-alist'.
- (add-to-list 'tramp-default-host-alist '("method1" "user1" "host1"))
- (add-to-list 'tramp-default-host-alist '("method2" "user2" "host2"))
- (add-to-list 'tramp-default-host-alist '("method3" "user3" "host3"))
- (should
- (string-equal
- (file-remote-p
- (concat
- "/method1:user1@"
- "|method2:user2@"
- "|method3:user3@:/path/to/file"))
- (format "/%s:%s@%s|%s:%s@%s|%s:%s@%s:"
- "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:user1@host1"
- "|method2:user2@"
- "|method3:user3@:/path/to/file"))
- (format "/%s:%s@%s|%s:%s@%s|%s:%s@%s:"
- "method1" "user1" "host1"
- "method2" "user2" "host1"
- "method3" "user3" "host1")))
- (should
- (string-equal
- (file-remote-p
- (concat
- "/method1:%u@%h"
- "|method2:user2@host2"
- "|method3:%u@%h"
- "|method4:user4%domain4@host4#1234:/path/to/file"))
- (format "/%s:%s@%s|%s:%s@%s|%s:%s@%s|%s:%s@%s:"
- "method1" "user2" "host2"
- "method2" "user2" "host2"
- "method3" "user4" "host4"
- "method4" "user4%domain4" "host4#1234")))))
+ ;; Expand `tramp-default-user' and `tramp-default-host'.
+ (should
+ (string-equal
+ (file-remote-p "/method::")
+ (format "/%s:%s@%s:" "method" "default-user" "default-host")))
+ (should (string-equal (file-remote-p "/method::" 'method) "method"))
+ (should
+ (string-equal (file-remote-p "/method::" 'user) "default-user"))
+ (should
+ (string-equal (file-remote-p "/method::" 'host) "default-host"))
+ (should (string-equal (file-remote-p "/method::" 'localname) ""))
+ (should (string-equal (file-remote-p "/method::" 'hop) nil))
+
+ ;; Expand `tramp-default-method' and `tramp-default-user'.
+ (should
+ (string-equal
+ (file-remote-p "/-:host:")
+ (format "/%s:%s@%s:" "default-method" "default-user" "host")))
+ (should
+ (string-equal (file-remote-p "/-:host:" 'method) "default-method"))
+ (should
+ (string-equal (file-remote-p "/-:host:" 'user) "default-user"))
+ (should (string-equal (file-remote-p "/-:host:" 'host) "host"))
+ (should (string-equal (file-remote-p "/-:host:" 'localname) ""))
+ (should (string-equal (file-remote-p "/-:host:" 'hop) nil))
+
+ ;; Expand `tramp-default-method' and `tramp-default-host'.
+ (should
+ (string-equal
+ (file-remote-p "/-:user@:")
+ (format "/%s:%s@%s:" "default-method" "user" "default-host")))
+ (should
+ (string-equal (file-remote-p "/-:user@:" 'method) "default-method"))
+ (should (string-equal (file-remote-p "/-:user@:" 'user) "user"))
+ (should
+ (string-equal (file-remote-p "/-:user@:" 'host) "default-host"))
+ (should (string-equal (file-remote-p "/-:user@:" 'localname) ""))
+ (should (string-equal (file-remote-p "/-:user@:" 'hop) nil))
+
+ ;; Expand `tramp-default-method'.
+ (should (string-equal
+ (file-remote-p "/-:user@host:")
+ (format "/%s:%s@%s:" "default-method" "user" "host")))
+ (should (string-equal
+ (file-remote-p "/-:user@host:" 'method) "default-method"))
+ (should (string-equal (file-remote-p "/-:user@host:" 'user) "user"))
+ (should (string-equal (file-remote-p "/-:user@host:" 'host) "host"))
+ (should (string-equal (file-remote-p "/-:user@host:" 'localname) ""))
+ (should (string-equal (file-remote-p "/-:user@host:" 'hop) nil))
+
+ ;; Expand `tramp-default-user'.
+ (should (string-equal
+ (file-remote-p "/method:host:")
+ (format "/%s:%s@%s:" "method" "default-user" "host")))
+ (should
+ (string-equal (file-remote-p "/method:host:" 'method) "method"))
+ (should
+ (string-equal (file-remote-p "/method:host:" 'user) "default-user"))
+ (should (string-equal (file-remote-p "/method:host:" 'host) "host"))
+ (should (string-equal (file-remote-p "/method:host:" 'localname) ""))
+ (should (string-equal (file-remote-p "/method:host:" 'hop) nil))
+
+ ;; Expand `tramp-default-host'.
+ (should
+ (string-equal
+ (file-remote-p "/method:user@:")
+ (format "/%s:%s@%s:" "method" "user" "default-host")))
+ (should
+ (string-equal (file-remote-p "/method:user@:" 'method) "method"))
+ (should (string-equal (file-remote-p "/method:user@:" 'user) "user"))
+ (should
+ (string-equal (file-remote-p "/method:user@:" 'host) "default-host"))
+ (should (string-equal (file-remote-p "/method:user@:" 'localname) ""))
+ (should (string-equal (file-remote-p "/method:user@:" 'hop) nil))
+
+ ;; No expansion.
+ (should (string-equal
+ (file-remote-p "/method:user@host:")
+ (format "/%s:%s@%s:" "method" "user" "host")))
+ (should (string-equal
+ (file-remote-p "/method:user@host:" 'method) "method"))
+ (should
+ (string-equal (file-remote-p "/method:user@host:" 'user) "user"))
+ (should
+ (string-equal (file-remote-p "/method:user@host:" 'host) "host"))
+ (should
+ (string-equal (file-remote-p "/method:user@host:" 'localname) ""))
+ (should (string-equal (file-remote-p "/method:user@host:" 'hop) nil))
+
+ ;; No expansion.
+ (should (string-equal
+ (file-remote-p "/method:user@email@host:")
+ (format "/%s:%s@%s:" "method" "user@email" "host")))
+ (should (string-equal
+ (file-remote-p "/method:user@email@host:" 'method) "method"))
+ (should
+ (string-equal
+ (file-remote-p "/method:user@email@host:" 'user) "user@email"))
+ (should (string-equal
+ (file-remote-p "/method:user@email@host:" 'host) "host"))
+ (should (string-equal
+ (file-remote-p "/method:user@email@host:" 'localname) ""))
+ (should (string-equal
+ (file-remote-p "/method:user@email@host:" 'hop) nil))
+
+ ;; Expand `tramp-default-method' and `tramp-default-user'.
+ (should
+ (string-equal
+ (file-remote-p "/-:host#1234:")
+ (format "/%s:%s@%s:" "default-method" "default-user" "host#1234")))
+ (should (string-equal
+ (file-remote-p "/-:host#1234:" 'method) "default-method"))
+ (should
+ (string-equal (file-remote-p "/-:host#1234:" 'user) "default-user"))
+ (should
+ (string-equal (file-remote-p "/-:host#1234:" 'host) "host#1234"))
+ (should (string-equal (file-remote-p "/-:host#1234:" 'localname) ""))
+ (should (string-equal (file-remote-p "/-:host#1234:" 'hop) nil))
+
+ ;; Expand `tramp-default-method'.
+ (should (string-equal
+ (file-remote-p "/-:user@host#1234:")
+ (format "/%s:%s@%s:" "default-method" "user" "host#1234")))
+ (should
+ (string-equal
+ (file-remote-p "/-:user@host#1234:" 'method) "default-method"))
+ (should
+ (string-equal (file-remote-p "/-:user@host#1234:" 'user) "user"))
+ (should
+ (string-equal
+ (file-remote-p "/-:user@host#1234:" 'host) "host#1234"))
+ (should
+ (string-equal (file-remote-p "/-:user@host#1234:" 'localname) ""))
+ (should (string-equal (file-remote-p "/-:user@host#1234:" 'hop) nil))
+
+ ;; Expand `tramp-default-user'.
+ (should (string-equal
+ (file-remote-p "/method:host#1234:")
+ (format "/%s:%s@%s:" "method" "default-user" "host#1234")))
+ (should (string-equal
+ (file-remote-p "/method:host#1234:" 'method) "method"))
+ (should (string-equal
+ (file-remote-p "/method:host#1234:" 'user) "default-user"))
+ (should (string-equal
+ (file-remote-p "/method:host#1234:" 'host) "host#1234"))
+ (should
+ (string-equal (file-remote-p "/method:host#1234:" 'localname) ""))
+ (should (string-equal (file-remote-p "/method:host#1234:" 'hop) nil))
+
+ ;; No expansion.
+ (should (string-equal
+ (file-remote-p "/method:user@host#1234:")
+ (format "/%s:%s@%s:" "method" "user" "host#1234")))
+ (should (string-equal
+ (file-remote-p "/method:user@host#1234:" 'method) "method"))
+ (should (string-equal
+ (file-remote-p "/method:user@host#1234:" 'user) "user"))
+ (should (string-equal
+ (file-remote-p "/method:user@host#1234:" 'host) "host#1234"))
+ (should (string-equal
+ (file-remote-p "/method:user@host#1234:" 'localname) ""))
+ (should (string-equal
+ (file-remote-p "/method:user@host#1234:" 'hop) nil))
+
+ ;; Expand `tramp-default-method' and `tramp-default-user'.
+ (should
+ (string-equal
+ (file-remote-p "/-:1.2.3.4:")
+ (format "/%s:%s@%s:" "default-method" "default-user" "1.2.3.4")))
+ (should
+ (string-equal
+ (file-remote-p "/-:1.2.3.4:" 'method) "default-method"))
+ (should
+ (string-equal (file-remote-p "/-:1.2.3.4:" 'user) "default-user"))
+ (should (string-equal (file-remote-p "/-:1.2.3.4:" 'host) "1.2.3.4"))
+ (should (string-equal (file-remote-p "/-:1.2.3.4:" 'localname) ""))
+ (should (string-equal (file-remote-p "/-:1.2.3.4:" 'hop) nil))
+
+ ;; Expand `tramp-default-method'.
+ (should (string-equal
+ (file-remote-p "/-:user@1.2.3.4:")
+ (format "/%s:%s@%s:" "default-method" "user" "1.2.3.4")))
+ (should (string-equal
+ (file-remote-p "/-:user@1.2.3.4:" 'method) "default-method"))
+ (should
+ (string-equal (file-remote-p "/-:user@1.2.3.4:" 'user) "user"))
+ (should
+ (string-equal (file-remote-p "/-:user@1.2.3.4:" 'host) "1.2.3.4"))
+ (should
+ (string-equal (file-remote-p "/-:user@1.2.3.4:" 'localname) ""))
+ (should
+ (string-equal (file-remote-p "/-:user@1.2.3.4:" 'hop) nil))
+
+ ;; Expand `tramp-default-user'.
+ (should (string-equal
+ (file-remote-p "/method:1.2.3.4:")
+ (format "/%s:%s@%s:" "method" "default-user" "1.2.3.4")))
+ (should
+ (string-equal (file-remote-p "/method:1.2.3.4:" 'method) "method"))
+ (should (string-equal
+ (file-remote-p "/method:1.2.3.4:" 'user) "default-user"))
+ (should
+ (string-equal (file-remote-p "/method:1.2.3.4:" 'host) "1.2.3.4"))
+ (should
+ (string-equal (file-remote-p "/method:1.2.3.4:" 'localname) ""))
+ (should (string-equal (file-remote-p "/method:1.2.3.4:" 'hop) nil))
+
+ ;; No expansion.
+ (should (string-equal
+ (file-remote-p "/method:user@1.2.3.4:")
+ (format "/%s:%s@%s:" "method" "user" "1.2.3.4")))
+ (should (string-equal
+ (file-remote-p "/method:user@1.2.3.4:" 'method) "method"))
+ (should
+ (string-equal (file-remote-p "/method:user@1.2.3.4:" 'user) "user"))
+ (should (string-equal
+ (file-remote-p "/method:user@1.2.3.4:" 'host) "1.2.3.4"))
+ (should (string-equal
+ (file-remote-p "/method:user@1.2.3.4:" 'localname) ""))
+ (should (string-equal
+ (file-remote-p "/method:user@1.2.3.4:" 'hop) nil))
+
+ ;; Expand `tramp-default-method', `tramp-default-user' and
+ ;; `tramp-default-host'.
+ (should
+ (string-equal
+ (file-remote-p "/-:[]:")
+ (format
+ "/%s:%s@%s:" "default-method" "default-user" "default-host")))
+ (should
+ (string-equal (file-remote-p "/-:[]:" 'method) "default-method"))
+ (should (string-equal (file-remote-p "/-:[]:" 'user) "default-user"))
+ (should (string-equal (file-remote-p "/-:[]:" 'host) "default-host"))
+ (should (string-equal (file-remote-p "/-:[]:" 'localname) ""))
+ (should (string-equal (file-remote-p "/-:[]:" 'hop) nil))
+
+ ;; Expand `tramp-default-method' and `tramp-default-user'.
+ (let ((tramp-default-host "::1"))
+ (should
+ (string-equal
+ (file-remote-p "/-:[]:")
+ (format "/%s:%s@%s:" "default-method" "default-user" "[::1]")))
+ (should
+ (string-equal (file-remote-p "/-:[]:" 'method) "default-method"))
+ (should
+ (string-equal (file-remote-p "/-:[]:" 'user) "default-user"))
+ (should (string-equal (file-remote-p "/-:[]:" 'host) "::1"))
+ (should (string-equal (file-remote-p "/-:[]:" 'localname) ""))
+ (should (string-equal (file-remote-p "/-:[]:" 'hop) nil)))
+
+ ;; Expand `tramp-default-method' and `tramp-default-user'.
+ (should
+ (string-equal
+ (file-remote-p "/-:[::1]:")
+ (format "/%s:%s@%s:" "default-method" "default-user" "[::1]")))
+ (should
+ (string-equal (file-remote-p "/-:[::1]:" 'method) "default-method"))
+ (should
+ (string-equal (file-remote-p "/-:[::1]:" 'user) "default-user"))
+ (should (string-equal (file-remote-p "/-:[::1]:" 'host) "::1"))
+ (should (string-equal (file-remote-p "/-:[::1]:" 'localname) ""))
+ (should (string-equal (file-remote-p "/-:[::1]:" 'hop) nil))
+
+ ;; Expand `tramp-default-method'.
+ (should (string-equal
+ (file-remote-p "/-:user@[::1]:")
+ (format "/%s:%s@%s:" "default-method" "user" "[::1]")))
+ (should (string-equal
+ (file-remote-p "/-:user@[::1]:" 'method) "default-method"))
+ (should (string-equal (file-remote-p "/-:user@[::1]:" 'user) "user"))
+ (should (string-equal (file-remote-p "/-:user@[::1]:" 'host) "::1"))
+ (should (string-equal (file-remote-p "/-:user@[::1]:" 'localname) ""))
+ (should (string-equal (file-remote-p "/-:user@[::1]:" 'hop) nil))
+
+ ;; Expand `tramp-default-user'.
+ (should (string-equal
+ (file-remote-p "/method:[::1]:")
+ (format "/%s:%s@%s:" "method" "default-user" "[::1]")))
+ (should
+ (string-equal (file-remote-p "/method:[::1]:" 'method) "method"))
+ (should (string-equal
+ (file-remote-p "/method:[::1]:" 'user) "default-user"))
+ (should (string-equal (file-remote-p "/method:[::1]:" 'host) "::1"))
+ (should (string-equal (file-remote-p "/method:[::1]:" 'localname) ""))
+ (should (string-equal (file-remote-p "/method:[::1]:" 'hop) nil))
+
+ ;; No expansion.
+ (should (string-equal
+ (file-remote-p "/method:user@[::1]:")
+ (format "/%s:%s@%s:" "method" "user" "[::1]")))
+ (should (string-equal
+ (file-remote-p "/method:user@[::1]:" 'method) "method"))
+ (should
+ (string-equal (file-remote-p "/method:user@[::1]:" 'user) "user"))
+ (should
+ (string-equal (file-remote-p "/method:user@[::1]:" 'host) "::1"))
+ (should (string-equal
+ (file-remote-p "/method:user@[::1]:" 'localname) ""))
+ (should (string-equal (file-remote-p "/method:user@[::1]:" 'hop) nil))
+
+ ;; Local file name part.
+ (should (string-equal (file-remote-p "/-:host:/:" 'localname) "/:"))
+ (should (string-equal (file-remote-p "/method:::" 'localname) ":"))
+ (should (string-equal (file-remote-p "/method:: " 'localname) " "))
+ (should
+ (string-equal (file-remote-p "/method::file" 'localname) "file"))
+ (should (string-equal
+ (file-remote-p "/method::/path/to/file" 'localname)
+ "/path/to/file"))
+
+ ;; Multihop.
+ (should
+ (string-equal
+ (file-remote-p
+ "/method1:user1@host1|method2:user2@host2:/path/to/file")
+ (format "/%s:%s@%s|%s:%s@%s:"
+ "method1" "user1" "host1" "method2" "user2" "host2")))
+ (should
+ (string-equal
+ (file-remote-p
+ "/method1:user1@host1|method2:user2@host2:/path/to/file" 'method)
+ "method2"))
+ (should
+ (string-equal
+ (file-remote-p
+ "/method1:user1@host1|method2:user2@host2:/path/to/file" 'user)
+ "user2"))
+ (should
+ (string-equal
+ (file-remote-p
+ "/method1:user1@host1|method2:user2@host2:/path/to/file" 'host)
+ "host2"))
+ (should
+ (string-equal
+ (file-remote-p
+ "/method1:user1@host1|method2:user2@host2:/path/to/file"
+ 'localname)
+ "/path/to/file"))
+ (should
+ (string-equal
+ (file-remote-p
+ "/method1:user1@host1|method2:user2@host2:/path/to/file" 'hop)
+ (format "%s:%s@%s|"
+ "method1" "user1" "host1")))
+
+ (should
+ (string-equal
+ (file-remote-p
+ (concat
+ "/method1:user1@host1"
+ "|method2:user2@host2"
+ "|method3:user3@host3:/path/to/file"))
+ (format "/%s:%s@%s|%s:%s@%s|%s:%s@%s:"
+ "method1" "user1" "host1"
+ "method2" "user2" "host2"
+ "method3" "user3" "host3")))
+ (should
+ (string-equal
+ (file-remote-p
+ (concat
+ "/method1:user1@host1"
+ "|method2:user2@host2"
+ "|method3:user3@host3:/path/to/file")
+ 'method)
+ "method3"))
+ (should
+ (string-equal
+ (file-remote-p
+ (concat
+ "/method1:user1@host1"
+ "|method2:user2@host2"
+ "|method3:user3@host3:/path/to/file")
+ 'user)
+ "user3"))
+ (should
+ (string-equal
+ (file-remote-p
+ (concat
+ "/method1:user1@host1"
+ "|method2:user2@host2"
+ "|method3:user3@host3:/path/to/file")
+ 'host)
+ "host3"))
+ (should
+ (string-equal
+ (file-remote-p
+ (concat
+ "/method1:user1@host1"
+ "|method2:user2@host2"
+ "|method3:user3@host3:/path/to/file")
+ 'localname)
+ "/path/to/file"))
+ (should
+ (string-equal
+ (file-remote-p
+ (concat
+ "/method1:user1@host1"
+ "|method2:user2@host2"
+ "|method3:user3@host3:/path/to/file")
+ 'hop)
+ (format "%s:%s@%s|%s:%s@%s|"
+ "method1" "user1" "host1" "method2" "user2" "host2")))
+
+ ;; Expand `tramp-default-method-alist'.
+ (add-to-list 'tramp-default-method-alist '("host1" "user1" "method1"))
+ (add-to-list 'tramp-default-method-alist '("host2" "user2" "method2"))
+ (add-to-list 'tramp-default-method-alist '("host3" "user3" "method3"))
+ (should
+ (string-equal
+ (file-remote-p
+ (concat
+ "/-:user1@host1"
+ "|-:user2@host2"
+ "|-:user3@host3:/path/to/file"))
+ (format "/%s:%s@%s|%s:%s@%s|%s:%s@%s:"
+ "method1" "user1" "host1"
+ "method2" "user2" "host2"
+ "method3" "user3" "host3")))
+
+ ;; Expand `tramp-default-user-alist'.
+ (add-to-list 'tramp-default-user-alist '("method1" "host1" "user1"))
+ (add-to-list 'tramp-default-user-alist '("method2" "host2" "user2"))
+ (add-to-list 'tramp-default-user-alist '("method3" "host3" "user3"))
+ (should
+ (string-equal
+ (file-remote-p
+ (concat
+ "/method1:host1"
+ "|method2:host2"
+ "|method3:host3:/path/to/file"))
+ (format "/%s:%s@%s|%s:%s@%s|%s:%s@%s:"
+ "method1" "user1" "host1"
+ "method2" "user2" "host2"
+ "method3" "user3" "host3")))
+
+ ;; Expand `tramp-default-host-alist'.
+ (add-to-list 'tramp-default-host-alist '("method1" "user1" "host1"))
+ (add-to-list 'tramp-default-host-alist '("method2" "user2" "host2"))
+ (add-to-list 'tramp-default-host-alist '("method3" "user3" "host3"))
+ (should
+ (string-equal
+ (file-remote-p
+ (concat
+ "/method1:user1@"
+ "|method2:user2@"
+ "|method3:user3@:/path/to/file"))
+ (format "/%s:%s@%s|%s:%s@%s|%s:%s@%s:"
+ "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:user1@host1"
+ "|method2:user2@"
+ "|method3:user3@:/path/to/file"))
+ (format "/%s:%s@%s|%s:%s@%s|%s:%s@%s:"
+ "method1" "user1" "host1"
+ "method2" "user2" "host1"
+ "method3" "user3" "host1")))
+ (should
+ (string-equal
+ (file-remote-p
+ (concat
+ "/method1:%u@%h"
+ "|method2:user2@host2"
+ "|method3:%u@%h"
+ "|method4:user4%domain4@host4#1234:/path/to/file"))
+ (format "/%s:%s@%s|%s:%s@%s|%s:%s@%s|%s:%s@%s:"
+ "method1" "user2" "host2"
+ "method2" "user2" "host2"
+ "method3" "user4" "host4"
+ "method4" "user4%domain4" "host4#1234"))))
+
+ ;; Exit.
+ (tramp-change-syntax syntax))))
(ert-deftest tramp-test02-file-name-dissect-simplified ()
"Check simplified file name components."
@@ -1853,6 +1928,8 @@ properly. BODY shall not contain a timeout."
(ert-deftest tramp-test03-file-name-defaults ()
"Check default values for some methods."
+ (skip-unless (eq tramp-syntax 'default))
+
;; Default values in tramp-adb.el.
(when (assoc "adb" tramp-methods)
(should (string-equal (file-remote-p "/adb::" 'host) "")))
@@ -1882,6 +1959,7 @@ properly. BODY shall not contain a timeout."
;; The following test is inspired by Bug#30946.
(ert-deftest tramp-test03-file-name-host-rules ()
"Check host name rules for host-less methods."
+ (skip-unless (eq tramp-syntax 'default))
(skip-unless (tramp--test-enabled))
(skip-unless (tramp--test-sh-p))
@@ -1906,6 +1984,7 @@ properly. BODY shall not contain a timeout."
(ert-deftest tramp-test03-file-name-method-rules ()
"Check file name rules for some methods."
+ (skip-unless (eq tramp-syntax 'default))
(skip-unless (tramp--test-enabled))
;; Multi hops are allowed for inline methods only.
@@ -1928,6 +2007,8 @@ properly. BODY shall not contain a timeout."
(ert-deftest tramp-test04-substitute-in-file-name ()
"Check `substitute-in-file-name'."
+ (skip-unless (eq tramp-syntax 'default))
+
;; Suppress method name check.
(let ((tramp-methods (cons '("method") tramp-methods)))
(should
@@ -2023,6 +2104,8 @@ properly. BODY shall not contain a timeout."
(ert-deftest tramp-test05-expand-file-name ()
"Check `expand-file-name'."
+ (skip-unless (eq tramp-syntax 'default))
+
;; Suppress method name check.
(let ((tramp-methods (cons '("method") tramp-methods)))
(should
@@ -2085,6 +2168,8 @@ properly. BODY shall not contain a timeout."
"Check `directory-file-name'.
This checks also `file-name-as-directory', `file-name-directory',
`file-name-nondirectory' and `unhandled-file-name-directory'."
+ (skip-unless (eq tramp-syntax 'default))
+
;; Suppress method name check.
(let ((tramp-methods (cons '("method") tramp-methods)))
(should
@@ -2138,15 +2223,17 @@ This checks also `file-name-as-directory',
`file-name-directory',
;; which ruins the tests.
(let ((non-essential n-e)
(tramp-default-method
- (file-remote-p tramp-test-temporary-file-directory 'method)))
+ (file-remote-p tramp-test-temporary-file-directory 'method))
+ (host (file-remote-p tramp-test-temporary-file-directory 'host)))
(dolist
(file
- `(,(format
- "/%s::"
- (file-remote-p tramp-test-temporary-file-directory 'method))
+ `(,(format "/%s::" tramp-default-method)
,(format
- "/-:%s:"
- (file-remote-p tramp-test-temporary-file-directory 'host))))
+ "/-:%s:"
+ (if (string-match-p tramp-ipv6-regexp host)
+ (concat
+ tramp-prefix-ipv6-format host tramp-postfix-ipv6-format)
+ host))))
(should (string-equal (directory-file-name file) file))
(should
(string-equal
@@ -2233,7 +2320,8 @@ This checks also `file-name-as-directory',
`file-name-directory',
(skip-unless (tramp--test-enabled))
(dolist (quoted (if (tramp--test-expensive-test) '(nil t) '(nil)))
- (let ((tmp-name (tramp--test-make-temp-name nil quoted)))
+ (let ((tmp-name (tramp--test-make-temp-name nil quoted))
+ (inhibit-message t))
(unwind-protect
(progn
;; Write buffer. Use absolute and relative file name.
@@ -2300,7 +2388,8 @@ This checks also `file-name-as-directory',
`file-name-directory',
(string-match
(if (and (null noninteractive)
(or (eq visit t) (null visit) (stringp visit)))
- (format "^Wrote %s\n\\'" tmp-name) "^\\'")
+ (format "^Wrote %s\n\\'" (regexp-quote tmp-name))
+ "^\\'")
tramp--test-messages))))))))
;; Do not overwrite if excluded.
@@ -2332,6 +2421,7 @@ This checks also `file-name-as-directory',
`file-name-directory',
(skip-unless (tramp--test-emacs27-p))
(let* ((tmp-name (tramp--test-make-temp-name))
+ (inhibit-message t)
written-files
(advice (lambda (_start _end filename &rest _r)
(push filename written-files))))
@@ -2812,8 +2902,7 @@ This tests also `file-directory-p' and
`file-accessible-directory-p'."
(sort (copy-sequence `(,tmp-name3 ,tmp-name4)) 'string<))))
;; Cleanup.
- (ignore-errors
- (delete-directory tmp-name1 'recursive))))))
+ (ignore-errors (delete-directory tmp-name1 'recursive))))))
(ert-deftest tramp-test17-insert-directory ()
"Check `insert-directory'."
@@ -2887,6 +2976,8 @@ This tests also `file-directory-p' and
`file-accessible-directory-p'."
(ert-deftest tramp-test17-dired-with-wildcards ()
"Check `dired' with wildcards."
+ ;; `separate' syntax and IPv6 host name syntax do not work.
+ (skip-unless (not (string-match-p "\\["
tramp-test-temporary-file-directory)))
(skip-unless (tramp--test-enabled))
(skip-unless (tramp--test-sh-p))
(skip-unless (not (tramp--test-rsync-p)))
@@ -3166,7 +3257,7 @@ They might differ only in time attributes or directory
size."
(when (< start-time
(float-time (tramp-compat-file-attribute-modification-time attr2)))
(setcar (nthcdr 5 attr2) tramp-time-dont-know))
- ;; Status change time. Dito.
+ ;; Status change time. Ditto.
(when (or (tramp-compat-time-equal-p
(tramp-compat-file-attribute-status-change-time attr1)
tramp-time-dont-know)
@@ -3459,18 +3550,20 @@ This tests also `make-symbolic-link', `file-truename'
and `add-name-to-file'."
(should (file-equal-p tmp-name1 tmp-name2))
;; Symbolic links could look like a remote file name.
;; They must be quoted then.
- (delete-file tmp-name2)
- (make-symbolic-link
- (funcall
- (if quoted #'tramp-compat-file-name-unquote #'identity)
- "/penguin:motd:")
- tmp-name2)
- (should (file-symlink-p tmp-name2))
- (should
- (string-equal
- (file-truename tmp-name2)
- (tramp-compat-file-name-quote
- (concat (file-remote-p tmp-name2) "/penguin:motd:"))))
+ (let ((penguin
+ (if (eq tramp-syntax 'separate)
+ "/[penguin/motd]" "/penguin:motd:")))
+ (delete-file tmp-name2)
+ (make-symbolic-link
+ (funcall
+ (if quoted #'tramp-compat-file-name-unquote #'identity) penguin)
+ tmp-name2)
+ (should (file-symlink-p tmp-name2))
+ (should
+ (string-equal
+ (file-truename tmp-name2)
+ (tramp-compat-file-name-quote
+ (concat (file-remote-p tmp-name2) penguin)))))
;; `tmp-name3' is a local file name.
;; `make-symbolic-link' might not be permitted on w32 systems.
(unless (tramp--test-windows-nt)
@@ -3878,7 +3971,14 @@ This tests also `make-symbolic-link', `file-truename'
and `add-name-to-file'."
(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))
+ ;; This is needed for the IPv6 host name syntax.
+ (ipv6-prefix
+ (and (string-match-p tramp-ipv6-regexp host)
+ tramp-prefix-ipv6-format))
+ (ipv6-postfix
+ (and (string-match-p tramp-ipv6-regexp host)
+ tramp-postfix-ipv6-format)))
;; Complete method name.
(unless (or (zerop (length method))
(zerop (length tramp-method-regexp)))
@@ -3897,11 +3997,11 @@ This tests also `make-symbolic-link', `file-truename'
and `add-name-to-file'."
(member
(concat
prefix-format method-marker tramp-postfix-method-format
- host tramp-postfix-host-format)
+ ipv6-prefix host ipv6-postfix tramp-postfix-host-format)
(file-name-all-completions
(concat
prefix-format method-marker tramp-postfix-method-format
- (substring host 0 1))
+ ipv6-prefix (substring host 0 1))
"/")))))
;; Complete host name.
(unless (or (zerop (length method))
@@ -3912,7 +4012,7 @@ This tests also `make-symbolic-link', `file-truename' and
`add-name-to-file'."
(member
(concat
prefix-format method tramp-postfix-method-format
- host tramp-postfix-host-format)
+ ipv6-prefix host ipv6-postfix tramp-postfix-host-format)
(file-name-all-completions
(concat prefix-format method tramp-postfix-method-format)
"/"))))))
@@ -4150,7 +4250,7 @@ This tests also `make-symbolic-link', `file-truename' and
`add-name-to-file'."
(let ((default-directory tramp-test-temporary-file-directory)
(tmp-name (tramp--test-make-temp-name nil quoted))
kill-buffer-query-functions proc)
- (should-not (with-no-warnings (make-process)))
+ (with-no-warnings (should-not (make-process)))
;; Simple process.
(unwind-protect
@@ -4253,8 +4353,7 @@ This tests also `make-symbolic-link', `file-truename' and
`add-name-to-file'."
;; Process with stderr. tramp-adb.el doesn't support it (yet).
(unless (tramp--test-adb-p)
- (let ((stderr
- (generate-new-buffer (generate-new-buffer-name "stderr"))))
+ (let ((stderr (generate-new-buffer "*stderr*")))
(unwind-protect
(with-temp-buffer
(setq proc
@@ -4357,6 +4456,20 @@ This tests also `make-symbolic-link', `file-truename'
and `add-name-to-file'."
;; Cleanup.
(ignore-errors (delete-file tmp-name)))
+ ;; Test `shell-command' with error buffer.
+ (let ((stderr (generate-new-buffer "*stderr*")))
+ (unwind-protect
+ (with-temp-buffer
+ (shell-command "error" (current-buffer) stderr)
+ (should (= (point-min) (point-max)))
+ (should
+ (string-match
+ "error:.+not found"
+ (with-current-buffer stderr (buffer-string)))))
+
+ ;; Cleanup.
+ (ignore-errors (kill-buffer stderr))))
+
;; Test ordinary `async-shell-command'.
(unwind-protect
(with-temp-buffer
@@ -4374,10 +4487,6 @@ This tests also `make-symbolic-link', `file-truename'
and `add-name-to-file'."
(while
(re-search-forward tramp-display-escape-sequence-regexp nil t)
(replace-match "" nil nil))
- ;; There might be a nasty "Process *Async Shell* finished" message.
- (goto-char (point-min))
- (forward-line)
- (narrow-to-region (point-min) (point))
(should
(string-equal
(format "%s\n" (file-name-nondirectory tmp-name))
@@ -4404,13 +4513,11 @@ This tests also `make-symbolic-link', `file-truename'
and `add-name-to-file'."
(while
(re-search-forward tramp-display-escape-sequence-regexp nil t)
(replace-match "" nil nil))
- ;; There might be a nasty "Process *Async Shell* finished" message.
- (goto-char (point-min))
- (forward-line)
- (narrow-to-region (point-min) (point))
+ ;; We cannot use `string-equal', because tramp-adb.el
+ ;; echoes also the sent string.
(should
- (string-equal
- (format "%s\n" (file-name-nondirectory tmp-name))
+ (string-match
+ (format "\\`%s" (regexp-quote (file-name-nondirectory tmp-name)))
(buffer-string))))
;; Cleanup.
@@ -4520,8 +4627,7 @@ This tests also `make-symbolic-link', `file-truename' and
`add-name-to-file'."
(skip-unless (tramp--test-enabled))
;; We test it only for the mock-up connection; otherwise there might
;; be problems with the used ports.
- (skip-unless (and (eq tramp-syntax 'default)
- (tramp--test-mock-p)))
+ (skip-unless (and (eq tramp-syntax 'default) (tramp--test-mock-p)))
;; We force a reconnect, in order to have a clean environment.
(dolist (dir `(,tramp-test-temporary-file-directory
@@ -4566,6 +4672,7 @@ This tests also `make-symbolic-link', `file-truename' and
`add-name-to-file'."
(tmp-name2 (expand-file-name "foo" tmp-name1))
(enable-local-variables :all)
(enable-remote-dir-locals t)
+ (inhibit-message t)
kill-buffer-query-functions
connection-local-profile-alist connection-local-criteria-alist)
(unwind-protect
@@ -4797,6 +4904,7 @@ This tests also `make-symbolic-link', `file-truename' and
`add-name-to-file'."
(tmp-name1 (tramp--test-make-temp-name nil quoted))
(tmp-name2 (expand-file-name "foo" tmp-name1))
(tramp-remote-process-environment tramp-remote-process-environment)
+ (inhibit-message t)
(vc-handled-backends
(with-parsed-tramp-file-name tramp-test-temporary-file-directory nil
(cond
@@ -4867,23 +4975,25 @@ This tests also `make-symbolic-link', `file-truename'
and `add-name-to-file'."
(unwind-protect
(progn
;; Use default `auto-save-file-name-transforms' mechanism.
- (let (tramp-auto-save-directory)
- (with-temp-buffer
- (setq buffer-file-name tmp-name1)
- (should
- (string-equal
- (make-auto-save-file-name)
- ;; This is taken from original `make-auto-save-file-name'.
- ;; We call `convert-standard-filename', because on
- ;; MS Windows the (local) colons must be replaced by
- ;; exclamation marks.
- (convert-standard-filename
- (expand-file-name
- (format
- "#%s#"
- (subst-char-in-string
- ?/ ?! (replace-regexp-in-string "!" "!!" tmp-name1)))
- temporary-file-directory))))))
+ ;; It isn't prepared for `separate' syntax.
+ (unless (eq tramp-syntax 'separate)
+ (let (tramp-auto-save-directory)
+ (with-temp-buffer
+ (setq buffer-file-name tmp-name1)
+ (should
+ (string-equal
+ (make-auto-save-file-name)
+ ;; This is taken from original `make-auto-save-file-name'.
+ ;; We call `convert-standard-filename', because on
+ ;; MS Windows the (local) colons must be replaced by
+ ;; exclamation marks.
+ (convert-standard-filename
+ (expand-file-name
+ (format
+ "#%s#"
+ (subst-char-in-string
+ ?/ ?! (replace-regexp-in-string "!" "!!" tmp-name1)))
+ temporary-file-directory)))))))
;; No mapping.
(let (tramp-auto-save-directory auto-save-file-name-transforms)
@@ -6002,6 +6112,9 @@ process sentinels. They shall not disturb each other."
;; This test is inspired by Bug#29163.
(ert-deftest tramp-test45-auto-load ()
"Check that Tramp autoloads properly."
+ ;; If we use another syntax but `default', Tramp is already loaded
+ ;; due to the `tramp-change-syntax' call.
+ (skip-unless (eq tramp-syntax 'default))
(skip-unless (tramp--test-enabled))
(let ((default-directory (expand-file-name temporary-file-directory))
@@ -6146,8 +6259,8 @@ Since it unloads Tramp, it shall be the last test to run."
(not (string-match "unload-hook$" (symbol-name x)))
(ert-fail (format "`%s' still bound" x)))))
;; The defstruct `tramp-file-name' and all its internal functions
- ;; shall be purged.
- (should-not (with-no-warnings (cl--find-class 'tramp-file-name)))
+ ;; shall be purged. `cl--find-class' must be protected in Emacs 24.
+ (with-no-warnings (should-not (cl--find-class 'tramp-file-name)))
(mapatoms
(lambda (x)
(and (functionp x)
diff --git a/texi/tramp.texi b/texi/tramp.texi
index 302599b..061d6cd 100644
--- a/texi/tramp.texi
+++ b/texi/tramp.texi
@@ -4083,6 +4083,31 @@ this @code{nil} setting:
@item
+On multi-hop connections, @value{tramp} does not use @command{ssh}
+@code{ControlMaster}
+
+In order to use the @code{ControlMaster} option, @value{tramp} must
+check whether the @command{ssh} client supports this option. This is
+only possible on the local host, for the first hop. @value{tramp}
+does not use this option on proxy hosts.
+
+If you want to use this option also for the other hops, you must
+configure @file{~/.ssh/config} on the proxy host:
+
+@example
+@group
+Host *
+ ControlMaster auto
+ ControlPath tramp.%C
+ ControlPersist no
+@end group
+@end example
+
+Check @command{man ssh_config} whether these options are supported on
+your proxy host.
+
+
+@item
File name completion does not work with @value{tramp}
@acronym{ANSI} escape sequences from the remote shell may cause errors
@@ -4606,6 +4631,12 @@ in @file{.emacs}:
(customize-set-variable 'tramp-default-method "ftp")
@end lisp
+If you want to enable Ange FTP's syntax, add the following form:
+
+@lisp
+(tramp-change-syntax 'simplified)
+@end lisp
+
@item
@vindex tramp-mode
To disable both @value{tramp} (and Ange FTP), set @code{tramp-mode} to
diff --git a/texi/trampver.texi b/texi/trampver.texi
index c2ccf9b..be35101 100644
--- a/texi/trampver.texi
+++ b/texi/trampver.texi
@@ -8,7 +8,7 @@
@c In the Tramp GIT, the version numbers are auto-frobbed from
@c tramp.el, and the bug report address is auto-frobbed from
@c configure.ac.
-@set trampver 2.4.2.5
+@set trampver 2.4.3
@set tramp-bug-report-address tramp-devel@@gnu.org
@set emacsver 24.4
diff --git a/tramp-adb.el b/tramp-adb.el
index b56ffdd..300def1 100644
--- a/tramp-adb.el
+++ b/tramp-adb.el
@@ -58,7 +58,7 @@ It is used for TCP/IP devices."
(defcustom tramp-adb-prompt
"^[[:digit:]]*|?[[:alnum:]\e;[]*@?[[:alnum:]]*[^#\\$]*[#\\$][[:space:]]"
"Regexp used as prompt in almquist shell."
- :type 'string
+ :type 'regexp
:version "24.4"
:group 'tramp)
@@ -1156,8 +1156,7 @@ the exit status is not equal 0, and t otherwise."
(format "%s; echo tramp_exit_status $?" command)
"echo tramp_exit_status $?"))
(with-current-buffer (tramp-get-connection-buffer vec)
- (goto-char (point-max))
- (unless (re-search-backward "tramp_exit_status [0-9]+" nil t)
+ (unless (tramp-search-regexp "tramp_exit_status [0-9]+")
(tramp-error
vec 'file-error "Couldn't find exit status of `%s'" command))
(skip-chars-forward "^ ")
@@ -1191,9 +1190,8 @@ FMT and ARGS are passed to `error'."
(when (re-search-forward prompt (point-at-eol) t)
(forward-line 1)
(delete-region (point-min) (point)))
- (goto-char (point-max))
- (re-search-backward prompt nil t)
- (delete-region (point) (point-max)))
+ (when (tramp-search-regexp prompt)
+ (delete-region (point) (point-max))))
(if timeout
(tramp-error
proc 'file-error
diff --git a/tramp-cmds.el b/tramp-cmds.el
index 96b11c7..607b025 100644
--- a/tramp-cmds.el
+++ b/tramp-cmds.el
@@ -359,7 +359,7 @@ The remote connection identified by SOURCE is flushed by
;; Append local file name if none is specified.
(when (string-equal (file-remote-p target) target)
(setq target (concat target (file-remote-p source 'localname))))
- ;; Make them directoy names.
+ ;; Make them directory names.
(setq source (directory-file-name source)
target (directory-file-name target))
diff --git a/tramp-compat.el b/tramp-compat.el
index 169aced..6c8a3f2 100644
--- a/tramp-compat.el
+++ b/tramp-compat.el
@@ -352,6 +352,11 @@ A nil value for either argument stands for the current
time."
(unload-feature 'tramp-loaddefs 'force)
(unload-feature 'tramp-compat 'force)))
+;;; TODO:
+;;
+;; * Starting with Emacs 25.1, replace `tramp-message-show-message' by
+;; the reverse of `inhibit-message'.
+
(provide 'tramp-compat)
;;; tramp-compat.el ends here
diff --git a/tramp-integration.el b/tramp-integration.el
index 0c31076..ad07563 100644
--- a/tramp-integration.el
+++ b/tramp-integration.el
@@ -31,12 +31,20 @@
;; Pacify byte-compiler.
(require 'cl-lib)
+(declare-function info-lookup->cache "info-look")
+(declare-function info-lookup->mode-cache "info-look")
+(declare-function info-lookup->mode-value "info-look")
+(declare-function info-lookup->other-modes "info-look")
+(declare-function info-lookup->topic-cache "info-look")
+(declare-function info-lookup->topic-value "info-look")
+(declare-function info-lookup-maybe-add-help "info-look")
(declare-function recentf-cleanup "recentf")
(declare-function tramp-dissect-file-name "tramp")
(declare-function tramp-file-name-equal-p "tramp")
(declare-function tramp-tramp-file-p "tramp")
(defvar eshell-path-env)
(defvar ido-read-file-name-non-ido)
+(defvar info-lookup-alist)
(defvar ivy-completing-read-handlers-alist)
(defvar recentf-exclude)
(defvar tramp-current-connection)
@@ -176,7 +184,13 @@ NAME must be equal to `tramp-current-connection'."
(with-eval-after-load 'ido
(add-to-list 'ido-read-file-name-non-ido 'tramp-rename-files)
- (add-to-list 'ido-read-file-name-non-ido 'tramp-these-rename-files))
+ (add-to-list 'ido-read-file-name-non-ido 'tramp-these-rename-files)
+ (add-hook 'tramp-integration-unload-hook
+ (lambda ()
+ (setq ido-read-file-name-non-ido
+ (delq 'tramp-these-rename-files ido-read-file-name-non-ido)
+ ido-read-file-name-non-ido
+ (delq 'tramp-rename-files ido-read-file-name-non-ido)))))
;;; Integration of ivy.el:
@@ -184,7 +198,68 @@ NAME must be equal to `tramp-current-connection'."
(add-to-list 'ivy-completing-read-handlers-alist
'(tramp-rename-files . completing-read-default))
(add-to-list 'ivy-completing-read-handlers-alist
- '(tramp-these-rename-files . completing-read-default)))
+ '(tramp-these-rename-files . completing-read-default))
+ (add-hook
+ 'tramp-integration-unload-hook
+ (lambda ()
+ (setq ivy-completing-read-handlers-alist
+ (delete
+ (assq 'tramp-these-rename-files ivy-completing-read-handlers-alist)
+ ivy-completing-read-handlers-alist)
+ ivy-completing-read-handlers-alist
+ (delete
+ (assq 'tramp-rename-files ivy-completing-read-handlers-alist)
+ ivy-completing-read-handlers-alist)))))
+
+;;; Integration of info-look.el:
+
+(with-eval-after-load 'info-look
+ ;; Create a pseudo mode `tramp-info-lookup-mode' for Tramp symbol lookup.
+ (info-lookup-maybe-add-help
+ :mode 'tramp-info-lookup-mode :topic 'symbol
+ :regexp "[^][()`'‘’,\" \t\n]+"
+ :doc-spec '(("(tramp)Function Index" nil "^ -+ .*: " "\\( \\|$\\)")
+ ("(tramp)Variable Index" nil "^ -+ .*: " "\\( \\|$\\)")))
+
+ (add-hook
+ 'tramp-integration-unload-hook
+ (lambda ()
+ (setcdr (assq 'symbol info-lookup-alist)
+ (delete (info-lookup->mode-value 'symbol 'tramp-info-lookup-mode)
+ (info-lookup->topic-value 'symbol)))
+ (setcdr (info-lookup->cache 'symbol)
+ (delete (info-lookup->mode-cache 'symbol 'tramp-info-lookup-mode)
+ (info-lookup->topic-cache 'symbol)))))
+
+ (dolist (mode (mapcar 'car (info-lookup->topic-value 'symbol)))
+ ;; Add `tramp-info-lookup-mode' to `other-modes' for either
+ ;; `emacs-lisp-mode' itself, or to modes which use
+ ;; `emacs-lisp-mode' as `other-modes'. Reset `info-lookup-cache'.
+ (when (and (or (equal mode 'emacs-lisp-mode)
+ (memq
+ 'emacs-lisp-mode (info-lookup->other-modes 'symbol mode)))
+ (not (memq 'tramp-info-lookup-mode
+ (info-lookup->other-modes 'symbol mode))))
+ (setcdr (info-lookup->mode-value 'symbol mode)
+ (append (butlast (cdr (info-lookup->mode-value 'symbol mode)))
+ `((tramp-info-lookup-mode
+ . ,(info-lookup->other-modes 'symbol mode)))))
+ (setcdr (info-lookup->cache 'symbol)
+ (delete (info-lookup->mode-cache 'symbol mode)
+ (info-lookup->topic-cache 'symbol)))
+
+ (add-hook
+ 'tramp-integration-unload-hook
+ `(lambda ()
+ (setcdr (info-lookup->mode-value 'symbol ',mode)
+ (append (butlast
+ (cdr (info-lookup->mode-value 'symbol ',mode)))
+ (list
+ (delq 'tramp-info-lookup-mode
+ (info-lookup->other-modes 'symbol ',mode)))))
+ (setcdr (info-lookup->cache 'symbol)
+ (delete (info-lookup->mode-cache 'symbol ',mode)
+ (info-lookup->topic-cache 'symbol))))))))
;;; Default connection-local variables for Tramp:
diff --git a/tramp-loaddefs.el b/tramp-loaddefs.el
index 50fbb47..cfa7d1a 100644
--- a/tramp-loaddefs.el
+++ b/tramp-loaddefs.el
@@ -653,7 +653,7 @@ UU-encode the region between BEG and END.
;;;### (autoloads nil "trampver" "trampver.el" (0 0 0 0))
;;; Generated autoloads from trampver.el
-(defconst tramp-version "2.4.2.5" "\
+(defconst tramp-version "2.4.3" "\
This version of Tramp.")
(defconst tramp-bug-report-address "address@hidden" "\
diff --git a/tramp-sh.el b/tramp-sh.el
index 59a93a8..506c33d 100644
--- a/tramp-sh.el
+++ b/tramp-sh.el
@@ -3463,91 +3463,97 @@ the result will be a local, non-Tramp, file name."
;; can reset the file name handlers, and we make a second run of
;; `vc-registered', which returns the expected result without sending
;; any other remote command.
+;; When called during `revert-buffer', it shouldn't spam the echo area
+;; and the *Messages* buffer.
(defun tramp-sh-handle-vc-registered (file)
"Like `vc-registered' for Tramp files."
(when vc-handled-backends
- (with-temp-message ""
- (with-parsed-tramp-file-name file nil
- (with-tramp-progress-reporter
- v 3 (format-message "Checking `vc-registered' for %s" file)
-
- ;; There could be new files, created by the vc backend. We
- ;; cannot reuse the old cache entries, therefore. In
- ;; `tramp-get-file-property', `remote-file-name-inhibit-cache'
- ;; could also be a timestamp as `current-time' returns. This
- ;; means invalidate all cache entries with an older timestamp.
- (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))))
-
- ;; Here we collect only file names, which need an operation.
- (tramp-with-demoted-errors
- v "Error in 1st pass of `vc-registered': %s"
- (tramp-run-real-handler #'vc-registered (list file)))
- (tramp-message v 10 "\n%s" tramp-vc-registered-file-names)
-
- ;; Send just one command, in order to fill the cache.
- (when tramp-vc-registered-file-names
- (tramp-maybe-send-script
- v
- (format tramp-vc-registered-read-file-names
- (tramp-get-file-exists-command v)
- (format "%s -r" (tramp-get-test-command v)))
- "tramp_vc_registered_read_file_names")
-
- (dolist
- (elt
- (ignore-errors
- ;; We cannot use `tramp-send-command-and-read',
- ;; because this does not cooperate well with
- ;; heredoc documents.
- (tramp-send-command
- v
- (format
- "tramp_vc_registered_read_file_names <<'%s'\n%s\n%s\n"
- tramp-end-of-heredoc
- (mapconcat #'tramp-shell-quote-argument
- tramp-vc-registered-file-names
- "\n")
- tramp-end-of-heredoc))
- (with-current-buffer (tramp-get-connection-buffer v)
- ;; Read the expression.
- (goto-char (point-min))
- (read (current-buffer)))))
-
- (tramp-set-file-property
- v (car elt) (cadr elt) (cadr (cdr elt))))))
-
- ;; Second run. Now all `file-exists-p' or `file-readable-p'
- ;; calls shall be answered from the file cache. We unset
- ;; `process-file-side-effects' and `remote-file-name-inhibit-cache'
- ;; in order to keep the cache.
- (let ((vc-handled-backends vc-handled-backends)
- remote-file-name-inhibit-cache process-file-side-effects)
- ;; Reduce `vc-handled-backends' in order to minimize process calls.
- (when (and (memq 'Bzr vc-handled-backends)
- (boundp 'vc-bzr-program)
- (not (with-tramp-connection-property v vc-bzr-program
- (tramp-find-executable
- v vc-bzr-program (tramp-get-remote-path v)))))
- (setq vc-handled-backends (remq 'Bzr vc-handled-backends)))
- (when (and (memq 'Git vc-handled-backends)
- (boundp 'vc-git-program)
- (not (with-tramp-connection-property v vc-git-program
- (tramp-find-executable
- v vc-git-program (tramp-get-remote-path v)))))
- (setq vc-handled-backends (remq 'Git vc-handled-backends)))
- (when (and (memq 'Hg vc-handled-backends)
- (boundp 'vc-hg-program)
- (not (with-tramp-connection-property v vc-hg-program
- (tramp-find-executable
- v vc-hg-program (tramp-get-remote-path v)))))
- (setq vc-handled-backends (remq 'Hg vc-handled-backends)))
- ;; Run.
- (tramp-with-demoted-errors
- v "Error in 2nd pass of `vc-registered': %s"
- (tramp-run-real-handler #'vc-registered (list file)))))))))
+ (let ((tramp-message-show-message
+ (and (not revert-buffer-in-progress-p) tramp-message-show-message))
+ (temp-message (unless revert-buffer-in-progress-p "")))
+ (with-temp-message temp-message
+ (with-parsed-tramp-file-name file nil
+ (with-tramp-progress-reporter
+ v 3 (format-message "Checking `vc-registered' for %s" file)
+
+ ;; There could be new files, created by the vc backend.
+ ;; We cannot reuse the old cache entries, therefore. In
+ ;; `tramp-get-file-property', `remote-file-name-inhibit-cache'
+ ;; could also be a timestamp as `current-time' returns. This
+ ;; means invalidate all cache entries with an older timestamp.
+ (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))))
+
+ ;; Here we collect only file names, which need an operation.
+ (tramp-with-demoted-errors
+ v "Error in 1st pass of `vc-registered': %s"
+ (tramp-run-real-handler #'vc-registered (list file)))
+ (tramp-message v 10 "\n%s" tramp-vc-registered-file-names)
+
+ ;; Send just one command, in order to fill the cache.
+ (when tramp-vc-registered-file-names
+ (tramp-maybe-send-script
+ v
+ (format tramp-vc-registered-read-file-names
+ (tramp-get-file-exists-command v)
+ (format "%s -r" (tramp-get-test-command v)))
+ "tramp_vc_registered_read_file_names")
+
+ (dolist
+ (elt
+ (ignore-errors
+ ;; We cannot use `tramp-send-command-and-read',
+ ;; because this does not cooperate well with
+ ;; heredoc documents.
+ (tramp-send-command
+ v
+ (format
+ "tramp_vc_registered_read_file_names <<'%s'\n%s\n%s\n"
+ tramp-end-of-heredoc
+ (mapconcat #'tramp-shell-quote-argument
+ tramp-vc-registered-file-names
+ "\n")
+ tramp-end-of-heredoc))
+ (with-current-buffer (tramp-get-connection-buffer v)
+ ;; Read the expression.
+ (goto-char (point-min))
+ (read (current-buffer)))))
+
+ (tramp-set-file-property
+ v (car elt) (cadr elt) (cadr (cdr elt))))))
+
+ ;; Second run. Now all `file-exists-p' or `file-readable-p'
+ ;; calls shall be answered from the file cache. We unset
+ ;; `process-file-side-effects' and `remote-file-name-inhibit-cache'
+ ;; in order to keep the cache.
+ (let ((vc-handled-backends vc-handled-backends)
+ remote-file-name-inhibit-cache process-file-side-effects)
+ ;; Reduce `vc-handled-backends' in order to minimize
+ ;; process calls.
+ (when (and (memq 'Bzr vc-handled-backends)
+ (boundp 'vc-bzr-program)
+ (not (with-tramp-connection-property v vc-bzr-program
+ (tramp-find-executable
+ v vc-bzr-program (tramp-get-remote-path v)))))
+ (setq vc-handled-backends (remq 'Bzr vc-handled-backends)))
+ (when (and (memq 'Git vc-handled-backends)
+ (boundp 'vc-git-program)
+ (not (with-tramp-connection-property v vc-git-program
+ (tramp-find-executable
+ v vc-git-program (tramp-get-remote-path v)))))
+ (setq vc-handled-backends (remq 'Git vc-handled-backends)))
+ (when (and (memq 'Hg vc-handled-backends)
+ (boundp 'vc-hg-program)
+ (not (with-tramp-connection-property v vc-hg-program
+ (tramp-find-executable
+ v vc-hg-program (tramp-get-remote-path v)))))
+ (setq vc-handled-backends (remq 'Hg vc-handled-backends)))
+ ;; Run.
+ (tramp-with-demoted-errors
+ v "Error in 2nd pass of `vc-registered': %s"
+ (tramp-run-real-handler #'vc-registered (list file))))))))))
;;;###tramp-autoload
(defun tramp-sh-file-name-handler (operation &rest args)
@@ -3799,7 +3805,7 @@ Fall back to normal file name handler if no Tramp handler
exists."
(unless (string-match
(eval-when-compile
(concat "^[^[:blank:]]+"
- "[[:blank:]]+\\([^[:blank:]]+\\)+"
+ "[[:blank:]]+\\([^[:blank:]]+\\)"
"\\([[:blank:]]+\\([^\n\r]+\\)\\)?"))
line)
(tramp-error proc 'file-notify-error "%s" line))
@@ -5096,9 +5102,8 @@ function waits for output unless NOOUTPUT is set."
(forward-line 1)
(delete-region (point-min) (point)))
;; Delete the prompt.
- (goto-char (point-max))
- (re-search-backward regexp nil t)
- (delete-region (point) (point-max)))
+ (when (tramp-search-regexp regexp)
+ (delete-region (point) (point-max))))
(if timeout
(tramp-error
proc 'file-error
@@ -5128,8 +5133,7 @@ DONT-SUPPRESS-ERR is non-nil, stderr won't be sent to
/dev/null."
"echo tramp_exit_status $?"
(if subshell " )" "")))
(with-current-buffer (tramp-get-connection-buffer vec)
- (goto-char (point-max))
- (unless (re-search-backward "tramp_exit_status [0-9]+" nil t)
+ (unless (tramp-search-regexp "tramp_exit_status [0-9]+")
(tramp-error
vec 'file-error "Couldn't find exit status of `%s'" command))
(skip-chars-forward "^ ")
diff --git a/tramp-smb.el b/tramp-smb.el
index 38149da..1a4b63d 100644
--- a/tramp-smb.el
+++ b/tramp-smb.el
@@ -1451,11 +1451,10 @@ component is used as the target of the symlink."
(process-put p 'adjust-window-size-function #'ignore)
(set-process-query-on-exit-flag p nil)
(tramp-process-actions p v nil tramp-smb-actions-set-acl)
- (goto-char (point-max))
;; This is meant for traces, and returning from the
;; function. No error is propagated outside, due to
;; the `ignore-errors' closure.
- (unless (re-search-backward "tramp_exit_status [0-9]+" nil t)
+ (unless (tramp-search-regexp "tramp_exit_status [0-9]+")
(tramp-error
v 'file-error
"Couldn't find exit status of `%s'" tramp-smb-acl-program))
diff --git a/tramp.el b/tramp.el
index c81eaf3..79cc042 100644
--- a/tramp.el
+++ b/tramp.el
@@ -7,8 +7,9 @@
;; Maintainer: Michael Albinus <address@hidden>
;; Keywords: comm, processes
;; Package: tramp
-;; Version: 2.4.2.5
+;; Version: 2.4.3
;; Package-Requires: ((emacs "24.4"))
+;; Package-Type: multi
;; URL: https://savannah.gnu.org/projects/tramp
;; This file is part of GNU Emacs.
@@ -1019,7 +1020,7 @@ See also `tramp-file-name-regexp'.")
(car tramp-file-name-structure))
;;;###autoload
-(defconst tramp-initial-file-name-regexp "\\`/.+:.*:"
+(defconst tramp-initial-file-name-regexp "\\`/[^/:]+:[^/:]*:"
"Value for `tramp-file-name-regexp' for autoload.
It must match the initial `tramp-syntax' settings.")
@@ -3292,10 +3293,16 @@ User is always nil."
(defun tramp-handle-file-name-completion
(filename directory &optional predicate)
"Like `file-name-completion' for Tramp files."
- (let (hits-ignored-extensions)
+ (let (hits-ignored-extensions fnac)
+ (setq fnac (file-name-all-completions filename directory))
+ ;; "." and ".." are never interesting as completions, and are
+ ;; actually in the way in a directory with only one file. See
+ ;; file_name_completion() in dired.c.
+ (when (and (consp fnac) (= (length (delete "./" (delete "../" fnac))) 1))
+ (setq fnac (delete "./" (delete "../" fnac))))
(or
(try-completion
- filename (file-name-all-completions filename directory)
+ filename fnac
(lambda (x)
(when (funcall (or predicate #'identity) (expand-file-name x directory))
(not
@@ -3708,7 +3715,9 @@ support symbolic links."
(setq buffer (if (and (not asynchronous) error-buffer)
(with-parsed-tramp-file-name default-directory nil
- (list output-buffer (tramp-make-tramp-temp-file v)))
+ (list output-buffer
+ (tramp-make-tramp-file-name
+ v (tramp-make-tramp-temp-file v))))
output-buffer))
(if current-buffer-p
@@ -3762,7 +3771,7 @@ support symbolic links."
(defun tramp-handle-start-file-process (name buffer program &rest args)
"Like `start-file-process' for Tramp files."
- ;; `make-process' knows the `:file-error' argument since Emacs 27.1.
+ ;; `make-process' knows the `:file-handler' argument since Emacs 27.1 only.
(tramp-file-name-handler
'make-process
:name name
@@ -4196,19 +4205,36 @@ for process communication also."
(buffer-string))
result)))
+(defun tramp-search-regexp (regexp)
+ "Search for REGEXP backwards, starting at point-max.
+If found, set point to the end of the occurrence found, and return point.
+Otherwise, return nil."
+ (goto-char (point-max))
+ ;; We restrict ourselves to the last 256 characters. There were
+ ;; reports of a shell command "git ls-files -zco --exclude-standard"
+ ;; with 85k files involved, which has blocked Tramp forever.
+ (re-search-backward regexp (max (point-min) (- (point) 256)) 'noerror))
+
(defun tramp-check-for-regexp (proc regexp)
"Check, whether REGEXP is contained in process buffer of PROC.
Erase echoed commands if exists."
(with-current-buffer (process-buffer proc)
(goto-char (point-min))
- ;; Check whether we need to remove echo output.
+ ;; Check whether we need to remove echo output. The max length of
+ ;; the echo mark regexp is taken for search. We restrict the
+ ;; search for the second echo mark to PIPE_BUF characters.
(when (and (tramp-get-connection-property proc "check-remote-echo" nil)
- (re-search-forward tramp-echoed-echo-mark-regexp nil t))
+ (re-search-forward
+ tramp-echoed-echo-mark-regexp
+ (+ (point) (* 5 tramp-echo-mark-marker-length)) t))
(let ((begin (match-beginning 0)))
- (when (re-search-forward tramp-echoed-echo-mark-regexp nil t)
+ (when
+ (re-search-forward
+ tramp-echoed-echo-mark-regexp
+ (+ (point) (tramp-get-connection-property proc "pipe-buf" 4096)) t)
;; Discard echo from remote output.
- (tramp-set-connection-property proc "check-remote-echo" nil)
+ (tramp-flush-connection-property proc "check-remote-echo")
(tramp-message proc 5 "echo-mark found")
(forward-line 1)
(delete-region begin (point))
@@ -4229,8 +4255,7 @@ Erase echoed commands if exists."
;; overflow in regexp matcher". For example, //DIRED// lines of
;; directory listings with some thousand files. Therefore, we
;; look from the end.
- (goto-char (point-max))
- (ignore-errors (re-search-backward regexp nil t)))))
+ (tramp-search-regexp regexp))))
(defun tramp-wait-for-regexp (proc timeout regexp)
"Wait for a REGEXP to appear from process PROC within TIMEOUT seconds.
@@ -4312,15 +4337,16 @@ the remote host use line-endings as defined in the
variable
"Flush file caches and remove shell prompt."
(unless (process-live-p proc)
(let ((vec (process-get proc 'vector))
+ (buf (process-buffer proc))
(prompt (tramp-get-connection-property proc "prompt" nil)))
(when vec
(tramp-message vec 5 "Sentinel called: `%S' `%s'" proc event)
(tramp-flush-connection-properties proc)
(tramp-flush-directory-properties vec ""))
- (with-current-buffer (process-buffer proc)
- (goto-char (point-max))
- (when (and prompt (re-search-backward (regexp-quote prompt) nil t))
- (delete-region (point) (point-max)))))))
+ (when (buffer-live-p buf)
+ (with-current-buffer buf
+ (when (and prompt (tramp-search-regexp (regexp-quote prompt)))
+ (delete-region (point) (point-max))))))))
(defun tramp-get-inode (vec)
"Return the virtual inode number.
@@ -4987,12 +5013,14 @@ name of a process or buffer, or nil to default to the
current buffer."
;; - Reset `file-name-handler-alist'
;; - Cleanup hooks where Tramp functions are in
;; - Cleanup autoloads
+;; We must autoload the function body. Otherwise, Tramp would be
+;; loaded unconditionally if somebody calls `tramp-unload-tramp'.
;;;###autoload
-(defun tramp-unload-tramp ()
+(progn (defun tramp-unload-tramp ()
"Discard Tramp from loading remote files."
(interactive)
;; Maybe it's not loaded yet.
- (ignore-errors (unload-feature 'tramp 'force)))
+ (ignore-errors (unload-feature 'tramp 'force))))
(provide 'tramp)
diff --git a/tramp.info b/tramp.info
index c973fef..3e66ced 100644
--- a/tramp.info
+++ b/tramp.info
@@ -21,10 +21,10 @@ END-INFO-DIR-ENTRY
File: tramp.info, Node: Top, Next: Overview, Prev: (dir), Up: (dir)
-TRAMP 2.4.2.5 User Manual
-*************************
+TRAMP 2.4.3 User Manual
+***********************
-This file documents TRAMP 2.4.2.5, a remote file editing package for
+This file documents TRAMP 2.4.3, a remote file editing package for
Emacs.
TRAMP stands for “Transparent Remote (file) Access, Multiple
@@ -3037,6 +3037,24 @@ File: tramp.info, Node: Frequently Asked Questions,
Next: Files directories an
(customize-set-variable 'tramp-use-ssh-controlmaster-options nil)
+ • On multi-hop connections, TRAMP does not use ‘ssh’ ‘ControlMaster’
+
+ In order to use the ‘ControlMaster’ option, TRAMP must check
+ whether the ‘ssh’ client supports this option. This is only
+ possible on the local host, for the first hop. TRAMP does not use
+ this option on proxy hosts.
+
+ If you want to use this option also for the other hops, you must
+ configure ‘~/.ssh/config’ on the proxy host:
+
+ Host *
+ ControlMaster auto
+ ControlPath tramp.%C
+ ControlPersist no
+
+ Check ‘man ssh_config’ whether these options are supported on your
+ proxy host.
+
• File name completion does not work with TRAMP
ANSI escape sequences from the remote shell may cause errors in
@@ -3421,6 +3439,11 @@ File: tramp.info, Node: Frequently Asked Questions,
Next: Files directories an
(customize-set-variable 'tramp-default-method "ftp")
+ If you want to enable Ange FTP’s syntax, add the following
+ form:
+
+ (tramp-change-syntax 'simplified)
+
− To disable both TRAMP (and Ange FTP), set ‘tramp-mode’ to
‘nil’ in ‘.emacs’. *Note*, that we don’t use
‘customize-set-variable’, in order to avoid loading TRAMP.
@@ -4124,17 +4147,17 @@ Variable Index
* customize-package-emacs-version-alist: Obtaining TRAMP. (line 20)
* DISPLAY, environment variable: Remote processes. (line 93)
* EDITOR, environment variable: Frequently Asked Questions.
- (line 540)
+ (line 558)
* ENV, environment variable: Remote processes. (line 64)
* ESHELL, environment variable: Remote shell setup. (line 187)
* HGPLAIN, environment variable: Remote processes. (line 82)
* HISTFILE, environment variable: Frequently Asked Questions.
- (line 281)
+ (line 299)
* HISTFILESIZE, environment variable: Frequently Asked Questions.
- (line 281)
+ (line 299)
* HISTORY, environment variable: Remote processes. (line 52)
* HISTSIZE, environment variable: Frequently Asked Questions.
- (line 281)
+ (line 299)
* INSIDE_EMACS, environment variable: Remote shell setup. (line 104)
* INSIDE_EMACS, environment variable <1>: Remote shell setup. (line 187)
* non-essential: External packages. (line 9)
@@ -4184,16 +4207,16 @@ Variable Index
(line 28)
* tramp-gvfs-methods: GVFS-based methods. (line 60)
* tramp-histfile-override: Frequently Asked Questions.
- (line 281)
+ (line 299)
* tramp-ignored-file-name-regexp: Frequently Asked Questions.
- (line 597)
+ (line 620)
* tramp-inline-compress-commands: Inline methods. (line 25)
* tramp-inline-compress-start-size: Inline methods. (line 25)
* tramp-local-host-regexp: Frequently Asked Questions.
(line 165)
* tramp-methods: Customizing Methods. (line 6)
* tramp-mode: Frequently Asked Questions.
- (line 591)
+ (line 614)
* tramp-own-remote-path: Remote programs. (line 32)
* tramp-password-prompt-regexp: Remote shell setup. (line 65)
* tramp-persistency-file-name: Connection caching. (line 6)
@@ -4209,7 +4232,7 @@ Variable Index
(line 188)
* tramp-terminal-type: Remote shell setup. (line 90)
* tramp-theme-face-remapping-alist: Frequently Asked Questions.
- (line 261)
+ (line 279)
* tramp-use-ssh-controlmaster-options: Frequently Asked Questions.
(line 201)
* tramp-verbose: Traces and Profiles. (line 6)
@@ -4526,7 +4549,7 @@ Concept Index
* tgz file archive suffix: Archive file names. (line 71)
* tlz file archive suffix: Archive file names. (line 71)
* TRAMP theme: Frequently Asked Questions.
- (line 261)
+ (line 279)
* tset unix command: Remote shell setup. (line 124)
* txz file archive suffix: Archive file names. (line 71)
* type-ahead: Usage. (line 12)
@@ -4550,61 +4573,61 @@ Concept Index
Tag Table:
Node: Top933
-Node: Overview5421
-Node: Obtaining TRAMP10755
-Node: Quick Start Guide13202
-Ref: Quick Start Guide: File name syntax13979
-Ref: Quick Start Guide: ssh and plink methods15081
-Ref: Quick Start Guide: su, sudo and sg methods15625
-Ref: Quick Start Guide: ssh, plink, su, sudo and sg methods16189
-Ref: Quick Start Guide: sudoedit method16719
-Ref: Quick Start Guide: smb method17130
-Ref: Quick Start Guide: GVFS-based methods17461
-Ref: Quick Start Guide: GNOME Online Accounts based methods17857
-Ref: Quick Start Guide: Android18399
-Ref: Quick Start Guide: rclone method18631
-Node: Configuration18958
-Node: Connection types21430
-Node: Inline methods22844
-Node: External methods27806
-Node: GVFS-based methods38444
-Node: Default Method41713
-Node: Default User44730
-Node: Default Host46259
-Node: Multi-hops47391
-Node: Firewalls51583
-Node: Customizing Methods53040
-Node: Customizing Completion55380
-Node: Password handling58870
-Ref: Using an authentication file59340
-Ref: Caching passwords60842
-Node: Connection caching61360
-Node: Predefined connection information62290
-Node: Remote programs66164
-Node: Remote shell setup69085
-Node: Android shell setup78701
-Node: Auto-save and Backup81088
-Node: Windows setup hints84163
-Node: Usage85783
-Node: File name syntax87136
-Node: Change file name syntax89143
-Node: File name completion90574
-Node: Ad-hoc multi-hops93729
-Node: Remote processes95795
-Ref: Running a debugger on a remote host104553
-Node: Cleanup remote connections106523
-Node: Renaming remote files108224
-Node: Archive file names112443
-Node: Bug Reports116808
-Node: Frequently Asked Questions119190
-Node: Files directories and localnames142269
-Node: Localname deconstruction142705
-Node: External packages143358
-Node: Traces and Profiles145403
-Node: GNU Free Documentation License147372
-Node: Function Index172743
-Node: Variable Index175621
-Node: Concept Index183230
+Node: Overview5415
+Node: Obtaining TRAMP10749
+Node: Quick Start Guide13196
+Ref: Quick Start Guide: File name syntax13973
+Ref: Quick Start Guide: ssh and plink methods15075
+Ref: Quick Start Guide: su, sudo and sg methods15619
+Ref: Quick Start Guide: ssh, plink, su, sudo and sg methods16183
+Ref: Quick Start Guide: sudoedit method16713
+Ref: Quick Start Guide: smb method17124
+Ref: Quick Start Guide: GVFS-based methods17455
+Ref: Quick Start Guide: GNOME Online Accounts based methods17851
+Ref: Quick Start Guide: Android18393
+Ref: Quick Start Guide: rclone method18625
+Node: Configuration18952
+Node: Connection types21424
+Node: Inline methods22838
+Node: External methods27800
+Node: GVFS-based methods38438
+Node: Default Method41707
+Node: Default User44724
+Node: Default Host46253
+Node: Multi-hops47385
+Node: Firewalls51577
+Node: Customizing Methods53034
+Node: Customizing Completion55374
+Node: Password handling58864
+Ref: Using an authentication file59334
+Ref: Caching passwords60836
+Node: Connection caching61354
+Node: Predefined connection information62284
+Node: Remote programs66158
+Node: Remote shell setup69079
+Node: Android shell setup78695
+Node: Auto-save and Backup81082
+Node: Windows setup hints84157
+Node: Usage85777
+Node: File name syntax87130
+Node: Change file name syntax89137
+Node: File name completion90568
+Node: Ad-hoc multi-hops93723
+Node: Remote processes95789
+Ref: Running a debugger on a remote host104547
+Node: Cleanup remote connections106517
+Node: Renaming remote files108218
+Node: Archive file names112437
+Node: Bug Reports116802
+Node: Frequently Asked Questions119184
+Node: Files directories and localnames143070
+Node: Localname deconstruction143506
+Node: External packages144159
+Node: Traces and Profiles146204
+Node: GNU Free Documentation License148173
+Node: Function Index173544
+Node: Variable Index176422
+Node: Concept Index184031
End Tag Table
diff --git a/trampver.el b/trampver.el
index d13d5f9..9c04b61 100644
--- a/trampver.el
+++ b/trampver.el
@@ -35,8 +35,11 @@
;; Emacs version check is defined in macro AC_EMACS_INFO of
;; aclocal.m4; should be changed only there.
+;; Needed for Emacs 24.
+(defvar inhibit-message)
+
;;;###tramp-autoload
-(defconst tramp-version "2.4.2.5"
+(defconst tramp-version "2.4.3"
"This version of Tramp.")
;;;###tramp-autoload
@@ -70,7 +73,7 @@
;; Check for Emacs version.
(let ((x (if (not (string-lessp emacs-version "24.4"))
"ok"
- (format "Tramp 2.4.2.5 is not fit for %s"
+ (format "Tramp 2.4.3 is not fit for %s"
(replace-regexp-in-string "\n" "" (emacs-version))))))
(unless (string-equal "ok" x) (error "%s" x)))
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [elpa] externals/tramp 4d846b9: Tramp ELPA version 2.4.3 released,
Michael Albinus <=