emacs-elpa-diffs
[Top][All Lists]
Advanced

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

[elpa] externals/tramp 1e5bbe5eca: Tramp ELPA version 2.6.0.3 released


From: ELPA Syncer
Subject: [elpa] externals/tramp 1e5bbe5eca: Tramp ELPA version 2.6.0.3 released
Date: Thu, 30 Mar 2023 04:00:21 -0400 (EDT)

branch: externals/tramp
commit 1e5bbe5eca67973c26f4e4e62d42ba30ba01584b
Author: Michael Albinus <michael.albinus@gmx.de>
Commit: Michael Albinus <michael.albinus@gmx.de>

    Tramp ELPA version 2.6.0.3 released
---
 README              |   4 +-
 test/tramp-tests.el |  21 +++++
 texi/tramp.texi     |  69 +++++++++-----
 texi/trampver.texi  |   2 +-
 tramp-adb.el        |  55 ++++++------
 tramp-archive.el    |   4 +-
 tramp-cmds.el       |  12 +--
 tramp-crypt.el      |  39 ++++----
 tramp-fuse.el       |  29 +++---
 tramp-gvfs.el       |  51 ++++++-----
 tramp-rclone.el     |   2 +-
 tramp-sh.el         | 252 +++++++++++++++++++++++++---------------------------
 tramp-smb.el        |  42 ++++-----
 tramp-sshfs.el      |   2 +-
 tramp-sudoedit.el   |  45 +++++-----
 tramp.el            |  70 +++++++++------
 trampver.el         |   6 +-
 17 files changed, 394 insertions(+), 311 deletions(-)

diff --git a/README b/README
index 1e98046a96..1cfa2b619c 100644
--- a/README
+++ b/README
@@ -22,11 +22,11 @@ installed with, you must recompile the package:
 
    * Remove all byte-compiled Tramp files
 
-          $ rm -f ~/.emacs.d/elpa/tramp-2.6.0.2/tramp*.elc
+          $ rm -f ~/.emacs.d/elpa/tramp-2.6.0.3/tramp*.elc
 
    * Start Emacs with Tramp's source files
 
-          $ emacs -L ~/.emacs.d/elpa/tramp-2.6.0.2 -l tramp
+          $ emacs -L ~/.emacs.d/elpa/tramp-2.6.0.3 -l tramp
 
      This should not give you the error.
 
diff --git a/test/tramp-tests.el b/test/tramp-tests.el
index 1bcbad7cec..512d45c814 100644
--- a/test/tramp-tests.el
+++ b/test/tramp-tests.el
@@ -4589,6 +4589,13 @@ This tests also `make-symbolic-link', `file-truename' 
and `add-name-to-file'."
              (should (equal (file-name-completion "foo" tmp-name) t))
              (should (equal (file-name-completion "b" tmp-name) "bo"))
              (should-not (file-name-completion "a" tmp-name))
+             ;; `file-name-completion' should not err out if
+             ;; directory does not exist.  (Bug#61890)
+             ;; Ange-FTP does not support this.
+             (unless (tramp--test-ange-ftp-p)
+               (should-not
+                (file-name-completion
+                 "a" (tramp-compat-file-name-concat tmp-name "fuzz"))))
              ;; Ange-FTP does not support predicates.
              (unless (tramp--test-ange-ftp-p)
                (should
@@ -4634,6 +4641,10 @@ This tests also `make-symbolic-link', `file-truename' 
and `add-name-to-file'."
          ;; Cleanup.
          (ignore-errors (delete-directory tmp-name 'recursive)))))))
 
+(tramp--test-deftest-with-perl tramp-test26-file-name-completion)
+
+(tramp--test-deftest-with-ls tramp-test26-file-name-completion)
+
 ;; This test is inspired by Bug#51386, Bug#52758, Bug#53513, Bug#54042
 ;; and Bug#60505.
 (ert-deftest tramp-test26-interactive-file-name-completion ()
@@ -6005,6 +6016,8 @@ INPUT, if non-nil, is a string sent to the process."
         (enable-remote-dir-locals t)
          (inhibit-message t)
         kill-buffer-query-functions
+        (clpa connection-local-profile-alist)
+        (clca connection-local-criteria-alist)
         connection-local-profile-alist connection-local-criteria-alist)
     (unwind-protect
        (progn
@@ -6053,6 +6066,9 @@ INPUT, if non-nil, is a string sent to the process."
            (kill-buffer (current-buffer))))
 
       ;; Cleanup.
+      (custom-set-variables
+       `(connection-local-profile-alist ',clpa now)
+       `(connection-local-criteria-alist ',clca now))
       (ignore-errors (delete-directory tmp-name1 'recursive)))))
 
 (ert-deftest tramp-test34-explicit-shell-file-name ()
@@ -6067,6 +6083,8 @@ INPUT, if non-nil, is a string sent to the process."
 
   (let ((default-directory ert-remote-temporary-file-directory)
        explicit-shell-file-name kill-buffer-query-functions
+       (clpa connection-local-profile-alist)
+       (clca connection-local-criteria-alist)
        connection-local-profile-alist connection-local-criteria-alist)
     (unwind-protect
        (progn
@@ -6101,6 +6119,9 @@ INPUT, if non-nil, is a string sent to the process."
 
       ;; Cleanup.
       (put 'explicit-shell-file-name 'permanent-local nil)
+      (custom-set-variables
+       `(connection-local-profile-alist ',clpa now)
+       `(connection-local-criteria-alist ',clca now))
       (kill-buffer "*shell*"))))
 
 ;; `exec-path' was introduced in Emacs 27.1.  `executable-find' has
diff --git a/texi/tramp.texi b/texi/tramp.texi
index 95844f372d..8917b47e0d 100644
--- a/texi/tramp.texi
+++ b/texi/tramp.texi
@@ -1236,6 +1236,7 @@ syntax requires a leading volume (share) name, for 
example:
 
 @item @option{dav}
 @item @option{davs}
+@cindex WebDAV
 @cindex method @option{dav}
 @cindex method @option{davs}
 @cindex @option{dav} method
@@ -1492,8 +1493,10 @@ access and it has the most reasonable security 
protocols, use
 @end example
 
 If @option{ssh} is unavailable for whatever reason, look for other
-obvious options.  For MS Windows, try the @option{plink} method.  For
-Kerberos, try @option{krlogin}.
+obvious options.  For MS Windows, try the @option{plink}
+method@footnote{This shouldn't be needed with recent @code{OpenSSH}
+versions for MS Windows.  Use method @option{sshx}.}.  For Kerberos,
+try @option{krlogin}.
 
 For editing local files as @option{su} or @option{sudo} methods, try
 the shortened syntax of @samp{root}:
@@ -2369,10 +2372,11 @@ This uses also the settings in 
@code{tramp-sh-extra-args}.
 @vindex RemoteCommand@r{, ssh option}
 @strong{Note}: If you use an @option{ssh}-based method for connection,
 do @emph{not} set the @option{RemoteCommand} option in your
-@command{ssh} configuration, for example to @command{screen}.  On the
-other hand, some @option{ssh}-based methods, like @option{sshx} or
-@option{scpx}, silently overwrite a @option{RemoteCommand} option of
-the configuration file.
+@command{ssh} configuration to something like @command{screen}.  If
+used, @option{RemoteCommand} must open an interactive shell on the
+remote host.  On the other hand, some @option{ssh}-based methods, like
+@option{sshx} or @option{scpx}, silently overwrite a
+@option{RemoteCommand} option of the configuration file.
 
 
 @subsection Other remote shell setup hints
@@ -2717,6 +2721,7 @@ entry, @option{Seconds between keepalives} option.  Set 
this to 5.
 There is no counter which could be set.
 
 
+@anchor{Using ssh connection sharing}
 @subsection Using ssh connection sharing
 
 @vindex ControlPath@r{, ssh option}
@@ -2747,19 +2752,32 @@ Note how @samp{%r}, @samp{%h} and @samp{%p} must be 
encoded as
 @samp{%%r}, @samp{%%h} and @samp{%%p}.
 
 @vindex tramp-use-ssh-controlmaster-options
-If the @file{~/.ssh/config} file is configured appropriately for the
-above behavior, then any changes to @command{ssh} can be suppressed
-with this @code{nil} setting:
+Using a predefined string in @code{tramp-ssh-controlmaster-options},
+or puzzling an own string, happens only when user option
+@code{tramp-use-ssh-controlmaster-options} is set to @code{t}.  If the
+@file{~/.ssh/config} file is configured appropriately for the above
+behavior, then any changes to @command{ssh} can be suppressed with
+this @code{nil} setting:
 
 @lisp
 (customize-set-variable 'tramp-use-ssh-controlmaster-options nil)
 @end lisp
 
+Sometimes, it is not possible to use OpenSSH's @option{ControlMaster}
+option for remote processes.  This could result in concurrent access
+to the OpenSSH socket when reading data by different processes, which
+could block Emacs.  In this case, setting
+@code{tramp-use-ssh-controlmaster-options} to @code{suppress} disables
+shared access.  It is not needed to set this user option permanently
+to @code{suppress}, binding the user option prior calling
+@code{make-process} is sufficient.  @value{tramp} does this for
+esxample for compilation processes on its own.
+
 @vindex ProxyCommand@r{, ssh option}
 @vindex ProxyJump@r{, ssh option}
-This should also be set to @code{nil} if you use the
-@option{ProxyCommand} or @option{ProxyJump} options in your
-@command{ssh} configuration.
+@code{tramp-use-ssh-controlmaster-options} should also be set to
+@code{nil} or @code{suppress} if you use the @option{ProxyCommand} or
+@option{ProxyJump} options in your @command{ssh} configuration.
 
 In order to use the @option{ControlMaster} option, @value{tramp} must
 check whether the @command{ssh} client supports this option.  This is
@@ -2836,11 +2854,19 @@ When @value{tramp} uses direct remote copying, password 
caches are not
 consulted.
 
 
-@subsection Issues with Cygwin ssh
+@subsection Issues with Cygwin and MS Windows ssh
 @cindex cygwin, issues
+@cindex ms Windows, issues
 
 This section is incomplete.  Please share your solutions.
 
+@cindex ms windows and @command{ssh}
+@cindex ms windows and @command{ssh-agent}
+
+MS Windows' @command{ssh} does not open a remote TTY@.  Use the method
+@option{sshx} or @option{scpx} instead.  Furthermore, it cannot read a
+passphrase for ssh private keys.  Use the MS @code{ssh-agent}.
+
 @cindex method @option{sshx} with cygwin
 @cindex @option{sshx} method with cygwin
 
@@ -2880,13 +2906,15 @@ Windows file names to Cygwin file names.
 @cindex @env{SSH_AUTH_SOCK} and emacs on ms windows
 @vindex SSH_AUTH_SOCK@r{, environment variable}
 
-When using the @command{ssh-agent} on MS Windows for password-less
-interaction, @option{ssh} methods depend on the environment variable
-@env{SSH_AUTH_SOCK}.  But this variable is not set when Emacs is
-started from a Desktop shortcut and authentication fails.
+When using the cygwin @command{ssh-agent} on MS Windows for
+password-less interaction, @option{ssh} methods depend on the
+environment variable @env{SSH_AUTH_SOCK}.  But this variable is not
+set when Emacs is started from a Desktop shortcut and authentication
+fails.
 
-One workaround is to use an MS Windows based SSH Agent, such as
-@command{Pageant}.  It is part of the PuTTY Suite of tools.
+One workaround is to use an MS Windows based SSH Agent, such as the
+native MS @command{ssh-agent} or @command{Pageant}.  The latter is
+part of the PuTTY Suite of tools.
 
 The fallback is to start Emacs from a shell.
 
@@ -4277,7 +4305,8 @@ In order to gain even more performance, it is recommended 
to bind
 @code{start-file-process}.  Furthermore, you might set
 @code{tramp-use-ssh-controlmaster-options} to @code{nil} in order to
 bypass @value{tramp}'s handling of the @option{ControlMaster} options,
-and use your own settings in @file{~/.ssh/config}.
+and use your own settings in @file{~/.ssh/config}, @ref{Using ssh
+connection sharing}.
 
 
 @node Cleanup remote connections
diff --git a/texi/trampver.texi b/texi/trampver.texi
index 4baa0f46f5..754c0670e2 100644
--- a/texi/trampver.texi
+++ b/texi/trampver.texi
@@ -7,7 +7,7 @@
 
 @c In the  Tramp GIT, the version number and the bug report address
 @c are auto-frobbed from configure.ac.
-@set trampver 2.6.0.2
+@set trampver 2.6.0.3
 @set trampurl https://www.gnu.org/software/tramp/
 @set tramp-bug-report-address tramp-devel@@gnu.org
 @set emacsver 26.1
diff --git a/tramp-adb.el b/tramp-adb.el
index e910012d57..58c9324533 100644
--- a/tramp-adb.el
+++ b/tramp-adb.el
@@ -449,31 +449,32 @@ Emacs dired can't find files."
 
 (defun tramp-adb-handle-file-name-all-completions (filename directory)
   "Like `file-name-all-completions' for Tramp files."
-  (all-completions
-   filename
-   (with-parsed-tramp-file-name (expand-file-name directory) nil
-     (with-tramp-file-property v localname "file-name-all-completions"
-       (tramp-adb-send-command
-       v (format "%s -a %s | cat"
-                 (tramp-adb-get-ls-command v)
-                 (tramp-shell-quote-argument localname)))
-       (mapcar
-       (lambda (f)
-         (if (file-directory-p (expand-file-name f directory))
-             (file-name-as-directory f)
-           f))
-       (with-current-buffer (tramp-get-buffer v)
-         (delete-dups
-          (append
-           ;; On some file systems like "sdcard", "." and ".." are
-           ;; not included.  We fix this by `delete-dups'.
-           '("." "..")
-           (delq
-            nil
-            (mapcar
-             (lambda (l)
-               (and (not (string-match-p (rx bol (* blank) eol) l)) l))
-             (split-string (buffer-string) "\n")))))))))))
+  (tramp-compat-ignore-error file-missing
+    (all-completions
+     filename
+     (with-parsed-tramp-file-name (expand-file-name directory) nil
+       (with-tramp-file-property v localname "file-name-all-completions"
+        (tramp-adb-send-command
+         v (format "%s -a %s | cat"
+                   (tramp-adb-get-ls-command v)
+                   (tramp-shell-quote-argument localname)))
+        (mapcar
+         (lambda (f)
+           (if (file-directory-p (expand-file-name f directory))
+               (file-name-as-directory f)
+             f))
+         (with-current-buffer (tramp-get-buffer v)
+           (delete-dups
+            (append
+             ;; On some file systems like "sdcard", "." and ".." are
+             ;; not included.  We fix this by `delete-dups'.
+             '("." "..")
+             (delq
+              nil
+              (mapcar
+               (lambda (l)
+                 (and (not (string-match-p (rx bol (* blank) eol) l)) l))
+               (split-string (buffer-string) "\n"))))))))))))
 
 (defun tramp-adb-handle-file-local-copy (filename)
   "Like `file-local-copy' for Tramp files."
@@ -1016,7 +1017,7 @@ implementation will be used."
                                  (progn
                                    (goto-char (point-min))
                                    (not (search-forward "\n" nil t)))
-                               (tramp-accept-process-output p 0))
+                               (tramp-accept-process-output p))
                              (delete-region (point-min) (point)))
                            ;; Provide error buffer.  This shows only
                            ;; initial error messages; messages
@@ -1275,7 +1276,7 @@ connection if a previous connection has died for some 
reason."
 
            ;; Set sentinel and query flag.  Initialize variables.
            (set-process-sentinel p #'tramp-process-sentinel)
-           (process-put p 'vector vec)
+           (process-put p 'tramp-vector vec)
            (process-put p 'adjust-window-size-function #'ignore)
            (set-process-query-on-exit-flag p nil)
 
diff --git a/tramp-archive.el b/tramp-archive.el
index 5874e18479..72415efdf9 100644
--- a/tramp-archive.el
+++ b/tramp-archive.el
@@ -682,7 +682,9 @@ offered."
 
 (defun tramp-archive-handle-file-name-all-completions (filename directory)
   "Like `file-name-all-completions' for file archives."
-  (file-name-all-completions filename (tramp-archive-gvfs-file-name 
directory)))
+  (tramp-compat-ignore-error file-missing
+    (file-name-all-completions
+     filename (tramp-archive-gvfs-file-name directory))))
 
 (defun tramp-archive-handle-file-readable-p (filename)
   "Like `file-readable-p' for file archives."
diff --git a/tramp-cmds.el b/tramp-cmds.el
index fde814fa5a..9b20bc710f 100644
--- a/tramp-cmds.el
+++ b/tramp-cmds.el
@@ -123,7 +123,7 @@ When called interactively, a Tramp connection has to be 
selected."
     ;; Delete processes.
     (dolist (key (hash-table-keys tramp-cache-data))
       (when (and (processp key)
-                (tramp-file-name-equal-p (process-get key 'vector) vec)
+                (tramp-file-name-equal-p (process-get key 'tramp-vector) vec)
                 (or (not keep-processes)
                     (eq key (tramp-get-process vec))))
        (tramp-flush-connection-properties key)
@@ -319,7 +319,7 @@ The remote connection identified by SOURCE is flushed by
         (read-file-name-function #'read-file-name-default)
          source target)
      (if (null connections)
-        (tramp-user-error nil "There are no remote connections.")
+        (tramp-user-error nil "There are no remote connections")
        (setq source
             ;; Likely, the source remote connection is broken.  So we
             ;; shall avoid any action on it.
@@ -367,15 +367,15 @@ The remote connection identified by SOURCE is flushed by
      (list source target)))
 
   (unless (tramp-tramp-file-p source)
-    (tramp-user-error nil "Source %s must be remote." source))
+    (tramp-user-error nil "Source %s must be remote" source))
   (when (null target)
     (or (setq target (tramp-default-rename-file source))
        (tramp-user-error
         nil
         (concat "There is no target specified.  "
-                "Check `tramp-default-rename-alist' for a proper entry."))))
+                "Check `tramp-default-rename-alist' for a proper entry"))))
   (when (tramp-equal-remote source target)
-    (tramp-user-error nil "Source and target must have different remote."))
+    (tramp-user-error nil "Source and target must have different remote"))
 
   ;; Append local file name if none is specified.
   (when (string-equal (file-remote-p target) target)
@@ -461,7 +461,7 @@ For details, see `tramp-rename-files'."
          nil
          (substitute-command-keys
           (concat "Current buffer is not remote.  "
-                  "Consider `\\[tramp-rename-files]' instead.")))
+                  "Consider `\\[tramp-rename-files]' instead")))
        (setq target
             (when (null current-prefix-arg)
               ;; The source remote connection shall not trigger any action.
diff --git a/tramp-crypt.el b/tramp-crypt.el
index c7696a51da..60f2453222 100644
--- a/tramp-crypt.el
+++ b/tramp-crypt.el
@@ -315,7 +315,7 @@ connection if a previous connection has died for some 
reason."
              :name (tramp-get-connection-name vec)
              :buffer (tramp-get-connection-buffer vec)
              :server t :host 'local :service t :noquery t)))
-      (process-put p 'vector vec)
+      (process-put p 'tramp-vector vec)
       (set-process-query-on-exit-flag p nil)))
 
   ;; The following operations must be performed without
@@ -435,7 +435,7 @@ Otherwise, return NAME."
                     crypt-vec (if (eq op 'encrypt) "encode" "decode")
                     tramp-compat-temporary-file-directory localname)
              (tramp-error
-              crypt-vec 'file-error "%s of file name %s failed."
+              crypt-vec 'file-error "%s of file name %s failed"
               (if (eq op 'encrypt) "Encoding" "Decoding") name))
            (with-current-buffer (tramp-get-connection-buffer crypt-vec)
              (goto-char (point-min))
@@ -470,7 +470,7 @@ Raise an error if this fails."
               (file-name-directory infile)
               (concat "/" (file-name-nondirectory infile)))
        (tramp-error
-        crypt-vec 'file-error "%s of file %s failed."
+        crypt-vec 'file-error "%s of file %s failed"
         (if (eq op 'encrypt) "Encrypting" "Decrypting") infile))
       (with-current-buffer (tramp-get-connection-buffer crypt-vec)
        (write-region nil nil outfile)))))
@@ -494,11 +494,11 @@ directory.  File names will be also encrypted."
   ;; (declare (completion tramp-crypt-command-completion-p))
   (interactive "DRemote directory name: ")
   (unless tramp-crypt-enabled
-    (tramp-user-error nil "Feature is not enabled."))
+    (tramp-user-error nil "Feature is not enabled"))
   (unless (and (tramp-tramp-file-p name) (file-directory-p name))
-    (tramp-user-error nil "%s must be an existing remote directory." name))
+    (tramp-user-error nil "%s must be an existing remote directory" name))
   (when (tramp-compat-file-name-quoted-p name)
-    (tramp-user-error nil "%s must not be quoted." name))
+    (tramp-user-error nil "%s must not be quoted" name))
   (setq name (file-name-as-directory (expand-file-name name)))
   (unless (member name tramp-crypt-directories)
     (setq tramp-crypt-directories (cons name tramp-crypt-directories)))
@@ -517,7 +517,7 @@ kept in their encrypted form."
   ;; (declare (completion tramp-crypt-command-completion-p))
   (interactive "DRemote directory name: ")
   (unless tramp-crypt-enabled
-    (tramp-user-error nil "Feature is not enabled."))
+    (tramp-user-error nil "Feature is not enabled"))
   (setq name (file-name-as-directory (expand-file-name name)))
   (when (and (member name tramp-crypt-directories)
             (delete
@@ -730,18 +730,19 @@ absolute file names."
 
 (defun tramp-crypt-handle-file-name-all-completions (filename directory)
   "Like `file-name-all-completions' for Tramp files."
-  (all-completions
-   filename
-   (let* (completion-regexp-list
-         tramp-crypt-enabled
-         (directory (file-name-as-directory directory))
-         (enc-dir (tramp-crypt-encrypt-file-name directory)))
-     (mapcar
-      (lambda (x)
-       (substring
-        (tramp-crypt-decrypt-file-name (concat enc-dir x))
-        (length directory)))
-      (file-name-all-completions "" enc-dir)))))
+  (tramp-compat-ignore-error file-missing
+    (all-completions
+     filename
+     (let* (completion-regexp-list
+           tramp-crypt-enabled
+           (directory (file-name-as-directory directory))
+           (enc-dir (tramp-crypt-encrypt-file-name directory)))
+       (mapcar
+       (lambda (x)
+         (substring
+          (tramp-crypt-decrypt-file-name (concat enc-dir x))
+          (length directory)))
+       (file-name-all-completions "" enc-dir))))))
 
 (defun tramp-crypt-handle-file-readable-p (filename)
   "Like `file-readable-p' for Tramp files."
diff --git a/tramp-fuse.el b/tramp-fuse.el
index e1ad0c2e5d..36759648b3 100644
--- a/tramp-fuse.el
+++ b/tramp-fuse.el
@@ -100,20 +100,21 @@
 (defun tramp-fuse-handle-file-name-all-completions (filename directory)
   "Like `file-name-all-completions' for Tramp files."
   (tramp-fuse-remove-hidden-files
-   (all-completions
-    filename
-    (delete-dups
-     (append
-      (file-name-all-completions
-       filename (tramp-fuse-local-file-name directory))
-      ;; Some storage systems do not return "." and "..".
-      (let (result)
-       (dolist (item '(".." ".") result)
-         (when (string-prefix-p filename item)
-           (catch 'match
-             (dolist (elt completion-regexp-list)
-               (unless (string-match-p elt item) (throw 'match nil)))
-             (setq result (cons (concat item "/") result)))))))))))
+   (tramp-compat-ignore-error file-missing
+     (all-completions
+      filename
+      (delete-dups
+       (append
+       (file-name-all-completions
+        filename (tramp-fuse-local-file-name directory))
+       ;; Some storage systems do not return "." and "..".
+       (let (result)
+         (dolist (item '(".." ".") result)
+           (when (string-prefix-p filename item)
+             (catch 'match
+               (dolist (elt completion-regexp-list)
+                 (unless (string-match-p elt item) (throw 'match nil)))
+               (setq result (cons (concat item "/") result))))))))))))
 
 ;; This function isn't used.
 (defun tramp-fuse-handle-insert-directory
diff --git a/tramp-gvfs.el b/tramp-gvfs.el
index 10bf9b47f9..00b3ac7775 100644
--- a/tramp-gvfs.el
+++ b/tramp-gvfs.el
@@ -871,6 +871,14 @@ arguments to pass to the OPERATION."
    (tramp-register-foreign-file-name-handler
     #'tramp-gvfs-file-name-p #'tramp-gvfs-file-name-handler)))
 
+;; Event type `dbus-event' is added to `while-no-input-ignore-events'
+;; in Emacs 29.1.  If it is missing, some packages like Helm report
+;; problems.  So we add it here.
+(when (and (featurep 'dbusbind)
+          (not (memq 'dbus-event while-no-input-ignore-events)))
+  (setq while-no-input-ignore-events
+       (cons 'dbus-event while-no-input-ignore-events)))
+
 
 ;; D-Bus helper function.
 
@@ -1079,7 +1087,7 @@ file names."
                        (goto-char (point-min))
                        (tramp-error-with-buffer
                         nil v 'file-error
-                        "%s failed, see buffer `%s' for details."
+                        "%s failed, see buffer `%s' for details"
                         msg-operation (buffer-name)))
 
                    ;; Some WebDAV server, like the one from QNAP, do
@@ -1423,16 +1431,19 @@ If FILE-SYSTEM is non-nil, return file system 
attributes."
 (defun tramp-gvfs-handle-file-name-all-completions (filename directory)
   "Like `file-name-all-completions' for Tramp files."
   (unless (tramp-compat-string-search "/" filename)
-    (all-completions
-     filename
-     (with-parsed-tramp-file-name (expand-file-name directory) nil
-       (with-tramp-file-property v localname "file-name-all-completions"
-         (let ((result '("./" "../")))
-           ;; Get a list of directories and files.
-          (dolist (item (tramp-gvfs-get-directory-attributes directory) result)
-            (if (string-equal (cdr (assoc "type" item)) "directory")
-                (push (file-name-as-directory (car item)) result)
-              (push (car item) result)))))))))
+    (tramp-compat-ignore-error file-missing
+      (all-completions
+       filename
+       (with-parsed-tramp-file-name (expand-file-name directory) nil
+        (with-tramp-file-property v localname "file-name-all-completions"
+           (let ((result '("./" "../")))
+             ;; Get a list of directories and files.
+            (dolist (item
+                     (tramp-gvfs-get-directory-attributes directory)
+                     result)
+              (if (string-equal (cdr (assoc "type" item)) "directory")
+                  (push (file-name-as-directory (car item)) result)
+                (push (car item) result))))))))))
 
 (defun tramp-gvfs-handle-file-notify-add-watch (file-name flags _callback)
   "Like `file-notify-add-watch' for Tramp files."
@@ -1462,16 +1473,16 @@ If FILE-SYSTEM is non-nil, return file system 
attributes."
           v 'file-notify-error "Monitoring not supported for `%s'" file-name)
        (tramp-message
         v 6 "Run `%s', %S" (string-join (process-command p) " ") p)
-       (process-put p 'vector v)
-       (process-put p 'events events)
-       (process-put p 'watch-name localname)
+       (process-put p 'tramp-vector v)
+       (process-put p 'tramp-events events)
+       (process-put p 'tramp-watch-name localname)
        (process-put p 'adjust-window-size-function #'ignore)
        (set-process-query-on-exit-flag p nil)
        (set-process-filter p #'tramp-gvfs-monitor-process-filter)
        (set-process-sentinel p #'tramp-file-notify-process-sentinel)
        ;; There might be an error if the monitor is not supported.
        ;; Give the filter a chance to read the output.
-       (while (tramp-accept-process-output p 0))
+       (while (tramp-accept-process-output p))
        (unless (process-live-p p)
          (tramp-error
           p 'file-notify-error "Monitoring not supported for `%s'" file-name))
@@ -1483,8 +1494,8 @@ If FILE-SYSTEM is non-nil, return file system attributes."
 (defun tramp-gvfs-monitor-process-filter (proc string)
   "Read output from \"gvfs-monitor-file\" and add corresponding \
 `file-notify' events."
-  (let* ((events (process-get proc 'events))
-        (rest-string (process-get proc 'rest-string))
+  (let* ((events (process-get proc 'tramp-events))
+        (rest-string (process-get proc 'tramp-rest-string))
         (dd (tramp-get-default-directory (process-buffer proc)))
         (ddu (tramp-compat-rx (literal (tramp-gvfs-url-file-name dd)))))
     (when rest-string
@@ -1527,7 +1538,7 @@ If FILE-SYSTEM is non-nil, return file system attributes."
          (setq file1 (url-unhex-string file1)))
        ;; Remove watch when file or directory to be watched is deleted.
        (when (and (member action '(moved deleted))
-                  (string-equal file (process-get proc 'watch-name)))
+                  (string-equal file (process-get proc 'tramp-watch-name)))
          (delete-process proc))
        ;; Usually, we would add an Emacs event now.  Unfortunately,
        ;; `unread-command-events' does not accept several events at
@@ -1539,7 +1550,7 @@ If FILE-SYSTEM is non-nil, return file system attributes."
     ;; Save rest of the string.
     (when (string-empty-p string) (setq string nil))
     (when string (tramp-message proc 10 "Rest string:\n%s" string))
-    (process-put proc 'rest-string string)))
+    (process-put proc 'tramp-rest-string string)))
 
 (defun tramp-gvfs-handle-file-system-info (filename)
   "Like `file-system-info' for Tramp files."
@@ -2176,7 +2187,7 @@ connection if a previous connection has died for some 
reason."
              :name (tramp-get-connection-name vec)
              :buffer (tramp-get-connection-buffer vec)
              :server t :host 'local :service t :noquery t)))
-      (process-put p 'vector vec)
+      (process-put p 'tramp-vector vec)
       (set-process-query-on-exit-flag p nil)
 
       ;; Set connection-local variables.
diff --git a/tramp-rclone.el b/tramp-rclone.el
index 0d87163aa1..4160364f31 100644
--- a/tramp-rclone.el
+++ b/tramp-rclone.el
@@ -370,7 +370,7 @@ connection if a previous connection has died for some 
reason."
                  :name (tramp-get-connection-name vec)
                  :buffer (tramp-get-connection-buffer vec)
                  :server t :host 'local :service t :noquery t)))
-         (process-put p 'vector vec)
+         (process-put p 'tramp-vector vec)
          (set-process-query-on-exit-flag p nil)
 
          ;; Set connection-local variables.
diff --git a/tramp-sh.el b/tramp-sh.el
index ab322a4d38..63f54fff8c 100644
--- a/tramp-sh.el
+++ b/tramp-sh.el
@@ -108,11 +108,18 @@ detected as prompt when being sent on echoing hosts, 
therefore.")
 
 (defcustom tramp-use-ssh-controlmaster-options (not (eq system-type 
'windows-nt))
   "Whether to use `tramp-ssh-controlmaster-options'.
+Set it to t, if you want Tramp to apply these options.
 Set it to nil, if you use Control* or Proxy* options in your ssh
-configuration."
+configuration.
+Set it to `suppress' if you want to disable settings in your
+\"~/.ssh/config¸\"."
   :group 'tramp
-  :version "28.1"
-  :type 'boolean)
+  :version "29.2"
+  :type '(choice (const :tag "Set ControlMaster" t)
+                 (const :tag "Don't set ControlMaster" nil)
+                 (const :tag "Suppress ControlMaster" suppress))
+  ;; Check with (safe-local-variable-p 'tramp-use-ssh-controlmaster-options 
'suppress)
+  :safe (lambda (val) (and (memq val '(t nil suppress)) t)))
 
 (defvar tramp-ssh-controlmaster-options nil
   "Which ssh Control* arguments to use.
@@ -123,8 +130,8 @@ If it is a string, it should have the form
 spec must be doubled, because the string is used as format string.
 
 Otherwise, it will be auto-detected by Tramp, if
-`tramp-use-ssh-controlmaster-options' is non-nil.  The value
-depends on the installed local ssh version.
+`tramp-use-ssh-controlmaster-options' is t.  The value depends on
+the installed local ssh version.
 
 The string is used in `tramp-methods'.")
 
@@ -631,7 +638,6 @@ foreach $f (@files) {
   print \"$f\\n\";
  }
 }
-print \"ok\\n\"
 ' \"$1\" %n"
   "Perl script to produce output suitable for use with
 `file-name-all-completions' on the remote file system.
@@ -1158,8 +1164,8 @@ component is used as the target of the symlink."
        (unless ln
          (tramp-error
           v 'file-error
-          (concat "Making a symbolic link. "
-                  "ln(1) does not exist on the remote host.")))
+          (concat "Making a symbolic link: "
+                  "ln(1) does not exist on the remote host")))
 
        ;; Do the 'confirm if exists' thing.
        (when (file-exists-p linkname)
@@ -1716,7 +1722,7 @@ ID-FORMAT valid values are `string' and `integer'."
       (if (tramp-file-property-p v localname "file-attributes")
          (or (tramp-check-cached-permissions v ?x)
              (tramp-check-cached-permissions v ?s))
-       (tramp-run-test "-x" filename)))))
+       (tramp-run-test v "-x" localname)))))
 
 (defun tramp-sh-handle-file-readable-p (filename)
   "Like `file-readable-p' for Tramp files."
@@ -1726,7 +1732,7 @@ ID-FORMAT valid values are `string' and `integer'."
       ;; satisfied without remote operation.
       (if (tramp-file-property-p v localname "file-attributes")
          (tramp-handle-file-readable-p filename)
-       (tramp-run-test "-r" filename)))))
+       (tramp-run-test v "-r" localname)))))
 
 ;; Functions implemented using the basic functions above.
 
@@ -1747,7 +1753,7 @@ ID-FORMAT valid values are `string' and `integer'."
                   (tramp-get-file-property
                    v (tramp-file-local-name truename) "file-attributes"))
                  t)
-           (tramp-run-test "-d" filename))))))
+           (tramp-run-test v "-d" localname))))))
 
 (defun tramp-sh-handle-file-writable-p (filename)
   "Like `file-writable-p' for Tramp files."
@@ -1758,7 +1764,7 @@ ID-FORMAT valid values are `string' and `integer'."
              ;; Examine `file-attributes' cache to see if request can
              ;; be satisfied without remote operation.
              (tramp-check-cached-permissions v ?w)
-           (tramp-run-test "-w" filename))
+           (tramp-run-test v "-w" localname))
        ;; If file doesn't exist, check if directory is writable.
        (and
         (file-directory-p (file-name-directory filename))
@@ -1832,64 +1838,43 @@ ID-FORMAT valid values are `string' and `integer'."
   (with-parsed-tramp-file-name (expand-file-name directory) nil
     (when (and (not (tramp-compat-string-search "/" filename))
               (tramp-connectable-p v))
-      (all-completions
-       filename
-       (with-tramp-file-property v localname "file-name-all-completions"
-        (let (result)
-          ;; Get a list of directories and files, including reliably
-          ;; tagging the directories with a trailing "/".  Because I
-          ;; rock.  --daniel@danann.net
-          (tramp-send-command
-           v
-           (if (tramp-get-remote-perl v)
-               (progn
-                 (tramp-maybe-send-script
-                  v tramp-perl-file-name-all-completions
-                  "tramp_perl_file_name_all_completions")
-                 (format "tramp_perl_file_name_all_completions %s"
-                         (tramp-shell-quote-argument localname)))
-
-             (format (concat
-                      "(cd %s 2>&1 && %s -a 2>%s"
-                      " | while IFS= read f; do"
-                      " if %s -d \"$f\" 2>%s;"
-                      " then \\echo \"$f/\"; else \\echo \"$f\"; fi; done"
-                      " && \\echo ok) || \\echo fail")
-                     (tramp-shell-quote-argument localname)
-                     (tramp-get-ls-command v)
-                      (tramp-get-remote-null-device v)
-                     (tramp-get-test-command v)
-                      (tramp-get-remote-null-device v))))
-
-          ;; Now grab the output.
-          (with-current-buffer (tramp-get-buffer v)
-            (goto-char (point-max))
-
-            ;; Check result code, found in last line of output.
-            (forward-line -1)
-            (if (looking-at-p (rx bol "fail" eol))
-                (progn
-                  ;; Grab error message from line before last line
-                  ;; (it was put there by `cd 2>&1').
-                  (forward-line -1)
-                  (tramp-error
-                   v 'file-error
-                   "tramp-sh-handle-file-name-all-completions: %s"
-                   (buffer-substring (point) (line-end-position))))
-              ;; For peace of mind, if buffer doesn't end in `fail'
-              ;; then it should end in `ok'.  If neither are in the
-              ;; buffer something went seriously wrong on the remote
-              ;; side.
-              (unless (looking-at-p (rx bol "ok" eol))
-                (tramp-error
-                 v 'file-error
-                 (concat "tramp-sh-handle-file-name-all-completions: "
-                         "internal error accessing `%s': `%s'")
-                 (tramp-shell-quote-argument localname) (buffer-string))))
-
-            (while (zerop (forward-line -1))
-              (push (buffer-substring (point) (line-end-position)) result)))
-          result))))))
+    (unless (tramp-compat-string-search "/" filename)
+      (tramp-compat-ignore-error file-missing
+       (all-completions
+        filename
+        (with-tramp-file-property v localname "file-name-all-completions"
+          (let (result)
+            ;; Get a list of directories and files, including
+            ;; reliably tagging the directories with a trailing "/".
+            ;; Because I rock.  --daniel@danann.net
+            (when (tramp-send-command-and-check
+                   v
+                   (if (tramp-get-remote-perl v)
+                       (progn
+                         (tramp-maybe-send-script
+                          v tramp-perl-file-name-all-completions
+                          "tramp_perl_file_name_all_completions")
+                         (format "tramp_perl_file_name_all_completions %s"
+                                 (tramp-shell-quote-argument localname)))
+
+                     (format (concat
+                              "cd %s 2>&1 && %s -a 2>%s"
+                              " | while IFS= read f; do"
+                              " if %s -d \"$f\" 2>%s;"
+                              " then \\echo \"$f/\"; else \\echo \"$f\"; fi;"
+                              " done")
+                             (tramp-shell-quote-argument localname)
+                             (tramp-get-ls-command v)
+                             (tramp-get-remote-null-device v)
+                             (tramp-get-test-command v)
+                             (tramp-get-remote-null-device v))))
+
+              ;; Now grab the output.
+              (with-current-buffer (tramp-get-buffer v)
+                (goto-char (point-max))
+                (while (zerop (forward-line -1))
+                  (push (buffer-substring (point) (line-end-position)) 
result)))
+              result)))))))))
 
 ;; cp, mv and ln
 
@@ -2232,7 +2217,7 @@ the uid and gid from FILENAME."
                 cmd-result)
              (tramp-error-with-buffer
               nil v 'file-error
-              "Copying directly failed, see buffer `%s' for details."
+              "Copying directly failed, see buffer `%s' for details"
               (buffer-name)))))
 
         ;; We are on the local host.
@@ -2287,7 +2272,7 @@ the uid and gid from FILENAME."
                          "%s %s %s" cmd
                          (tramp-shell-quote-argument localname1)
                          (tramp-shell-quote-argument tmpfile))
-                      "Copying directly failed, see buffer `%s' for details."
+                      "Copying directly failed, see buffer `%s' for details"
                       (tramp-get-buffer v))
                      ;; We must change the ownership as remote user.
                      ;; Since this does not work reliable, we also
@@ -2320,7 +2305,7 @@ the uid and gid from FILENAME."
                          "cp -f -p %s %s"
                          (tramp-shell-quote-argument tmpfile)
                          (tramp-shell-quote-argument localname2))
-                      "Copying directly failed, see buffer `%s' for details."
+                      "Copying directly failed, see buffer `%s' for details"
                       (tramp-get-buffer v)))
                     (t1
                      (tramp-run-real-handler
@@ -2510,7 +2495,11 @@ The method used must be an out-of-band method."
                      (tramp-get-connection-buffer v)
                      copy-program copy-args)))
                (tramp-message v 6 "%s" (string-join (process-command p) " "))
-               (process-put p 'vector v)
+               (process-put p 'tramp-vector v)
+               ;; This is neded for ssh or PuTTY based processes, and
+               ;; only if the respective options are set.  Perhaps,
+               ;; the setting could be more fine-grained.
+               ;; (process-put p 'tramp-shared-socket t)
                (process-put p 'adjust-window-size-function #'ignore)
                (set-process-query-on-exit-flag p nil)
 
@@ -2735,8 +2724,8 @@ The method used must be an out-of-band method."
                      ;; End is followed by \n or by " -> ".
                      (put-text-property start end 'dired-filename t))))))
          ;; Remove trailing lines.
-         (beginning-of-line)
-         (while (looking-at "//")
+         (goto-char (point-max))
+         (while (re-search-backward (rx bol "//") nil 'noerror)
            (forward-line 1)
            (delete-region (match-beginning 0) (point))))
        ;; Reset multibyte if needed.
@@ -3856,16 +3845,20 @@ Fall back to normal file name handler if no Tramp 
handler exists."
           "`%s' failed to start on remote host"
           (string-join sequence " "))
        (tramp-message v 6 "Run `%s', %S" (string-join sequence " ") p)
-       (process-put p 'vector v)
+       (process-put p 'tramp-vector v)
+       ;; This is neded for ssh or PuTTY based processes, and only if
+       ;; the respective options are set.  Perhaps, the setting could
+       ;; be more fine-grained.
+       ;; (process-put p 'tramp-shared-socket t)
        ;; Needed for process filter.
-       (process-put p 'events events)
-       (process-put p 'watch-name localname)
+       (process-put p 'tramp-events events)
+       (process-put p 'tramp-watch-name localname)
        (set-process-query-on-exit-flag p nil)
        (set-process-filter p filter)
        (set-process-sentinel p #'tramp-file-notify-process-sentinel)
        ;; There might be an error if the monitor is not supported.
        ;; Give the filter a chance to read the output.
-       (while (tramp-accept-process-output p 0))
+       (while (tramp-accept-process-output p))
        (unless (process-live-p p)
          (tramp-error
           p 'file-notify-error "Monitoring not supported for `%s'" file-name))
@@ -3873,10 +3866,10 @@ Fall back to normal file name handler if no Tramp 
handler exists."
 
 (defun tramp-sh-gio-monitor-process-filter (proc string)
   "Read output from \"gio monitor\" and add corresponding `file-notify' 
events."
-  (let ((events (process-get proc 'events))
+  (let ((events (process-get proc 'tramp-events))
        (remote-prefix
         (file-remote-p (tramp-get-default-directory (process-buffer proc))))
-       (rest-string (process-get proc 'rest-string))
+       (rest-string (process-get proc 'tramp-rest-string))
        pos)
     (when rest-string
       (tramp-message proc 10 "Previous string:\n%s" rest-string))
@@ -3958,11 +3951,11 @@ Fall back to normal file name handler if no Tramp 
handler exists."
       (setq string (replace-match "" nil nil string)))
     (when (string-empty-p string) (setq string nil))
     (when string (tramp-message proc 10 "Rest string:\n%s" string))
-    (process-put proc 'rest-string string)))
+    (process-put proc 'tramp-rest-string string)))
 
 (defun tramp-sh-inotifywait-process-filter (proc string)
   "Read output from \"inotifywait\" and add corresponding `file-notify' 
events."
-  (let ((events (process-get proc 'events)))
+  (let ((events (process-get proc 'tramp-events)))
     (tramp-message proc 6 "%S\n%s" proc string)
     (dolist (line (split-string string (rx (+ (any "\r\n"))) 'omit))
       ;; Check, whether there is a problem.
@@ -3981,7 +3974,8 @@ Fall back to normal file name handler if no Tramp handler 
exists."
                  (tramp-compat-string-replace "_" "-" (downcase x))))
               (split-string (match-string 1 line) "," 'omit))
              (or (match-string 2 line)
-                 (file-name-nondirectory (process-get proc 'watch-name))))))
+                 (file-name-nondirectory
+                  (process-get proc 'tramp-watch-name))))))
        ;; Usually, we would add an Emacs event now.  Unfortunately,
        ;; `unread-command-events' does not accept several events at
        ;; once.  Therefore, we apply the handler directly.
@@ -4127,17 +4121,14 @@ Only send the definition if it has not already been 
done."
        (tramp-set-connection-property
         (tramp-get-connection-process vec) "scripts" (cons name scripts))))))
 
-(defun tramp-run-test (switch filename)
-  "Run `test' on the remote system, given a SWITCH and a FILENAME.
+(defun tramp-run-test (vec switch localname)
+  "Run `test' on the remote system VEC, given a SWITCH and a LOCALNAME.
 Returns the exit code of the `test' program."
-  (with-parsed-tramp-file-name filename nil
-    (tramp-send-command-and-check
-     v
-     (format
-      "%s %s %s"
-      (tramp-get-test-command v)
-      switch
-      (tramp-shell-quote-argument localname)))))
+  (tramp-send-command-and-check
+   vec
+   (format
+    "%s %s %s"
+    (tramp-get-test-command vec) switch (tramp-shell-quote-argument 
localname))))
 
 (defun tramp-find-executable
   (vec progname dirlist &optional ignore-tilde ignore-path)
@@ -4427,7 +4418,7 @@ file exists and nonzero exit status otherwise."
   "Wait for shell prompt and barf if none appears.
 Looks at process PROC to see if a shell prompt appears in TIMEOUT
 seconds.  If not, it produces an error message with the given ERROR-ARGS."
-  (let ((vec (process-get proc 'vector)))
+  (let ((vec (process-get proc 'tramp-vector)))
     (condition-case nil
        (tramp-wait-for-regexp
         proc timeout
@@ -4937,6 +4928,15 @@ Goes through the list `tramp-inline-compress-commands'."
        (tramp-message
         vec 2 "Couldn't find an inline transfer compress command")))))
 
+(defun tramp-ssh-option-exists-p (vec option)
+  "Check, whether local ssh OPTION is applicable."
+  ;; We don't want to cache it persistently.
+  (with-tramp-connection-property nil option
+    ;; We use a non-existing IP address for check, in order to avoid
+    ;; useless connections, and DNS timeouts.
+    (zerop
+     (tramp-call-process vec "ssh" nil nil nil "-G" "-o" option "0.0.0.1"))))
+
 (defun tramp-ssh-controlmaster-options (vec)
   "Return the Control* arguments of the local ssh."
   (cond
@@ -4946,40 +4946,30 @@ Goes through the list `tramp-inline-compress-commands'."
     "")
 
    ;; There is already a value to be used.
-   ((stringp tramp-ssh-controlmaster-options) tramp-ssh-controlmaster-options)
+   ((and (eq tramp-use-ssh-controlmaster-options t)
+         (stringp tramp-ssh-controlmaster-options))
+    tramp-ssh-controlmaster-options)
 
    ;; Determine the options.
-   (t (setq tramp-ssh-controlmaster-options "")
-      (let ((case-fold-search t))
-       (ignore-errors
-         (with-tramp-progress-reporter
-             vec 4 "Computing ControlMaster options"
-           ;; We use a non-existing IP address, in order to avoid
-           ;; useless connections, and DNS timeouts.
-           (when (zerop
-                  (tramp-call-process
-                   vec "ssh" nil nil nil
-                   "-G" "-o" "ControlMaster=auto" "0.0.0.1"))
-             (setq tramp-ssh-controlmaster-options
-                   "-o ControlMaster=auto")
-             (if (zerop
-                  (tramp-call-process
-                   vec "ssh" nil nil nil
-                   "-G" "-o" "ControlPath=tramp.%C" "0.0.0.1"))
-                 (setq tramp-ssh-controlmaster-options
-                       (concat tramp-ssh-controlmaster-options
-                               " -o ControlPath=tramp.%%C"))
-               (setq tramp-ssh-controlmaster-options
-                     (concat tramp-ssh-controlmaster-options
-                             " -o ControlPath=tramp.%%r@%%h:%%p")))
-             (when (zerop
-                    (tramp-call-process
-                     vec "ssh" nil nil nil
-                     "-G" "-o" "ControlPersist=no" "0.0.0.1"))
-               (setq tramp-ssh-controlmaster-options
-                     (concat tramp-ssh-controlmaster-options
-                             " -o ControlPersist=no")))))))
-      tramp-ssh-controlmaster-options)))
+   (t (ignore-errors
+        ;; ControlMaster and ControlPath options are introduced in OpenSSH 3.9.
+       (when (tramp-ssh-option-exists-p vec "ControlMaster=auto")
+          (concat
+           "-o ControlMaster="
+           (if (eq tramp-use-ssh-controlmaster-options 'suppress)
+               "no" "auto")
+
+           " -o ControlPath="
+           (if (eq tramp-use-ssh-controlmaster-options 'suppress)
+               "none"
+             ;; Hashed tokens are introduced in OpenSSH 6.7.
+            (if (tramp-ssh-option-exists-p vec "ControlPath=tramp.%C")
+                "tramp.%%C" "tramp.%%r@%%h:%%p"))
+
+           ;; ControlPersist option is introduced in OpenSSH 5.6.
+          (when (and (not (eq tramp-use-ssh-controlmaster-options 'suppress))
+                      (tramp-ssh-option-exists-p vec "ControlPersist=no"))
+            " -o ControlPersist=no")))))))
 
 (defun tramp-scp-strict-file-name-checking (vec)
   "Return the strict file name checking argument of the local scp."
@@ -5233,7 +5223,11 @@ connection if a previous connection has died for some 
reason."
 
                ;; Set sentinel and query flag.  Initialize variables.
                (set-process-sentinel p #'tramp-process-sentinel)
-               (process-put p 'vector vec)
+               (process-put p 'tramp-vector vec)
+               ;; This is neded for ssh or PuTTY based processes, and
+               ;; only if the respective options are set.  Perhaps,
+               ;; the setting could be more fine-grained.
+               ;; (process-put p 'tramp-shared-socket t)
                (process-put p 'adjust-window-size-function #'ignore)
                (set-process-query-on-exit-flag p nil)
                (setq tramp-current-connection (cons vec (current-time)))
diff --git a/tramp-smb.el b/tramp-smb.el
index b8fdf5a71b..9209cd39d7 100644
--- a/tramp-smb.el
+++ b/tramp-smb.el
@@ -558,7 +558,7 @@ arguments to pass to the OPERATION."
 
                            (tramp-message
                             v 6 "%s" (string-join (process-command p) " "))
-                           (process-put p 'vector v)
+                           (process-put p 'tramp-vector v)
                            (process-put
                             p 'adjust-window-size-function #'ignore)
                            (set-process-query-on-exit-flag p nil)
@@ -691,7 +691,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
 
       ;; "rmdir" does not report an error.  So we check ourselves.
       (when (file-exists-p directory)
-       (tramp-error v 'file-error "`%s' not removed." directory)))))
+       (tramp-error v 'file-error "`%s' not removed" directory)))))
 
 (defun tramp-smb-handle-delete-file (filename &optional trash)
   "Like `delete-file' for Tramp files."
@@ -764,7 +764,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
   "Read ACL data from connection buffer."
   (unless (process-live-p proc)
     ;; Accept pending output.
-    (while (tramp-accept-process-output proc 0))
+    (while (tramp-accept-process-output proc))
     (with-current-buffer (tramp-get-connection-buffer vec)
       ;; There might be a hidden password prompt.
       (widen)
@@ -827,7 +827,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
 
                      (tramp-message
                       v 6 "%s" (string-join (process-command p) " "))
-                     (process-put p 'vector v)
+                     (process-put p 'tramp-vector v)
                      (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-get-acl)
@@ -983,18 +983,20 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
 ;; files.
 (defun tramp-smb-handle-file-name-all-completions (filename directory)
   "Like `file-name-all-completions' for Tramp files."
-  (all-completions
-   filename
-   (with-parsed-tramp-file-name (expand-file-name directory) nil
-     (with-tramp-file-property v localname "file-name-all-completions"
-       (delete-dups
-       (mapcar
-        (lambda (x)
-          (list
-           (if (tramp-compat-string-search "d" (nth 1 x))
-               (file-name-as-directory (nth 0 x))
-             (nth 0 x))))
-        (tramp-smb-get-file-entries directory)))))))
+  (tramp-compat-ignore-error file-missing
+    (all-completions
+     filename
+     (when (file-directory-p directory)
+       (with-parsed-tramp-file-name (expand-file-name directory) nil
+        (with-tramp-file-property v localname "file-name-all-completions"
+          (delete-dups
+           (mapcar
+            (lambda (x)
+              (list
+               (if (tramp-compat-string-search "d" (nth 1 x))
+                   (file-name-as-directory (nth 0 x))
+                 (nth 0 x))))
+            (tramp-smb-get-file-entries directory)))))))))
 
 (defun tramp-smb-handle-file-system-info (filename)
   "Like `file-system-info' for Tramp files."
@@ -1439,7 +1441,7 @@ component is used as the target of the symlink."
   "Set ACL data."
   (unless (process-live-p proc)
     ;; Accept pending output.
-    (while (tramp-accept-process-output proc 0))
+    (while (tramp-accept-process-output proc))
     (tramp-message
      vec 10 "\n%s" (tramp-get-buffer-string (tramp-get-connection-buffer vec)))
     (throw 'tramp-action 'ok)))
@@ -1497,7 +1499,7 @@ component is used as the target of the symlink."
 
                    (tramp-message
                     v 6 "%s" (string-join (process-command p) " "))
-                   (process-put p 'vector v)
+                   (process-put p 'tramp-vector v)
                    (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)
@@ -2049,7 +2051,7 @@ If ARGUMENT is non-nil, use it as argument for
                               args))))
 
              (tramp-message vec 6 "%s" (string-join (process-command p) " "))
-             (process-put p 'vector vec)
+             (process-put p 'tramp-vector vec)
              (process-put p 'adjust-window-size-function #'ignore)
              (set-process-query-on-exit-flag p nil)
 
@@ -2103,7 +2105,7 @@ Removes smb prompt.  Returns nil if an error message has 
appeared."
 
       ;; Read pending output.
       (while (not (re-search-forward tramp-smb-prompt nil t))
-       (while (tramp-accept-process-output p 0))
+       (while (tramp-accept-process-output p))
        (goto-char (point-min)))
       (tramp-message vec 6 "\n%s" (buffer-string))
 
diff --git a/tramp-sshfs.el b/tramp-sshfs.el
index 2d3c436632..942edd689d 100644
--- a/tramp-sshfs.el
+++ b/tramp-sshfs.el
@@ -399,7 +399,7 @@ connection if a previous connection has died for some 
reason."
              :name (tramp-get-connection-name vec)
              :buffer (tramp-get-connection-buffer vec)
              :server t :host 'local :service t :noquery t)))
-      (process-put p 'vector vec)
+      (process-put p 'tramp-vector vec)
       (set-process-query-on-exit-flag p nil)
 
       ;; Set connection-local variables.
diff --git a/tramp-sudoedit.el b/tramp-sudoedit.el
index b40feee045..d167bf13b1 100644
--- a/tramp-sudoedit.el
+++ b/tramp-sudoedit.el
@@ -464,26 +464,27 @@ the result will be a local, non-Tramp, file name."
 
 (defun tramp-sudoedit-handle-file-name-all-completions (filename directory)
   "Like `file-name-all-completions' for Tramp files."
-  (all-completions
-   filename
-   (with-parsed-tramp-file-name (expand-file-name directory) nil
-     (with-tramp-file-property v localname "file-name-all-completions"
-       (tramp-sudoedit-send-command
-       v "ls" "-a1" "--quoting-style=literal" "--show-control-chars"
-       (if (tramp-string-empty-or-nil-p localname)
-           "" (tramp-compat-file-name-unquote localname)))
-       (mapcar
-       (lambda (f)
-         (if (ignore-errors (file-directory-p (expand-file-name f directory)))
-             (file-name-as-directory f)
-           f))
-       (delq
-        nil
+  (tramp-compat-ignore-error file-missing
+    (all-completions
+     filename
+     (with-parsed-tramp-file-name (expand-file-name directory) nil
+       (with-tramp-file-property v localname "file-name-all-completions"
+        (tramp-sudoedit-send-command
+         v "ls" "-a1" "--quoting-style=literal" "--show-control-chars"
+         (if (tramp-string-empty-or-nil-p localname)
+             "" (tramp-compat-file-name-unquote localname)))
         (mapcar
-         (lambda (l) (and (not (string-match-p (rx bol (* blank) eol) l)) l))
-         (split-string
-          (tramp-get-buffer-string (tramp-get-connection-buffer v))
-          "\n" 'omit))))))))
+         (lambda (f)
+           (if (ignore-errors (file-directory-p (expand-file-name f 
directory)))
+               (file-name-as-directory f)
+             f))
+         (delq
+          nil
+          (mapcar
+           (lambda (l) (and (not (string-match-p (rx bol (* blank) eol) l)) l))
+           (split-string
+            (tramp-get-buffer-string (tramp-get-connection-buffer v))
+            "\n" 'omit)))))))))
 
 (defun tramp-sudoedit-handle-file-readable-p (filename)
   "Like `file-readable-p' for Tramp files."
@@ -771,7 +772,7 @@ ID-FORMAT valid values are `string' and `integer'."
   "Check, whether a sudo process has finished.  Remove unneeded output."
   ;; There might be pending output for the exit status.
   (unless (process-live-p proc)
-    (while (tramp-accept-process-output proc 0))
+    (while (tramp-accept-process-output proc))
     ;; Delete narrowed region, it would be in the way reading a Lisp form.
     (goto-char (point-min))
     (widen)
@@ -799,7 +800,7 @@ connection if a previous connection has died for some 
reason."
              :name (tramp-get-connection-name vec)
              :buffer (tramp-get-connection-buffer vec)
              :server t :host 'local :service t :noquery t)))
-      (process-put p 'vector vec)
+      (process-put p 'tramp-vector vec)
       (set-process-query-on-exit-flag p nil)
 
       ;; Set connection-local variables.
@@ -837,7 +838,7 @@ in case of error, t otherwise."
       (tramp-message vec 6 "%s" (string-join (process-command p) " "))
       ;; Avoid process status message in output buffer.
       (set-process-sentinel p #'ignore)
-      (process-put p 'vector vec)
+      (process-put p 'tramp-vector vec)
       (process-put p 'adjust-window-size-function #'ignore)
       (set-process-query-on-exit-flag p nil)
       (tramp-set-connection-property p "password-vector" 
tramp-sudoedit-null-hop)
diff --git a/tramp.el b/tramp.el
index d5604744ab..1e3e4469a3 100644
--- a/tramp.el
+++ b/tramp.el
@@ -686,7 +686,7 @@ See also `tramp-yn-prompt-regexp'."
   :type 'regexp)
 
 (defcustom tramp-yn-prompt-regexp
-  (rx (| "Store key in cache? (y/n)"
+  (rx (| (: "Store key in cache? (y/n" (* nonl) ")")
         "Update cached key? (y/n, Return cancels connection)")
       (* blank))
   "Regular expression matching all y/n queries which need to be confirmed.
@@ -726,7 +726,8 @@ The regexp should match at end of buffer."
 
 ;; A security key requires the user physically to touch the device
 ;; with their finger.  We must tell it to the user.
-;; Added in OpenSSH 8.2.  I've tested it with yubikey.
+;; Added in OpenSSH 8.2.  I've tested it with yubikey.  Nitrokey,
+;; which has also passed the tests, does not show such a message.
 (defcustom tramp-security-key-confirm-regexp
   (rx bol (* "\r") "Confirm user presence for key " (* nonl) (* (any "\r\n")))
   "Regular expression matching security key confirmation message.
@@ -1378,7 +1379,9 @@ special value `tramp-default-remote-path'.
 
 `Private Directories' are the settings of the $PATH environment,
 as given in your `~/.profile'.  This entry is represented in
-the list by the special value `tramp-own-remote-path'."
+the list by the special value `tramp-own-remote-path'.
+
+For a full discussion, see Info node `(tramp) Remote programs'."
   :group 'tramp
   :type '(repeat (choice
                  (const :tag "Default Directories" tramp-default-remote-path)
@@ -1742,11 +1745,11 @@ default values are used."
          (unless (or nodefault non-essential
                      (assoc method tramp-methods))
            (tramp-user-error
-            v "Method `%s' is not known." method))
+            v "Method `%s' is not known" method))
          ;; Only some methods from tramp-sh.el do support multi-hops.
          (unless (or (null hop) nodefault non-essential (tramp-multi-hop-p v))
            (tramp-user-error
-            v "Method `%s' is not supported for multi-hops." method)))))))
+            v "Method `%s' is not supported for multi-hops" method)))))))
 
 (put #'tramp-dissect-file-name 'tramp-suppress-trace t)
 
@@ -1775,7 +1778,7 @@ See `tramp-dissect-file-name' for details."
     ;; Only some methods from tramp-sh.el do support multi-hops.
     (unless (or nodefault non-essential (tramp-multi-hop-p v))
       (tramp-user-error
-       v "Method `%s' is not supported for multi-hops."
+       v "Method `%s' is not supported for multi-hops"
        (tramp-file-name-method v)))
     ;; Return result.
     v))
@@ -1931,7 +1934,7 @@ Return `tramp-cache-undefined' in case it doesn't exist."
   (or (and (tramp-file-name-p vec-or-proc)
           (get-buffer-process (tramp-buffer-name vec-or-proc)))
       (and (processp vec-or-proc)
-          (tramp-get-process (process-get vec-or-proc 'vector)))
+          (tramp-get-process (process-get vec-or-proc 'tramp-vector)))
       tramp-cache-undefined))
 
 (defun tramp-get-connection-process (vec)
@@ -2211,7 +2214,7 @@ applicable)."
                            vec-or-proc 'dont-create))))))))
          ;; Translate proc to vec.
          (when (processp vec-or-proc)
-           (setq vec-or-proc (process-get vec-or-proc 'vector))))
+           (setq vec-or-proc (process-get vec-or-proc 'tramp-vector))))
        ;; Do it.
        (when (tramp-file-name-p vec-or-proc)
          (apply #'tramp-debug-message
@@ -4828,7 +4831,7 @@ Do not set it manually, it is used buffer-local in 
`tramp-get-lock-pid'.")
        (unless (tramp-multi-hop-p item)
          (setq tramp-default-proxies-alist saved-tdpa)
          (tramp-user-error
-          vec "Method `%s' is not supported for multi-hops."
+          vec "Method `%s' is not supported for multi-hops"
           (tramp-file-name-method item)))))
 
     ;; Some methods ("su", "sg", "sudo", "doas", "ksu") do not use the
@@ -5021,6 +5024,11 @@ substitution.  SPEC-LIST is a list of char/value pairs 
used for
            ;; t.  See Bug#51177.
            (when filter
              (set-process-filter p filter))
+           (process-put p 'tramp-vector v)
+           ;; This is neded for ssh or PuTTY based processes, and
+           ;; only if the respective options are set.  Perhaps, the
+           ;; setting could be more fine-grained.
+           ;; (process-put p 'tramp-shared-socket t)
            (process-put p 'remote-command orig-command)
            (tramp-set-connection-property p "remote-command" orig-command)
 
@@ -5433,7 +5441,7 @@ of."
   ;; There might be pending output.  Avoid problems with reentrant
   ;; call of Tramp.
   (ignore-errors
-    (while (tramp-accept-process-output proc 0)))
+    (while (tramp-accept-process-output proc)))
   (tramp-message proc 6 "Kill %S" proc)
   (delete-process proc))
 
@@ -5445,7 +5453,7 @@ of."
        (with-current-buffer (process-buffer proc)
         (file-exists-p
          (concat (file-remote-p default-directory)
-                 (process-get proc 'watch-name))))))
+                 (process-get proc 'tramp-watch-name))))))
 
 (defun tramp-file-notify-process-sentinel (proc event)
   "Call `file-notify-rm-watch'."
@@ -5585,13 +5593,13 @@ Wait, until the connection buffer changes."
   "Check, whether a process has finished."
   (unless (process-live-p proc)
     ;; There might be pending output.
-    (while (tramp-accept-process-output proc 0))
+    (while (tramp-accept-process-output proc))
     (throw 'tramp-action 'process-died)))
 
 (defun tramp-action-out-of-band (proc vec)
   "Check, whether an out-of-band copy has finished."
   ;; There might be pending output for the exit status.
-  (while (tramp-accept-process-output proc 0))
+  (while (tramp-accept-process-output proc))
   (cond ((and (not (process-live-p proc))
              (zerop (process-exit-status proc)))
         (tramp-message vec 3 "Process has finished.")
@@ -5622,7 +5630,7 @@ See `tramp-process-actions' for the format of ACTIONS."
     (while (not found)
       ;; Reread output once all actions have been performed.
       ;; Obviously, the output was not complete.
-      (while (tramp-accept-process-output proc 0))
+      (while (tramp-accept-process-output proc))
       (setq todo actions)
       (while todo
        (setq item (pop todo)
@@ -5665,7 +5673,7 @@ performed successfully.  Any other value means an error."
   ;; use the "password-vector" property in case we have several hops.
   (tramp-set-connection-property
    (tramp-get-connection-property
-    proc "password-vector" (process-get proc 'vector))
+    proc "password-vector" (process-get proc 'tramp-vector))
    "first-password-request" tramp-cache-read-persistent-data)
   (save-restriction
     (with-tramp-progress-reporter
@@ -5739,11 +5747,22 @@ Mostly useful to protect BODY from being interrupted by 
timers."
           ,@body)
        (tramp-flush-connection-property ,proc "locked"))))
 
-(defun tramp-accept-process-output (proc &optional timeout)
+(defun tramp-accept-process-output (proc &optional _timeout)
   "Like `accept-process-output' for Tramp processes.
 This is needed in order to hide `last-coding-system-used', which is set
 for process communication also.
 If the user quits via `C-g', it is propagated up to `tramp-file-name-handler'."
+  (declare (advertised-calling-convention (proc) "29.2"))
+  ;; There could be other processes which use the same socket for
+  ;; communication.  This could block the output for the current
+  ;; process.  Read such output first.  (Bug#61350)
+  ;; The process property isn't set anymore due to Bug#62194.
+  (when-let (((process-get proc 'tramp-shared-socket))
+            (v (process-get proc 'tramp-vector)))
+    (dolist (p (delq proc (process-list)))
+      (when (tramp-file-name-equal-p v (process-get p 'tramp-vector))
+       (accept-process-output p 0 nil t))))
+
   (with-current-buffer (process-buffer proc)
     (let ((inhibit-read-only t)
          last-coding-system-used
@@ -5753,10 +5772,10 @@ If the user quits via `C-g', it is propagated up to 
`tramp-file-name-handler'."
        ;; JUST-THIS-ONE is set due to Bug#12145.  `with-local-quit'
        ;; returns t in order to report success.
        (if (with-local-quit
-             (setq result (accept-process-output proc timeout nil t)) t)
+             (setq result (accept-process-output proc 0 nil t)) t)
            (tramp-message
-            proc 10 "%s %s %s %s\n%s"
-            proc timeout (process-status proc) result (buffer-string))
+            proc 10 "%s %s %s\n%s"
+            proc (process-status proc) result (buffer-string))
          ;; Propagate quit.
          (keyboard-quit)))
       result)))
@@ -5894,7 +5913,7 @@ the remote host use line-endings as defined in the 
variable
 (defun tramp-process-sentinel (proc event)
   "Flush file caches and remove shell prompt."
   (unless (process-live-p proc)
-    (let ((vec (process-get proc 'vector))
+    (let ((vec (process-get proc 'tramp-vector))
          (buf (process-buffer proc))
          (prompt (tramp-get-connection-property proc "prompt")))
       (when vec
@@ -6604,7 +6623,7 @@ Consults the auth-source package."
         ;; In tramp-sh.el, we must use "password-vector" due to
         ;; multi-hop.
         (vec (tramp-get-connection-property
-              proc "password-vector" (process-get proc 'vector)))
+              proc "password-vector" (process-get proc 'tramp-vector)))
         (key (tramp-make-tramp-file-name vec 'noloc))
         (method (tramp-file-name-method vec))
         (user (or (tramp-file-name-user-domain vec)
@@ -6767,13 +6786,14 @@ name of a process or buffer, or nil to default to the 
current buffer."
        ;; negative pid, so we try both variants.
        (tramp-compat-funcall
         'tramp-send-command
-        (process-get proc 'vector)
+        (process-get proc 'tramp-vector)
         (format "(\\kill -2 -%d || \\kill -2 %d) 2>%s"
                  pid pid
-                 (tramp-get-remote-null-device (process-get proc 'vector))))
+                 (tramp-get-remote-null-device
+                 (process-get proc 'tramp-vector))))
        ;; Wait, until the process has disappeared.  If it doesn't,
        ;; fall back to the default implementation.
-        (while (tramp-accept-process-output proc 0))
+        (while (tramp-accept-process-output proc))
        (not (process-live-p proc))))))
 
 (add-hook 'interrupt-process-functions #'tramp-interrupt-process)
@@ -6796,7 +6816,7 @@ SIGCODE may be an integer, or a symbol whose name is a 
signal name."
     (cond
      ((processp process)
       (setq pid (process-get process 'remote-pid)
-            vec (process-get process 'vector)))
+            vec (process-get process 'tramp-vector)))
      ((numberp process)
       (setq pid process
             vec (and (stringp remote) (tramp-dissect-file-name remote))))
diff --git a/trampver.el b/trampver.el
index 14b5b5c0ee..9e7287a889 100644
--- a/trampver.el
+++ b/trampver.el
@@ -7,7 +7,7 @@
 ;; Maintainer: Michael Albinus <michael.albinus@gmx.de>
 ;; Keywords: comm, processes
 ;; Package: tramp
-;; Version: 2.6.0.2
+;; Version: 2.6.0.3
 ;; Package-Requires: ((emacs "26.1"))
 ;; Package-Type: multi
 ;; URL: https://www.gnu.org/software/tramp/
@@ -40,7 +40,7 @@
 ;; ./configure" to change them.
 
 ;;;###tramp-autoload
-(defconst tramp-version "2.6.0.2"
+(defconst tramp-version "2.6.0.3"
   "This version of Tramp.")
 
 ;;;###tramp-autoload
@@ -78,7 +78,7 @@
 ;; Check for Emacs version.
 (let ((x   (if (not (string-version-lessp emacs-version "26.1"))
       "ok"
-    (format "Tramp 2.6.0.2 is not fit for %s"
+    (format "Tramp 2.6.0.3 is not fit for %s"
             (replace-regexp-in-string "\n" "" (emacs-version))))))
   (unless (string-equal "ok" x) (error "%s" x)))
 



reply via email to

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