]> git.eshelyaron.com Git - emacs.git/commitdiff
Sync with Tramp 2.5.0-pre
authorMichael Albinus <michael.albinus@gmx.de>
Sun, 19 Jan 2020 13:11:07 +0000 (14:11 +0100)
committerMichael Albinus <michael.albinus@gmx.de>
Sun, 19 Jan 2020 13:11:07 +0000 (14:11 +0100)
* doc/misc/tramp.texi:  Protext Tramp x.y and Emacs x.y by @w{}.
(GVFS-based methods): Move "GNOME Online Accounts" index.
(Customizing Methods, Android shell setup, File name completion)
(Frequently Asked Questions): Fix typos.

* doc/misc/trampver.texi: Change version to "2.5.0-pre".

* lisp/net/trampver.el: Change version to "2.5.0-pre".
(inhibit-message): Don't declare.

* lisp/net/tramp.el: Bump version to 2.5.0-pre.  Require Emacs 25.1.
(tramp-debug-message): Simplify.
(tramp-message): Don't use `tramp-message-show-message'.
(tramp-with-demoted-errors, with-parsed-tramp-file-name)
(with-tramp-file-property, with-tramp-connection-property):
Adapt `declare' form.
(with-tramp-progress-reporter): Suppress progress reporter when
noninteractive.
(tramp-completion-mode, tramp-completion-mode-p): Remove.

* lisp/net/tramp-compat.el (tramp-compat-process-running-p)
(format-message): Remove compatibility code.
(tramp-compat-directory-name-p)
(tramp-compat-tramp-file-name-slots): Remove.

* lisp/net/tramp.el (tramp-debug-message, tramp-message)
(tramp-backtrace, tramp-error, tramp-error-with-buffer)
(tramp-user-error, tramp-with-demoted-errors)
(tramp-signal-hook-function):
* lisp/net/tramp-compat.el (tramp-compat-funcall)
* lisp/net/tramp-gvfs.el (tramp-dbus-function):
Add `tramp-suppress-trace' property.

* lisp/net/tramp.el (tramp-get-method-parameter)
(tramp-dissect-file-name, tramp-error, tramp-error-with-buffer)
(tramp-user-error, with-parsed-tramp-file-name)
(with-tramp-progress-reporter, tramp-file-name-handler)
(tramp-completion-file-name-handler, tramp-autoload-file-name-handler)
(tramp-register-file-name-handlers, tramp-connectable-p)
(tramp-handle-file-modes, tramp-handle-file-regular-p)
(tramp-handle-file-truename, tramp-handle-insert-directory)
(tramp-handle-load, tramp-set-file-uid-gid):
* lisp/net/tramp-adb.el (tramp-adb-file-name-handler)
(tramp-adb-handle-file-truename, tramp-adb-handle-copy-file)
(tramp-adb-handle-rename-file):
* lisp/net/tramp-archive.el (with-parsed-tramp-archive-file-name):
* lisp/net/tramp-cache.el (tramp-get-file-property, tramp-cache-print):
* lisp/net/tramp-compat.el (tramp-compat-process-running-p)
(tramp-compat-exec-path):
* lisp/net/tramp-gvfs.el (tramp-gvfs-file-name-handler)
(tramp-gvfs-dbus-byte-array-to-string)
(tramp-gvfs-do-copy-or-rename-file):
* lisp/net/tramp-rclone.el (tramp-rclone-file-name-handler)
(tramp-rclone-do-copy-or-rename-file):
* lisp/net/tramp-sh.el (tramp-sh-handle-file-truename)
(tramp-sh-handle-copy-directory, tramp-do-copy-or-rename-file)
(tramp-sh-handle-insert-directory, tramp-sh-file-name-handler)
(tramp-maybe-open-connection):
* lisp/net/tramp-smb.el (tramp-smb-file-name-handler)
(tramp-smb-handle-copy-file, tramp-smb-handle-copy-directory)
(tramp-smb-handle-copy-file, tramp-smb-handle-insert-directory)
(tramp-smb-handle-rename-file, tramp-smb-maybe-open-connection):
* lisp/net/tramp-sudoedit.el (tramp-sudoedit-file-name-handler)
(tramp-sudoedit-do-copy-or-rename-file)
(tramp-sudoedit-handle-file-truename):
Use `if-let', `when-let', `directory-name-p', `inhibit-message',
`non-essential and `cl-struct-slot-info'.  Don't use `seconds-to-time'.

* test/lisp/net/tramp-archive-tests.el (tramp-message-show-message):
Don't set.

* test/lisp/net/tramp-tests.el (inhibit-message): Don't declare.
(tramp-message-show-message): Don't set.
(tramp-test06-directory-file-name): Use `non-essential'.
(tramp-test10-write-region): Use `inhibit-message'.
(tramp-test36-vc-registered): No special handling for old Emacsen.
(tramp--test-emacs25-p): Remove.
(tramp-test45-unload): Special case of `tramp-completion-mode'.

16 files changed:
doc/misc/tramp.texi
doc/misc/trampver.texi
lisp/net/tramp-adb.el
lisp/net/tramp-archive.el
lisp/net/tramp-cache.el
lisp/net/tramp-compat.el
lisp/net/tramp-gvfs.el
lisp/net/tramp-rclone.el
lisp/net/tramp-sh.el
lisp/net/tramp-smb.el
lisp/net/tramp-sudoedit.el
lisp/net/tramp-uu.el
lisp/net/tramp.el
lisp/net/trampver.el
test/lisp/net/tramp-archive-tests.el
test/lisp/net/tramp-tests.el

index 049b240b60220fe9325218940bf325b25d2a8ce7..602d62c32011fa8e58d1da1297089a9f9cc5d427 100644 (file)
@@ -46,7 +46,7 @@ copy and modify this GNU manual.''
 @node Top, Overview, (dir), (dir)
 @top @value{tramp} @value{trampver} User Manual
 
-This file documents @value{tramp} @value{trampver}, a remote file
+This file documents @w{@value{tramp} @value{trampver}}, a remote file
 editing package for Emacs.
 
 @value{tramp} stands for ``Transparent Remote (file) Access, Multiple
@@ -312,7 +312,7 @@ behind the scenes when you open a file with @value{tramp}.
 @cindex GNU ELPA
 @vindex tramp-version
 
-@value{tramp} is included as part of Emacs (since Emacs 22.1).
+@value{tramp} is included as part of Emacs (since @w{Emacs 22.1}).
 
 @value{tramp} is also freely packaged for download on the Internet at
 @uref{https://ftp.gnu.org/gnu/tramp/}.  The version number of
@@ -324,9 +324,9 @@ A @value{tramp} release, which is packaged with Emacs, could differ
 slightly from the corresponding standalone release.  This is because
 it isn't always possible to synchronize release dates between Emacs
 and @value{tramp}.  Such version numbers have the Emacs version number
-as suffix, like ``2.3.5.26.3''.  This means @value{tramp} 2.3.5 as
-integrated in Emacs 26.3.  A complete list of @value{tramp} versions
-packaged with Emacs can be retrieved by
+as suffix, like ``2.3.5.26.3''.  This means @w{@value{tramp} 2.3.5} as
+integrated in @w{Emacs 26.3}.  A complete list of @value{tramp}
+versions packaged with Emacs can be retrieved by
 
 @vindex customize-package-emacs-version-alist
 @lisp
@@ -1227,6 +1227,7 @@ supported by these methods.  See method @option{nextcloud} for
 handling them.
 
 @item @option{gdrive}
+@cindex @acronym{GNOME} Online Accounts
 @cindex method @option{gdrive}
 @cindex @option{gdrive} method
 @cindex google drive
@@ -1243,7 +1244,6 @@ could produce unexpected behavior in case two files in the same
 directory have the same @code{display-name}, such a situation must be avoided.
 
 @item @option{nextcloud}
-@cindex @acronym{GNOME} Online Accounts
 @cindex method @option{nextcloud}
 @cindex @option{nextcloud} method
 @cindex nextcloud
@@ -1642,7 +1642,7 @@ suitable settings.  Refer to the Lisp documentation of that variable,
 accessible with @kbd{C-h v tramp-methods @key{RET}}.
 
 In the ELPA archives, there are several examples of such extensions.
-They can be installed with Emacs' Package Manager.  This includes
+They can be installed with Emacs's Package Manager.  This includes
 
 @table @samp
 @c @item anything-tramp
@@ -2095,8 +2095,8 @@ preserves the path value, which can be used to update
 shell supports the login argument @samp{-l}.
 @end defopt
 
-Starting with Emacs 26, @code{tramp-remote-path} can be set per host
-via connection-local
+Starting with @w{Emacs 26}, @code{tramp-remote-path} can be set per
+host via connection-local
 @ifinfo
 variables, @xref{Connection Variables, , , emacs}.
 @end ifinfo
@@ -2450,7 +2450,7 @@ where @samp{192.168.0.1} is the remote host IP address
 Android devices provide a restricted shell access through an USB
 connection.  The local host must have the @command{adb} program
 installed.  Usually, it is sufficient to open the file
-@file{@trampfn{adb,,/}}.  Then you can navigate in the filesystem via
+@file{@trampfn{adb,,/}}.  Then you can navigate in the file system via
 @code{dired}.
 
 Alternatively, applications such as @code{Termux} or @code{SSHDroid}
@@ -2937,10 +2937,10 @@ Example:
 @end example
 
 During file name completion, remote directory contents are re-read
-regularly to account for any changes in the filesystem that may affect
-the completion candidates.  Such re-reads can account for changes to
-the file system by applications outside Emacs (@pxref{Connection
-caching}).
+regularly to account for any changes in the file system that may
+affect the completion candidates.  Such re-reads can account for
+changes to the file system by applications outside Emacs
+(@pxref{Connection caching}).
 
 @defopt tramp-completion-reread-directory-timeout
 The timeout is number of seconds since last remote command for
@@ -3161,8 +3161,8 @@ ensures the correct name of the remote shell program.
 When @code{explicit-shell-file-name} is equal to @code{nil}, calling
 @code{shell} interactively will prompt for a shell name.
 
-Starting with Emacs 26, you could use connection-local variables for
-setting different values of @code{explicit-shell-file-name} for
+Starting with @w{Emacs 26}, you could use connection-local variables
+for setting different values of @code{explicit-shell-file-name} for
 different remote hosts.
 @ifinfo
 @xref{Connection Variables, , , emacs}.
@@ -3231,7 +3231,7 @@ variables.
 @vindex async-shell-command-width
 @vindex COLUMNS@r{, environment variable}
 If Emacs supports the variable @code{async-shell-command-width} (since
-Emacs 27.1), @value{tramp} cares about its value for asynchronous
+@w{Emacs 27.1}), @value{tramp} cares about its value for asynchronous
 shell commands.  It specifies the number of display columns for
 command output.  For synchronous shell commands, a similar effect can
 be achieved by adding the environment variable @env{COLUMNS} to
@@ -3840,8 +3840,8 @@ Where is the latest @value{tramp}?
 @item
 Which systems does it work on?
 
-The package works successfully on Emacs 24, Emacs 25, Emacs 26, Emacs
-27, and Emacs 28.
+The package works successfully on @w{Emacs 25}, @w{Emacs 26}, @w{Emacs
+27}, and @w{Emacs 28}.
 
 While Unix and Unix-like systems are the primary remote targets,
 @value{tramp} has equal success connecting to other platforms, such as
@@ -4178,7 +4178,7 @@ Host indication in the mode line?
 
 @cindex @value{tramp} theme
 @vindex tramp-theme-face-remapping-alist
-Install @file{tramp-theme} from GNU ELPA via Emacs' Package Manager.
+Install @file{tramp-theme} from GNU ELPA via Emacs's Package Manager.
 Enable it via @kbd{M-x load-theme @key{RET} tramp @key{RET}}.  Further
 customization is explained in user option
 @code{tramp-theme-face-remapping-alist}.
index 02a99ebde835545010fb5b9e731cad67c1f71a9b..aabb2f8acc359b2548cf20f87d1bd21eb2d43ffd 100644 (file)
@@ -8,9 +8,9 @@
 @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.4-pre
+@set trampver 2.5.0-pre
 @set tramp-bug-report-address tramp-devel@@gnu.org
-@set emacsver 24.4
+@set emacsver 25.1
 
 @c Other flags from configuration.
 @set instprefix /usr/local
index efe8934421643b8d903ed79764a2e21d938dc7db..194dd2d308f298baeb8e6129c4bf29f449e4b74e 100644 (file)
@@ -181,10 +181,9 @@ It is used for TCP/IP devices."
   "Invoke the ADB handler for OPERATION.
 First arg specifies the OPERATION, second arg is a list of
 ARGUMENTS to pass to the OPERATION."
-  (let ((fn (assoc operation tramp-adb-file-name-handler-alist)))
-    (if fn
-       (save-match-data (apply (cdr fn) arguments))
-      (tramp-run-real-handler operation arguments))))
+  (if-let ((fn (assoc operation tramp-adb-file-name-handler-alist)))
+      (save-match-data (apply (cdr fn) arguments))
+    (tramp-run-real-handler operation arguments)))
 
 ;;;###tramp-autoload
 (tramp--with-startup
@@ -234,8 +233,7 @@ ARGUMENTS to pass to the OPERATION."
   "Like `file-truename' for Tramp files."
   ;; Preserve trailing "/".
   (funcall
-   (if (tramp-compat-directory-name-p filename)
-       #'file-name-as-directory #'identity)
+   (if (directory-name-p filename) #'file-name-as-directory #'identity)
    ;; Quote properly.
    (funcall
     (if (tramp-compat-file-name-quoted-p filename)
@@ -719,7 +717,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
        (when (and (not ok-if-already-exists) (file-exists-p newname))
          (tramp-error v 'file-already-exists newname))
        (when (and (file-directory-p newname)
-                  (not (tramp-compat-directory-name-p newname)))
+                  (not (directory-name-p newname)))
          (tramp-error v 'file-error "File is a directory %s" newname))
 
        (with-tramp-progress-reporter
@@ -739,39 +737,37 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
                    (tramp-shell-quote-argument l2))
                 "Error copying %s to %s" filename newname))
 
-           (let ((tmpfile (file-local-copy filename)))
-
-             (if tmpfile
-                 ;; Remote filename.
-                 (condition-case err
-                     (rename-file tmpfile newname ok-if-already-exists)
-                   ((error quit)
-                    (delete-file tmpfile)
-                    (signal (car err) (cdr err))))
-
-               ;; Remote newname.
-               (when (and (file-directory-p newname)
-                          (tramp-compat-directory-name-p newname))
-                 (setq newname
-                       (expand-file-name
-                        (file-name-nondirectory filename) newname)))
-
-               (with-parsed-tramp-file-name newname nil
-                 (when (and (not ok-if-already-exists)
-                            (file-exists-p newname))
-                   (tramp-error v 'file-already-exists newname))
-
-                 ;; We must also flush the cache of the directory,
-                 ;; because `file-attributes' reads the values from
-                 ;; there.
-                 (tramp-flush-file-properties v localname)
-                 (when (tramp-adb-execute-adb-command
-                        v "push"
-                        (tramp-compat-file-name-unquote filename)
-                        (tramp-compat-file-name-unquote localname))
-                   (tramp-error
-                    v 'file-error
-                    "Cannot copy `%s' `%s'" filename newname)))))))))
+           (if-let ((tmpfile (file-local-copy filename)))
+               ;; Remote filename.
+               (condition-case err
+                   (rename-file tmpfile newname ok-if-already-exists)
+                 ((error quit)
+                  (delete-file tmpfile)
+                  (signal (car err) (cdr err))))
+
+             ;; Remote newname.
+             (when (and (file-directory-p newname)
+                        (directory-name-p newname))
+               (setq newname
+                     (expand-file-name
+                      (file-name-nondirectory filename) newname)))
+
+             (with-parsed-tramp-file-name newname nil
+               (when (and (not ok-if-already-exists)
+                          (file-exists-p newname))
+                 (tramp-error v 'file-already-exists newname))
+
+               ;; We must also flush the cache of the directory,
+               ;; because `file-attributes' reads the values from
+               ;; there.
+               (tramp-flush-file-properties v localname)
+               (when (tramp-adb-execute-adb-command
+                      v "push"
+                      (tramp-compat-file-name-unquote filename)
+                      (tramp-compat-file-name-unquote localname))
+                 (tramp-error
+                  v 'file-error
+                  "Cannot copy `%s' `%s'" filename newname))))))))
 
     ;; KEEP-DATE handling.
     (when keep-date
@@ -801,7 +797,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
        (when (and (not ok-if-already-exists) (file-exists-p newname))
          (tramp-error v 'file-already-exists newname))
        (when (and (file-directory-p newname)
-                  (not (tramp-compat-directory-name-p newname)))
+                  (not (directory-name-p newname)))
          (tramp-error v 'file-error "File is a directory %s" newname))
 
        (with-tramp-progress-reporter
index b9bf6180a5dcd0910543aead62c15cc2583d8d5a..95cbfb8c22a6727fa6ac56f5e0f34dacb341ced7 100644 (file)
@@ -350,7 +350,7 @@ arguments to pass to the OPERATION."
     (add-to-list 'file-name-handler-alist
                 (cons (tramp-archive-autoload-file-name-regexp)
                       #'tramp-archive-autoload-file-name-handler))
-    (put 'tramp-archive-autoload-file-name-handler 'safe-magic t))))
+    (put #'tramp-archive-autoload-file-name-handler 'safe-magic t))))
 
 ;;;###autoload
 (progn
@@ -366,7 +366,7 @@ arguments to pass to the OPERATION."
 (tramp-register-archive-file-name-handler)
 
 ;; Mark `operations' the handler is responsible for.
-(put 'tramp-archive-file-name-handler 'operations
+(put #'tramp-archive-file-name-handler 'operations
      (mapcar #'car tramp-archive-file-name-handler-alist))
 
 ;; `tramp-archive-file-name-handler' must be placed before `url-file-handler'.
@@ -517,13 +517,16 @@ offered."
   (declare (debug (form symbolp body))
            (indent 2))
   (let ((bindings
-         (mapcar (lambda (elem)
-                   `(,(if var (intern (format "%s-%s" var elem)) elem)
-                     (,(intern (format "tramp-file-name-%s" elem))
-                      ,(or var 'v))))
-                `,(cons
-                   'archive
-                   (delete 'hop (tramp-compat-tramp-file-name-slots))))))
+         (mapcar
+         (lambda (elem)
+            `(,(if var (intern (format "%s-%s" var elem)) elem)
+              (,(intern (format "tramp-file-name-%s" elem))
+               ,(or var 'v))))
+         (cons
+          'archive
+          (delete
+           'hop
+           (cdr (mapcar #'car (cl-struct-slot-info 'tramp-file-name))))))))
     `(let* ((,(or var 'v) (tramp-archive-dissect-file-name ,filename))
             ,@bindings)
        ;; We don't know which of those vars will be used, so we bind them all,
index b81a1a23d5f8e3ba3351181e4061641a786f3fc0..f8325a16892f766d59e22af16fec678cfeccf3ab 100644 (file)
@@ -130,13 +130,8 @@ Returns DEFAULT if not set."
             (or (null remote-file-name-inhibit-cache)
                 (and (integerp remote-file-name-inhibit-cache)
                      (time-less-p
-                      ;; `current-time' can be nil once we get rid of Emacs 24.
-                      (current-time)
-                      (time-add
-                       (car value)
-                      ;; `seconds-to-time' can be removed once we get
-                      ;; rid of Emacs 24.
-                       (seconds-to-time remote-file-name-inhibit-cache))))
+                      nil
+                      (time-add (car value) remote-file-name-inhibit-cache)))
                 (and (consp remote-file-name-inhibit-cache)
                      (time-less-p
                       remote-file-name-inhibit-cache (car value)))))
@@ -386,20 +381,15 @@ used to cache connection properties of the local machine."
       (maphash
        (lambda (key value)
         ;; Remove text properties from KEY and VALUE.
-        ;; `cl-struct-slot-*' functions exist since Emacs 25 only; we
-        ;; ignore errors.
         (when (tramp-file-name-p key)
-          ;; (dolist
-          ;;     (slot
-          ;;   (mapcar #'car (cdr (cl-struct-slot-info 'tramp-file-name))))
-          ;;   (when (stringp (cl-struct-slot-value 'tramp-file-name slot key))
-          ;;     (setf (cl-struct-slot-value 'tramp-file-name slot key)
-          ;;        (substring-no-properties
-          ;;         (cl-struct-slot-value 'tramp-file-name slot key))))))
-          (dotimes (i (length key))
-            (when (stringp (elt key i))
-              (setf (elt key i) (substring-no-properties (elt key i))))))
-        (when (stringp key)
+           (dolist
+               (slot
+                (mapcar #'car (cdr (cl-struct-slot-info 'tramp-file-name))))
+             (when (stringp (cl-struct-slot-value 'tramp-file-name slot key))
+               (setf (cl-struct-slot-value 'tramp-file-name slot key)
+                     (substring-no-properties
+                      (cl-struct-slot-value 'tramp-file-name slot key))))))
+         (when (stringp key)
           (setq key (substring-no-properties key)))
         (when (stringp value)
           (setq value (substring-no-properties value)))
index 3f25afedb9931ea968b0d60ff1f79988e4996857..ba1cb9e431054c0e15f3c8cedda357f976af5a30 100644 (file)
 
 ;;; Commentary:
 
-;; Tramp's main Emacs version for development is Emacs 27.  This
-;; package provides compatibility functions for Emacs 24, Emacs 25 and
-;; Emacs 26.
+;; Tramp's main Emacs version for development is Emacs 28.  This
+;; package provides compatibility functions for Emacs 25, Emacs 26 and
+;; Emacs 27.
 
 ;;; Code:
 
-;; In Emacs 24 and 25, `tramp-unload-file-name-handlers' is not
-;; autoloaded.  So we declare it here in order to avoid recursive
-;; load.  This will be overwritten in tramp.el.
+;; In Emacs 25, `tramp-unload-file-name-handlers' is not autoloaded.
+;; So we declare it here in order to avoid recursive load.  This will
+;; be overwritten in tramp.el.
 (defun tramp-unload-file-name-handlers () ".")
 
 (require 'auth-source)
@@ -52,6 +52,8 @@
   `(when (functionp ,function)
      (with-no-warnings (funcall ,function ,@arguments))))
 
+(put #'tramp-compat-funcall 'tramp-suppress-trace t)
+
 (defsubst tramp-compat-temporary-file-directory ()
   "Return name of directory for temporary files.
 It is the default value of `temporary-file-directory'."
@@ -78,28 +80,18 @@ Add the extension of F, if existing."
 (defun tramp-compat-process-running-p (process-name)
   "Return t if system process PROCESS-NAME is running for `user-login-name'."
   (when (stringp process-name)
-    (cond
-     ;; GNU Emacs 22 on w32.
-     ((fboundp 'w32-window-exists-p)
-      (tramp-compat-funcall 'w32-window-exists-p process-name process-name))
-
-     ;; GNU Emacs 23+.
-     ((and (fboundp 'list-system-processes) (fboundp 'process-attributes))
-      (let (result)
-       (dolist (pid (tramp-compat-funcall 'list-system-processes) result)
-         (let ((attributes (process-attributes pid)))
-           (when (and (string-equal
-                        (cdr (assoc 'user attributes)) (user-login-name))
-                       (let ((comm (cdr (assoc 'comm attributes))))
-                         ;; The returned command name could be truncated
-                         ;; to 15 characters.  Therefore, we cannot check
-                         ;; for `string-equal'.
-                         (and comm (string-match-p
-                                    (concat "^" (regexp-quote comm))
-                                    process-name))))
-             (setq result t)))))))))
-
-;; `file-attribute-*' are introduced in Emacs 25.1.
+    (let (result)
+      (dolist (pid (tramp-compat-funcall 'list-system-processes) result)
+       (let ((attributes (process-attributes pid)))
+         (and (string-equal (cdr (assoc 'user attributes)) (user-login-name))
+               (when-let ((comm (cdr (assoc 'comm attributes))))
+                 ;; The returned command name could be truncated to 15
+                 ;; characters.  Therefore, we cannot check for
+                 ;; `string-equal'.
+                (string-match-p (concat "^" (regexp-quote comm)) process-name))
+              (setq result t)))))))
+
+;; `file-attribute-*' are introduced in Emacs 26.1.
 
 (defalias 'tramp-compat-file-attribute-type
   (if (fboundp 'file-attribute-type)
@@ -181,24 +173,6 @@ and later, and is a float in Emacs 26 and earlier."
 This is a string of ten letters or dashes as in ls -l."
       (nth 8 attributes))))
 
-;; `format-message' is new in Emacs 25.1.
-(unless (fboundp 'format-message)
-  (defalias 'format-message #'format))
-
-;; `directory-name-p' is new in Emacs 25.1.
-(defalias 'tramp-compat-directory-name-p
-  (if (fboundp 'directory-name-p)
-      #'directory-name-p
-    (lambda (name)
-      "Return non-nil if NAME ends with a directory separator character."
-      (let ((len (length name))
-            (lastc ?.))
-       (if (> len 0)
-            (setq lastc (aref name (1- len))))
-       (or (= lastc ?/)
-            (and (memq system-type '(windows-nt ms-dos))
-                (= lastc ?\\)))))))
-
 ;; `file-missing' is introduced in Emacs 26.1.
 (defconst tramp-file-missing
   (if (get 'file-missing 'error-conditions) 'file-missing 'file-error)
@@ -266,13 +240,6 @@ NAME is unquoted."
        ((eq tramp-syntax 'sep) 'separate)
        (t tramp-syntax)))
 
-;; `cl-struct-slot-info' has been introduced with Emacs 25.
-(defmacro tramp-compat-tramp-file-name-slots ()
-  "Return a list of slot names."
-  (if (fboundp 'cl-struct-slot-info)
-      '(cdr (mapcar #'car (cl-struct-slot-info 'tramp-file-name)))
-    '(cdr (mapcar #'car (get 'tramp-file-name 'cl-struct-slots)))))
-
 ;; The signature of `tramp-make-tramp-file-name' has been changed.
 ;; Therefore, we cannot use `url-tramp-convert-url-to-tramp' prior
 ;; Emacs 26.1.  We use `temporary-file-directory' as indicator.
@@ -285,10 +252,9 @@ NAME is unquoted."
       #'exec-path
     (lambda ()
       "List of directories to search programs to run in remote subprocesses."
-      (let ((handler (find-file-name-handler default-directory 'exec-path)))
-       (if handler
-           (funcall handler 'exec-path)
-         exec-path)))))
+      (if-let ((handler (find-file-name-handler default-directory 'exec-path)))
+         (funcall handler 'exec-path)
+       exec-path))))
 
 ;; `time-equal-p' has appeared in Emacs 27.1.
 (defalias 'tramp-compat-time-equal-p
@@ -328,11 +294,6 @@ 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
index 34a234c47f06acce394fc8ca80ca0d00ccc5a707..67135e30d640e1dfda9bfaf05684d1495050b9fa 100644 (file)
@@ -457,7 +457,7 @@ It has been changed in GVFS 1.14.")
 ;; </interface>
 
 ;; The basic structure for GNOME Online Accounts.  We use a list :type,
-;; in order to be compatible with Emacs 24 and 25.
+;; in order to be compatible with Emacs 25.
 (cl-defstruct (tramp-goa-name (:type list) :named) method user host port)
 
 ;; "gvfs-<command>" utilities have been deprecated in GVFS 1.31.1.  We
@@ -625,10 +625,9 @@ First arg specifies the OPERATION, second arg is a list of arguments to
 pass to the OPERATION."
   (unless tramp-gvfs-enabled
     (tramp-user-error nil "Package `tramp-gvfs' not supported"))
-  (let ((fn (assoc operation tramp-gvfs-file-name-handler-alist)))
-    (if fn
-       (save-match-data (apply (cdr fn) args))
-      (tramp-run-real-handler operation args))))
+  (if-let ((fn (assoc operation tramp-gvfs-file-name-handler-alist)))
+      (save-match-data (apply (cdr fn) args))
+    (tramp-run-real-handler operation args)))
 
 ;;;###tramp-autoload
 (when (featurep 'dbusbind)
@@ -649,13 +648,12 @@ pass to the OPERATION."
   "Like `dbus-byte-array-to-string' but remove trailing \\0 if exists.
 Return nil for null BYTE-ARRAY."
   ;; The byte array could be a variant.  Take care.
-  (let ((byte-array
-        (if (and (consp byte-array) (atom (car byte-array)))
-            byte-array (car byte-array))))
-    (and byte-array
-        (dbus-byte-array-to-string
-         (if (and (consp byte-array) (zerop (car (last byte-array))))
-             (butlast byte-array) byte-array)))))
+  (when-let ((byte-array
+             (if (and (consp byte-array) (atom (car byte-array)))
+                 byte-array (car byte-array))))
+    (dbus-byte-array-to-string
+     (if (and (consp byte-array) (zerop (car (last byte-array))))
+        (butlast byte-array) byte-array))))
 
 (defun tramp-gvfs-stringify-dbus-message (message)
   "Convert a D-Bus MESSAGE into readable UTF8 strings, used for traces."
@@ -680,6 +678,8 @@ The call will be traced by Tramp with trace level 6."
     (tramp-message vec 6 "%s" result(tramp-gvfs-stringify-dbus-message result))
     result))
 
+(put #'tramp-dbus-function 'tramp-suppress-trace t)
+
 (defmacro with-tramp-dbus-call-method
   (vec synchronous bus service path interface method &rest args)
   "Apply a D-Bus call on bus BUS.
@@ -689,14 +689,13 @@ it is an asynchronous call, with `ignore' as callback function.
 
 The other arguments have the same meaning as with `dbus-call-method'
 or `dbus-call-method-asynchronously'."
+  (declare (indent 2) (debug t))
   `(let ((func (if ,synchronous
                   #'dbus-call-method #'dbus-call-method-asynchronously))
         (args (append (list ,bus ,service ,path ,interface ,method)
                       (if ,synchronous (list ,@args) (list 'ignore ,@args)))))
      (tramp-dbus-function ,vec func args)))
 
-(put 'with-tramp-dbus-call-method 'lisp-indent-function 2)
-(put 'with-tramp-dbus-call-method 'edebug-form-spec '(form symbolp body))
 (font-lock-add-keywords 'emacs-lisp-mode '("\\<with-tramp-dbus-call-method\\>"))
 
 (defmacro with-tramp-dbus-get-all-properties
@@ -704,6 +703,7 @@ or `dbus-call-method-asynchronously'."
   "Return all properties of INTERFACE.
 The call will be traced by Tramp with trace level 6."
      ;; Check, that interface exists at object path.  Retrieve properties.
+  (declare (indent 1) (debug t))
   `(when (member
          ,interface
          (tramp-dbus-function
@@ -712,8 +712,6 @@ The call will be traced by Tramp with trace level 6."
      (tramp-dbus-function
       ,vec #'dbus-get-all-properties (list ,bus ,service ,path ,interface))))
 
-(put 'with-tramp-dbus-get-all-properties 'lisp-indent-function 1)
-(put 'with-tramp-dbus-get-all-properties 'edebug-form-spec '(form symbolp body))
 (font-lock-add-keywords 'emacs-lisp-mode '("\\<with-tramp-dbus-get-all-properties\\>"))
 
 (defvar tramp-gvfs-dbus-event-vector nil
@@ -772,7 +770,7 @@ file names."
        (when (and (not ok-if-already-exists) (file-exists-p newname))
          (tramp-error v 'file-already-exists newname))
        (when (and (file-directory-p newname)
-                  (not (tramp-compat-directory-name-p newname)))
+                  (not (directory-name-p newname)))
          (tramp-error v 'file-error "File is a directory %s" newname))
 
        (if (or (and equal-remote
index 0d1ef0f0e914f485c321ea31cc5e95c31b69250c..3e029e44ff5b7f68d3bc729fcf8ce46297e119e7 100644 (file)
@@ -157,10 +157,9 @@ Operations not mentioned here will be handled by the default Emacs primitives.")
   "Invoke the rclone handler for OPERATION and ARGS.
 First arg specifies the OPERATION, second arg is a list of arguments to
 pass to the OPERATION."
-  (let ((fn (assoc operation tramp-rclone-file-name-handler-alist)))
-    (if fn
-       (save-match-data (apply (cdr fn) args))
-      (tramp-run-real-handler operation args))))
+  (if-let ((fn (assoc operation tramp-rclone-file-name-handler-alist)))
+      (save-match-data (apply (cdr fn) args))
+    (tramp-run-real-handler operation args)))
 
 ;;;###tramp-autoload
 (tramp--with-startup
@@ -220,7 +219,7 @@ file names."
        (when (and (not ok-if-already-exists) (file-exists-p newname))
          (tramp-error v 'file-already-exists newname))
        (when (and (file-directory-p newname)
-                  (not (tramp-compat-directory-name-p newname)))
+                  (not (directory-name-p newname)))
          (tramp-error v 'file-error "File is a directory %s" newname))
 
        (if (or (and t1 (not (tramp-rclone-file-name-p filename)))
index 4ca1f651734db799272da2b57ab99b49056e9f1d..5f2c1ad3d5632fcf3a334a16826ffaaa9285c041 100644 (file)
@@ -1114,8 +1114,7 @@ component is used as the target of the symlink."
   "Like `file-truename' for Tramp files."
   ;; Preserve trailing "/".
   (funcall
-   (if (tramp-compat-directory-name-p filename)
-       #'file-name-as-directory #'identity)
+   (if (directory-name-p filename) #'file-name-as-directory #'identity)
    ;; Quote properly.
    (funcall
     (if (tramp-compat-file-name-quoted-p filename)
@@ -1273,8 +1272,8 @@ component is used as the target of the symlink."
 (defun tramp-do-file-attributes-with-ls (vec localname &optional id-format)
   "Implement `file-attributes' for Tramp files using the ls(1) command."
   (let (symlinkp dirp
-                res-inode res-filemodes res-numlinks
-                res-uid res-gid res-size res-symlink-target)
+       res-inode res-filemodes res-numlinks
+       res-uid res-gid res-size res-symlink-target)
     (tramp-message vec 5 "file attributes with ls: %s" localname)
     ;; We cannot send all three commands combined, it could exceed
     ;; NAME_MAX or PATH_MAX.  Happened on macOS, for example.
@@ -1958,7 +1957,7 @@ tramp-sh-handle-file-name-all-completions: internal error accessing `%s': `%s'"
          ;; scp or rsync DTRT.
          (progn
            (when (and (file-directory-p newname)
-                      (not (tramp-compat-directory-name-p newname)))
+                      (not (directory-name-p newname)))
              (tramp-error v 'file-already-exists newname))
            (setq dirname (directory-file-name (expand-file-name dirname))
                  newname (directory-file-name (expand-file-name newname)))
@@ -2040,7 +2039,7 @@ file names."
        (when (and (not ok-if-already-exists) (file-exists-p newname))
          (tramp-error v 'file-already-exists newname))
        (when (and (file-directory-p newname)
-                  (not (tramp-compat-directory-name-p newname)))
+                  (not (directory-name-p newname)))
          (tramp-error v 'file-error "File is a directory %s" newname))
 
        (with-tramp-progress-reporter
@@ -2724,7 +2723,7 @@ The method used must be an out-of-band method."
            (when (file-symlink-p filename)
              (goto-char (search-backward "->" beg 'noerror)))
            (search-backward
-            (if (tramp-compat-directory-name-p filename)
+            (if (directory-name-p filename)
                 "."
               (file-name-nondirectory filename))
             beg 'noerror)
@@ -2734,12 +2733,11 @@ The method used must be an out-of-band method."
          (goto-char (point-min))
          ;; First find the line to put it on.
          (when (re-search-forward "^\\([[:space:]]*total\\)" nil t)
-           (let ((available (get-free-disk-space ".")))
-             (when available
-               ;; Replace "total" with "total used", to avoid confusion.
-               (replace-match "\\1 used in directory")
-               (end-of-line)
-               (insert " available " available))))
+           (when-let ((available (get-free-disk-space ".")))
+             ;; Replace "total" with "total used", to avoid confusion.
+             (replace-match "\\1 used in directory")
+             (end-of-line)
+             (insert " available " available)))
 
          (goto-char (point-max)))))))
 
@@ -3501,8 +3499,7 @@ STDERR can also be a file name."
 (defun tramp-sh-handle-vc-registered (file)
   "Like `vc-registered' for Tramp files."
   (when vc-handled-backends
-    (let ((tramp-message-show-message
-          (and (not revert-buffer-in-progress-p) tramp-message-show-message))
+    (let ((inhibit-message (or revert-buffer-in-progress-p inhibit-message))
          (temp-message (unless revert-buffer-in-progress-p "")))
       (with-temp-message temp-message
        (with-parsed-tramp-file-name file nil
@@ -3592,10 +3589,9 @@ STDERR can also be a file name."
 (defun tramp-sh-file-name-handler (operation &rest args)
   "Invoke remote-shell Tramp file name handler.
 Fall back to normal file name handler if no Tramp handler exists."
-  (let ((fn (assoc operation tramp-sh-file-name-handler-alist)))
-    (if fn
-       (save-match-data (apply (cdr fn) args))
-      (tramp-run-real-handler operation args))))
+  (if-let ((fn (assoc operation tramp-sh-file-name-handler-alist)))
+      (save-match-data (apply (cdr fn) args))
+    (tramp-run-real-handler operation args)))
 
 ;; This must be the last entry, because `identity' always matches.
 ;;;###tramp-autoload
@@ -4883,11 +4879,8 @@ connection if a previous connection has died for some reason."
                (not (tramp-file-name-equal-p
                      vec (car tramp-current-connection)))
                (time-less-p
-                ;; `current-time' can be removed once we get rid of Emacs 24.
-                (time-since (or (cdr tramp-current-connection) (current-time)))
-                ;; `seconds-to-time' can be removed once we get rid
-                ;; of Emacs 24.
-                (seconds-to-time (or tramp-connection-min-time-diff 0))))
+                (time-since (cdr tramp-current-connection))
+                (or tramp-connection-min-time-diff 0)))
       (throw 'suppress 'suppress))
 
     ;; If too much time has passed since last command was sent, look
@@ -4898,11 +4891,9 @@ connection if a previous connection has died for some reason."
     ;; try to send a command from time to time, then look again
     ;; whether the process is really alive.
     (condition-case nil
-       ;; `seconds-to-time' can be removed once we get rid of Emacs 24.
-       (when (and (time-less-p (seconds-to-time 60)
-                               (time-since
-                                (tramp-get-connection-property
-                                 p "last-cmd-time" (seconds-to-time 0))))
+       (when (and (time-less-p
+                   60 (time-since
+                       (tramp-get-connection-property p "last-cmd-time" 0)))
                   (process-live-p p))
          (tramp-send-command vec "echo are you awake" t t)
          (unless (and (process-live-p p)
@@ -5995,9 +5986,6 @@ function cell is returned to be applied on a buffer."
 ;;   likely to produce long command lines, and some shells choke on
 ;;   long command lines.
 ;;
-;; * Don't search for perl5 and perl.  Instead, only search for perl and
-;;   then look if it's the right version (with `perl -v').
-;;
 ;; * When editing a remote CVS controlled file as a different user, VC
 ;;   gets confused about the file locking status.  Try to find out why
 ;;   the workaround doesn't work.
index d233af124e8353011e2c72fa5c9e0f586f7ce4bf..f02be394a7b966ae32bcb5b4ee738384cdaa4131 100644 (file)
@@ -329,10 +329,9 @@ This can be used to disable echo etc."
   "Invoke the SMB related OPERATION and ARGS.
 First arg specifies the OPERATION, second arg is a list of arguments to
 pass to the OPERATION."
-  (let ((fn (assoc operation tramp-smb-file-name-handler-alist)))
-    (if fn
-       (save-match-data (apply (cdr fn) args))
-      (tramp-run-real-handler operation args))))
+  (if-let ((fn (assoc operation tramp-smb-file-name-handler-alist)))
+      (save-match-data (apply (cdr fn) args))
+    (tramp-run-real-handler operation args)))
 
 ;;;###tramp-autoload
 (unless (memq system-type '(cygwin windows-nt))
@@ -420,7 +419,7 @@ pass to the OPERATION."
             v tramp-file-missing
             "Copying directory" "No such file or directory" dirname))
          (when (and (file-directory-p newname)
-                    (not (tramp-compat-directory-name-p newname)))
+                    (not (directory-name-p newname)))
            (tramp-error v 'file-already-exists newname))
          (cond
           ;; We must use a local temporary directory.
@@ -581,40 +580,39 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
         tramp-file-missing
         "Copying file" "No such file or directory" filename))
 
-      (let ((tmpfile (file-local-copy filename)))
-       (if tmpfile
-           ;; Remote filename.
-           (condition-case err
-               (rename-file tmpfile newname ok-if-already-exists)
-             ((error quit)
-              (delete-file tmpfile)
-              (signal (car err) (cdr err))))
-
-         ;; Remote newname.
+      (if-let ((tmpfile (file-local-copy filename)))
+         ;; Remote filename.
+         (condition-case err
+             (rename-file tmpfile newname ok-if-already-exists)
+           ((error quit)
+            (delete-file tmpfile)
+            (signal (car err) (cdr err))))
+
+       ;; Remote newname.
+       (when (and (file-directory-p newname)
+                  (directory-name-p newname))
+         (setq newname
+               (expand-file-name (file-name-nondirectory filename) newname)))
+
+       (with-parsed-tramp-file-name newname nil
+         (when (and (not ok-if-already-exists) (file-exists-p newname))
+           (tramp-error v 'file-already-exists newname))
          (when (and (file-directory-p newname)
-                    (tramp-compat-directory-name-p newname))
-           (setq newname
-                 (expand-file-name (file-name-nondirectory filename) newname)))
+                    (not (directory-name-p newname)))
+           (tramp-error v 'file-error "File is a directory %s" newname))
 
-         (with-parsed-tramp-file-name newname nil
-           (when (and (not ok-if-already-exists) (file-exists-p newname))
-             (tramp-error v 'file-already-exists newname))
-           (when (and (file-directory-p newname)
-                      (not (tramp-compat-directory-name-p newname)))
-             (tramp-error v 'file-error "File is a directory %s" newname))
-
-           ;; We must also flush the cache of the directory, because
-           ;; `file-attributes' reads the values from there.
-           (tramp-flush-file-properties v localname)
-           (unless (tramp-smb-get-share v)
-             (tramp-error
-              v 'file-error "Target `%s' must contain a share name" newname))
-           (unless (tramp-smb-send-command
-                    v (format "put \"%s\" \"%s\""
-                              (tramp-compat-file-name-unquote filename)
-                              (tramp-smb-get-localname v)))
-             (tramp-error
-              v 'file-error "Cannot copy `%s' to `%s'" filename newname))))))
+         ;; We must also flush the cache of the directory, because
+         ;; `file-attributes' reads the values from there.
+         (tramp-flush-file-properties v localname)
+         (unless (tramp-smb-get-share v)
+           (tramp-error
+            v 'file-error "Target `%s' must contain a share name" newname))
+         (unless (tramp-smb-send-command
+                  v (format "put \"%s\" \"%s\""
+                            (tramp-compat-file-name-unquote filename)
+                            (tramp-smb-get-localname v)))
+           (tramp-error
+            v 'file-error "Cannot copy `%s' to `%s'" filename newname)))))
 
     ;; KEEP-DATE handling.
     (when keep-date
@@ -1003,7 +1001,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
   (setq filename (expand-file-name filename))
   (unless switches (setq switches ""))
   ;; Mark trailing "/".
-  (when (and (tramp-compat-directory-name-p filename)
+  (when (and (directory-name-p filename)
             (not full-directory-p))
     (setq switches (concat switches "F")))
   (if full-directory-p
@@ -1355,7 +1353,7 @@ component is used as the target of the symlink."
     (when (and (not ok-if-already-exists) (file-exists-p newname))
       (tramp-error v 'file-already-exists newname))
     (when (and (file-directory-p newname)
-              (not (tramp-compat-directory-name-p newname)))
+              (not (directory-name-p newname)))
       (tramp-error v 'file-error "File is a directory %s" newname))
 
     (with-tramp-progress-reporter
@@ -1922,11 +1920,9 @@ If ARGUMENT is non-nil, use it as argument for
     ;; connection timeout.
     (with-current-buffer buf
       (goto-char (point-min))
-      ;; `seconds-to-time' can be removed once we get rid of Emacs 24.
-      (when (and (time-less-p (seconds-to-time 60)
-                             (time-since
-                              (tramp-get-connection-property
-                               p "last-cmd-time" (seconds-to-time 0))))
+      (when (and (time-less-p
+                 60 (time-since
+                     (tramp-get-connection-property p "last-cmd-time" 0)))
                 (process-live-p p)
                 (re-search-forward tramp-smb-errors nil t))
        (delete-process p)
@@ -1992,7 +1988,7 @@ If ARGUMENT is non-nil, use it as argument for
              (set-process-query-on-exit-flag p nil)
 
              (condition-case err
-                 (let (tramp-message-show-message)
+                 (let ((inhibit-message t))
                    ;; Play login scenario.
                    (tramp-process-actions
                     p vec nil
@@ -2130,7 +2126,5 @@ Removes smb prompt.  Returns nil if an error message has appeared."
 ;;
 ;; * Try to remove the inclusion of dummy "" directory.  Seems to be at
 ;;   several places, especially in `tramp-smb-handle-insert-directory'.
-;;
-;; * Ignore case in file names.
 
 ;;; tramp-smb.el ends here
index e5590b8cf6c9448db637342461f2ea0be23c5a52..9f08d5f1e64d1b56e2ac6d04fc08c8aa5d5456da 100644 (file)
@@ -153,10 +153,9 @@ See `tramp-actions-before-shell' for more info.")
   "Invoke the SUDOEDIT handler for OPERATION and ARGS.
 First arg specifies the OPERATION, second arg is a list of arguments to
 pass to the OPERATION."
-  (let ((fn (assoc operation tramp-sudoedit-file-name-handler-alist)))
-    (if fn
-       (save-match-data (apply (cdr fn) args))
-      (tramp-run-real-handler operation args))))
+  (if-let ((fn (assoc operation tramp-sudoedit-file-name-handler-alist)))
+      (save-match-data (apply (cdr fn) args))
+    (tramp-run-real-handler operation args)))
 
 ;;;###tramp-autoload
 (tramp--with-startup
@@ -248,7 +247,7 @@ absolute file names."
        (when (and (not ok-if-already-exists) (file-exists-p newname))
          (tramp-error v 'file-already-exists newname))
        (when (and (file-directory-p newname)
-                  (not (tramp-compat-directory-name-p newname)))
+                  (not (directory-name-p newname)))
          (tramp-error v 'file-error "File is a directory %s" newname))
 
        (if (or (and (file-remote-p filename) (not t1))
@@ -541,8 +540,7 @@ the result will be a local, non-Tramp, file name."
   "Like `file-truename' for Tramp files."
   ;; Preserve trailing "/".
   (funcall
-   (if (tramp-compat-directory-name-p filename)
-       #'file-name-as-directory #'identity)
+   (if (directory-name-p filename) #'file-name-as-directory #'identity)
    ;; Quote properly.
    (funcall
     (if (tramp-compat-file-name-quoted-p filename)
index 6a044e5884037c592bad3685bf95a5db183144b1..f368f72a8dcd0b2ddea68c998f6e99cae2021e44 100644 (file)
@@ -94,8 +94,3 @@
 (provide 'tramp-uu)
 
 ;;; tramp-uu.el ends here
-
-;; Local Variables:
-;; mode: Emacs-Lisp
-;; coding: utf-8
-;; End:
index a7c9b34d29d117530d07a2030082dd5051eeee6a..900c15ffae93df45962554779f88ff065038dc68 100644 (file)
@@ -7,8 +7,8 @@
 ;; Maintainer: Michael Albinus <michael.albinus@gmx.de>
 ;; Keywords: comm, processes
 ;; Package: tramp
-;; Version: 2.4.4-pre
-;; Package-Requires: ((emacs "24.4"))
+;; Version: 2.5.0-pre
+;; Package-Requires: ((emacs "25.1"))
 ;; Package-Type: multi
 ;; URL: https://savannah.gnu.org/projects/tramp
 
@@ -1258,7 +1258,7 @@ calling HANDLER.")
 ;; data structure.
 
 ;; The basic structure for remote file names.  We use a list :type,
-;; in order to be compatible with Emacs 24 and 25.
+;; in order to be compatible with Emacs 25.
 (cl-defstruct (tramp-file-name (:type list) :named)
   method user domain host port localname hop)
 
@@ -1306,9 +1306,10 @@ entry does not exist, return nil."
        ;; We use the cached property.
        (tramp-get-connection-property vec hash-entry nil)
       ;; Use the static value from `tramp-methods'.
-      (let ((methods-entry
-            (assoc param (assoc (tramp-file-name-method vec) tramp-methods))))
-       (when methods-entry (cadr methods-entry))))))
+      (when-let ((methods-entry
+                 (assoc
+                  param (assoc (tramp-file-name-method vec) tramp-methods))))
+       (cadr methods-entry)))))
 
 ;; The localname can be quoted with "/:".  Extract this.
 (defun tramp-file-name-unquote-localname (vec)
@@ -1473,7 +1474,7 @@ default values are used."
                     :method method :user user :domain domain :host host
                     :port port :localname localname :hop hop))
          ;; The method must be known.
-         (unless (or nodefault (tramp-completion-mode-p)
+         (unless (or nodefault non-essential
                      (string-equal method tramp-default-method-marker)
                      (assoc method tramp-methods))
            (tramp-user-error
@@ -1749,29 +1750,10 @@ ARGUMENTS to actually emit the message (if applicable)."
        (setq btf (nth 1 (backtrace-frame btn)))
        (if (not btf)
            (setq fn "")
-         (when (symbolp btf)
-           (setq fn (symbol-name btf))
-           (unless
-               (and
-                (string-match-p "^tramp" fn)
-                (not
-                 (string-match-p
-                  (eval-when-compile
-                    (concat
-                     "^"
-                     (regexp-opt
-                      '("tramp-backtrace"
-                        "tramp-compat-funcall"
-                        "tramp-debug-message"
-                        "tramp-error"
-                        "tramp-error-with-buffer"
-                        "tramp-message"
-                        "tramp-signal-hook-function"
-                        "tramp-user-error")
-                      t)
-                     "$"))
-                  fn)))
-             (setq fn nil)))
+         (and (symbolp btf) (setq fn (symbol-name btf))
+              (or (not (string-match-p "^tramp" fn))
+                  (get btf 'tramp-suppress-trace))
+              (setq fn nil))
          (setq btn (1+ btn))))
       ;; The following code inserts filename and line number.  Should
       ;; be inactive by default, because it is time consuming.
@@ -1786,11 +1768,7 @@ ARGUMENTS to actually emit the message (if applicable)."
     ;; The message.
     (insert (apply #'format-message fmt-string arguments))))
 
-(defvar tramp-message-show-message (null noninteractive)
-  "Show Tramp message in the minibuffer.
-This variable is used to suppress progress reporter output, and
-to disable messages from `tramp-error'.  Those messages are
-visible anyway, because an error is raised.")
+(put #'tramp-debug-message 'tramp-suppress-trace t)
 
 (defsubst tramp-message (vec-or-proc level fmt-string &rest arguments)
   "Emit a message depending on verbosity level.
@@ -1808,7 +1786,7 @@ applicable)."
   (ignore-errors
     (when (<= level tramp-verbose)
       ;; Display only when there is a minimum level.
-      (when (and tramp-message-show-message (<= level 3))
+      (when (<= level 3)
        (apply #'message
               (concat
                (cond
@@ -1840,6 +1818,8 @@ applicable)."
                 (concat (format "(%d) # " level) fmt-string)
                 arguments))))))
 
+(put #'tramp-message 'tramp-suppress-trace t)
+
 (defsubst tramp-backtrace (&optional vec-or-proc)
   "Dump a backtrace into the debug buffer.
 If VEC-OR-PROC is nil, the buffer *debug tramp* is used.  This
@@ -1850,13 +1830,16 @@ function is meant for debugging purposes."
         vec-or-proc 10 "\n%s" (with-output-to-string (backtrace)))
       (with-output-to-temp-buffer "*debug tramp*" (backtrace)))))
 
+(put #'tramp-backtrace 'tramp-suppress-trace t)
+
 (defsubst tramp-error (vec-or-proc signal fmt-string &rest arguments)
   "Emit an error.
 VEC-OR-PROC identifies the connection to use, SIGNAL is the
 signal identifier to be raised, remaining arguments passed to
 `tramp-message'.  Finally, signal SIGNAL is raised with
 FMT-STRING and ARGUMENTS."
-  (let (tramp-message-show-message signal-hook-function)
+  (let ((inhibit-message t)
+       signal-hook-function)
     (tramp-backtrace vec-or-proc)
     (unless arguments
       ;; FMT-STRING could be just a file name, as in
@@ -1874,6 +1857,8 @@ FMT-STRING and ARGUMENTS."
     (signal signal (list (substring-no-properties
                          (apply #'format-message fmt-string arguments))))))
 
+(put #'tramp-error 'tramp-suppress-trace t)
+
 (defsubst tramp-error-with-buffer
   (buf vec-or-proc signal fmt-string &rest arguments)
   "Emit an error, and show BUF.
@@ -1891,13 +1876,13 @@ an input event arrives.  The other arguments are passed to `tramp-error'."
          (apply #'tramp-error vec-or-proc signal fmt-string arguments)
        ;; Save exit.
        (when (and buf
-                  tramp-message-show-message
                   (not (zerop tramp-verbose))
                   ;; Do not show when flagged from outside.
-                  (not (tramp-completion-mode-p))
+                  (not non-essential)
                   ;; Show only when Emacs has started already.
                   (current-message))
-         (let ((enable-recursive-minibuffers t))
+         (let ((enable-recursive-minibuffers t)
+               inhibit-message)
            ;; `tramp-error' does not show messages.  So we must do it
            ;; ourselves.
            (apply #'message fmt-string arguments)
@@ -1909,19 +1894,21 @@ an input event arrives.  The other arguments are passed to `tramp-error'."
        (when (tramp-file-name-equal-p vec (car tramp-current-connection))
          (setcdr tramp-current-connection (current-time)))))))
 
+(put #'tramp-error-with-buffer 'tramp-suppress-trace t)
+
 ;; We must make it a defun, because it is used earlier already.
 (defun tramp-user-error (vec-or-proc fmt-string &rest arguments)
   "Signal a user error (or \"pilot error\")."
   (unwind-protect
       (apply #'tramp-error vec-or-proc 'user-error fmt-string arguments)
     ;; Save exit.
-    (when (and tramp-message-show-message
-              (not (zerop tramp-verbose))
+    (when (and (not (zerop tramp-verbose))
               ;; Do not show when flagged from outside.
-              (not (tramp-completion-mode-p))
+              (not non-essential)
               ;; Show only when Emacs has started already.
               (current-message))
-      (let ((enable-recursive-minibuffers t))
+      (let ((enable-recursive-minibuffers t)
+           inhibit-message)
        ;; `tramp-error' does not show messages.  So we must do it ourselves.
        (apply #'message fmt-string arguments)
        (discard-input)
@@ -1931,18 +1918,21 @@ an input event arrives.  The other arguments are passed to `tramp-error'."
            (tramp-file-name-equal-p vec-or-proc (car tramp-current-connection))
          (setcdr tramp-current-connection (current-time)))))))
 
+(put #'tramp-user-error 'tramp-suppress-trace t)
+
 (defmacro tramp-with-demoted-errors (vec-or-proc format &rest body)
   "Execute BODY while redirecting the error message to `tramp-message'.
 BODY is executed like wrapped by `with-demoted-errors'.  FORMAT
 is a format-string containing a %-sequence meaning to substitute
 the resulting error message."
-  (declare (debug (symbolp body))
-           (indent 2))
+  (declare (indent 2) (debug (symbolp form body)))
   (let ((err (make-symbol "err")))
     `(condition-case-unless-debug ,err
          (progn ,@body)
        (error (tramp-message ,vec-or-proc 3 ,format ,err) nil))))
 
+(put #'tramp-with-demoted-errors 'tramp-suppress-trace t)
+
 ;; This function provides traces in case of errors not triggered by
 ;; Tramp functions.
 (defun tramp-signal-hook-function (error-symbol data)
@@ -1954,6 +1944,8 @@ the resulting error message."
      (car tramp-current-connection) error-symbol
      "%s" (mapconcat (lambda (x) (format "%s" x)) data " "))))
 
+(put #'tramp-signal-hook-function 'tramp-suppress-trace t)
+
 (defmacro with-parsed-tramp-file-name (filename var &rest body)
   "Parse a Tramp filename and make components available in the body.
 
@@ -1970,12 +1962,14 @@ Remaining args are Lisp expressions to be evaluated (inside an implicit
 
 If VAR is nil, then we bind `v' to the structure and `method', `user',
 `domain', `host', `port', `localname', `hop' to the components."
+  (declare (indent 2) (debug (form symbolp body)))
   (let ((bindings
-         (mapcar (lambda (elem)
-                   `(,(if var (intern (format "%s-%s" var elem)) elem)
-                     (,(intern (format "tramp-file-name-%s" elem))
-                      ,(or var 'v))))
-                `,(tramp-compat-tramp-file-name-slots))))
+         (mapcar
+         (lambda (elem)
+            `(,(if var (intern (format "%s-%s" var elem)) elem)
+              (,(intern (format "tramp-file-name-%s" elem))
+               ,(or var 'v))))
+         (cdr (mapcar #'car (cl-struct-slot-info 'tramp-file-name))))))
     `(let* ((,(or var 'v) (tramp-dissect-file-name ,filename))
             ,@bindings)
        ;; We don't know which of those vars will be used, so we bind them all,
@@ -1984,8 +1978,6 @@ If VAR is nil, then we bind `v' to the structure and `method', `user',
        (ignore ,@(mapcar #'car bindings))
        ,@body)))
 
-(put 'with-parsed-tramp-file-name 'lisp-indent-function 2)
-(put 'with-parsed-tramp-file-name 'edebug-form-spec '(form symbolp body))
 (font-lock-add-keywords 'emacs-lisp-mode '("\\<with-parsed-tramp-file-name\\>"))
 
 (defun tramp-progress-reporter-update (reporter &optional value suffix)
@@ -1996,22 +1988,20 @@ If VAR is nil, then we bind `v' to the structure and `method', `user',
       (tramp-compat-progress-reporter-update reporter value suffix))))
 
 (defmacro with-tramp-progress-reporter (vec level message &rest body)
-  "Execute BODY, spinning a progress reporter with MESSAGE.
+  "Execute BODY, spinning a progress reporter with MESSAGE in interactive mode.
 If LEVEL does not fit for visible messages, there are only traces
 without a visible progress reporter."
   (declare (indent 3) (debug t))
-  `(progn
+  `(if (or noninteractive inhibit-message)
+       (progn ,@body)
      (tramp-message ,vec ,level "%s..." ,message)
      (let ((cookie "failed")
            (tm
-            ;; We start a pulsing progress reporter after 3 seconds.
-            (when (and tramp-message-show-message
-                       ;; Display only when there is a minimum level.
-                       (<= ,level (min tramp-verbose 3)))
-             (let ((pr (make-progress-reporter ,message nil nil)))
-               (when pr
-                 (run-at-time
-                  3 0.1 #'tramp-progress-reporter-update pr))))))
+            ;; We start a pulsing progress reporter after 3
+            ;; seconds. Display only when there is a minimum level.
+            (when (<= ,level (min tramp-verbose 3))
+             (when-let ((pr (make-progress-reporter ,message nil nil)))
+               (run-at-time 3 0.1 #'tramp-progress-reporter-update pr)))))
        (unwind-protect
            ;; Execute the body.
            (prog1 (progn ,@body) (setq cookie "done"))
@@ -2025,6 +2015,7 @@ without a visible progress reporter."
 (defmacro with-tramp-file-property (vec file property &rest body)
   "Check in Tramp cache for PROPERTY, otherwise execute BODY and set cache.
 FILE must be a local file name on a connection identified via VEC."
+  (declare (indent 3) (debug t))
   `(if (file-name-absolute-p ,file)
       (let ((value (tramp-get-file-property ,vec ,file ,property 'undef)))
        (when (eq value 'undef)
@@ -2036,12 +2027,11 @@ FILE must be a local file name on a connection identified via VEC."
        value)
      ,@body))
 
-(put 'with-tramp-file-property 'lisp-indent-function 3)
-(put 'with-tramp-file-property 'edebug-form-spec t)
 (font-lock-add-keywords 'emacs-lisp-mode '("\\<with-tramp-file-property\\>"))
 
 (defmacro with-tramp-connection-property (key property &rest body)
   "Check in Tramp for property PROPERTY, otherwise execute BODY and set."
+  (declare (indent 2) (debug t))
   `(let ((value (tramp-get-connection-property ,key ,property 'undef)))
     (when (eq value 'undef)
       ;; We cannot pass ,@body as parameter to
@@ -2051,8 +2041,6 @@ FILE must be a local file name on a connection identified via VEC."
       (tramp-set-connection-property ,key ,property value))
     value))
 
-(put 'with-tramp-connection-property 'lisp-indent-function 2)
-(put 'with-tramp-connection-property 'edebug-form-spec t)
 (font-lock-add-keywords
  'emacs-lisp-mode '("\\<with-tramp-connection-property\\>"))
 
@@ -2106,7 +2094,7 @@ Example:
                    ;; Zeroconf service type.
                    ((string-match-p
                      "^_[[:alpha:]]+\\._[[:alpha:]]+$" (nth 1 (car v))))
-                   ;; Configuration file.
+                   ;; Configuration file or empty string.
                    (t (file-exists-p (nth 1 (car v))))))
        (setq r (delete (car v) r)))
       (setq v (cdr v)))
@@ -2272,10 +2260,7 @@ Must be handled by the callers."
              exec-path make-process))
     default-directory)
    ;; PROC.
-   ((member operation
-           '(file-notify-rm-watch
-             ;; Emacs 25+ only.
-             file-notify-valid-p))
+   ((member operation '(file-notify-rm-watch file-notify-valid-p))
     (when (processp (nth 0 args))
       (with-current-buffer (process-buffer (nth 0 args))
        default-directory)))
@@ -2395,7 +2380,7 @@ Fall back to normal file name handler if no Tramp file name handler exists."
                           (cons operation args))
                          (tramp-run-real-handler operation args))
                         ((eq result 'suppress)
-                         (let (tramp-message-show-message)
+                         (let ((inhibit-message t))
                            (tramp-message
                             v 1 "Suppress received in operation %s"
                             (cons operation args))
@@ -2424,8 +2409,8 @@ Fall back to normal file name handler if no Tramp file name handler exists."
 (defun tramp-completion-file-name-handler (operation &rest args)
   "Invoke Tramp file name completion handler for OPERATION and ARGS.
 Falls back to normal file name handler if no Tramp file name handler exists."
-  (let ((fn (assoc operation tramp-completion-file-name-handler-alist)))
-    (if (and fn tramp-mode)
+  (when tramp-mode
+    (if-let ((fn (assoc operation tramp-completion-file-name-handler-alist)))
        (save-match-data (apply (cdr fn) args))
       (tramp-run-real-handler operation args))))
 
@@ -2433,9 +2418,9 @@ Falls back to normal file name handler if no Tramp file name handler exists."
 (progn (defun tramp-autoload-file-name-handler (operation &rest args)
   "Load Tramp file name handler, and perform OPERATION."
   (tramp-unload-file-name-handlers)
-  (if tramp-mode
-      (let ((default-directory temporary-file-directory))
-       (load "tramp" 'noerror 'nomessage)))
+  (when tramp-mode
+    (let ((default-directory temporary-file-directory))
+      (load "tramp" 'noerror 'nomessage)))
   (apply operation args)))
 
 ;; `tramp-autoload-file-name-handler' must be registered before
@@ -2447,7 +2432,7 @@ Falls back to normal file name handler if no Tramp file name handler exists."
   (add-to-list 'file-name-handler-alist
               (cons tramp-autoload-file-name-regexp
                     'tramp-autoload-file-name-handler))
-  (put 'tramp-autoload-file-name-handler 'safe-magic t)))
+  (put #'tramp-autoload-file-name-handler 'safe-magic t)))
 
 ;;;###autoload (tramp-register-autoload-file-name-handlers)
 
@@ -2488,29 +2473,28 @@ remote file names."
   ;; respective foreign handlers.
   (add-to-list 'file-name-handler-alist
               (cons tramp-file-name-regexp #'tramp-file-name-handler))
-  (put 'tramp-file-name-handler 'safe-magic t)
+  (put #'tramp-file-name-handler 'safe-magic t)
 
   (add-to-list 'file-name-handler-alist
               (cons tramp-completion-file-name-regexp
                     #'tramp-completion-file-name-handler))
-  (put 'tramp-completion-file-name-handler 'safe-magic t)
+  (put #'tramp-completion-file-name-handler 'safe-magic t)
   ;; Mark `operations' the handler is responsible for.
-  (put 'tramp-completion-file-name-handler 'operations
+  (put #'tramp-completion-file-name-handler 'operations
        (mapcar #'car tramp-completion-file-name-handler-alist))
 
   (when (bound-and-true-p tramp-archive-enabled)
     (add-to-list 'file-name-handler-alist
                 (cons tramp-archive-file-name-regexp
                       #'tramp-archive-file-name-handler))
-    (put 'tramp-archive-file-name-handler 'safe-magic t))
+    (put #'tramp-archive-file-name-handler 'safe-magic t))
 
   ;; If jka-compr or epa-file are already loaded, move them to the
   ;; front of `file-name-handler-alist'.
   (dolist (fnh '(epa-file-handler jka-compr-handler))
-    (let ((entry (rassoc fnh file-name-handler-alist)))
-      (when entry
-       (setq file-name-handler-alist
-             (cons entry (delete entry file-name-handler-alist)))))))
+    (when-let ((entry (rassoc fnh file-name-handler-alist)))
+      (setq file-name-handler-alist
+           (cons entry (delete entry file-name-handler-alist))))))
 
 (tramp--with-startup (tramp-register-file-name-handlers))
 
@@ -2522,7 +2506,7 @@ Add operations defined in `HANDLER-alist' to `tramp-file-name-handler'."
   (add-to-list
    'tramp-foreign-file-name-handler-alist `(,func . ,handler) append)
   ;; Mark `operations' the handler is responsible for.
-  (put 'tramp-file-name-handler
+  (put #'tramp-file-name-handler
        'operations
        (delete-dups
         (append
@@ -2563,19 +2547,6 @@ Add operations defined in `HANDLER-alist' to `tramp-file-name-handler'."
 
 ;;; File name handler functions for completion mode:
 
-;;;###autoload
-(defvar tramp-completion-mode nil
-  "If non-nil, external packages signal that they are in file name completion.")
-(make-obsolete-variable 'tramp-completion-mode 'non-essential "26.1")
-
-(defun tramp-completion-mode-p ()
-  "Check, whether method / user name / host name completion is active."
-  (or
-   ;; Signal from outside.
-   non-essential
-   ;; This variable has been obsoleted in Emacs 26.
-   tramp-completion-mode))
-
 (defun tramp-connectable-p (vec-or-filename)
   "Check, whether it is possible to connect the remote host w/o side-effects.
 This is true, if either the remote host is already connected, or if we are
@@ -2590,7 +2561,7 @@ not in completion mode."
        ;; `tramp-buffer-name'; otherwise `start-file-process'
        ;; wouldn't run ever when `non-essential' is non-nil.
         (and vec (process-live-p (get-process (tramp-buffer-name vec))))
-       (not (tramp-completion-mode-p)))))
+       (not non-essential))))
 
 ;; Method, host name and user name completion.
 ;; `tramp-completion-dissect-file-name' returns a list of
@@ -2881,7 +2852,7 @@ Either user or host may be nil."
 (defun tramp-parse-rhosts-group ()
    "Return a (user host) tuple allowed to access.
 Either user or host may be nil."
-   (let ((result)
+   (let (result
         (regexp
          (concat
           "^\\(" tramp-host-regexp "\\)"
@@ -2966,7 +2937,7 @@ Host is always \"localhost\"."
 (defun tramp-parse-passwd-group ()
    "Return a (user host) tuple allowed to access.
 Host is always \"localhost\"."
-   (let ((result)
+   (let (result
         (regexp (concat "^\\(" tramp-user-regexp "\\):")))
      (when (re-search-forward regexp (point-at-eol) t)
        (setq result (list (match-string 1) "localhost")))
@@ -2988,7 +2959,7 @@ Host is always \"localhost\"."
 (defun tramp-parse-etc-group-group ()
    "Return a (group host) tuple allowed to access.
 Host is always \"localhost\"."
-   (let ((result)
+   (let (result
         (split (split-string (buffer-substring (point) (point-at-eol)) ":")))
      (when (member (user-login-name) (split-string (nth 3 split) "," 'omit))
        (setq result (list (nth 0 split) "localhost")))
@@ -3025,7 +2996,7 @@ User is always nil."
 (defun tramp-parse-putty-group (registry)
    "Return a (user host) tuple allowed to access.
 User is always nil."
-   (let ((result)
+   (let (result
         (regexp (concat (regexp-quote registry) "\\\\\\(.+\\)")))
      (when (re-search-forward regexp (point-at-eol) t)
        (setq result (list nil (match-string 1))))
@@ -3206,10 +3177,8 @@ User is always nil."
 
 (defun tramp-handle-file-modes (filename)
   "Like `file-modes' for Tramp files."
-  ;; Starting with Emacs 25.1, `when-let' can be used.
-  (let ((attrs (file-attributes (or (file-truename filename) filename))))
-    (when attrs
-      (tramp-mode-string-to-int (tramp-compat-file-attribute-modes attrs)))))
+  (when-let ((attrs (file-attributes (or (file-truename filename) filename))))
+    (tramp-mode-string-to-int (tramp-compat-file-attribute-modes attrs))))
 
 ;; Localname manipulation functions that grok Tramp localnames...
 (defun tramp-handle-file-name-as-directory (file)
@@ -3327,21 +3296,18 @@ User is always nil."
   (cond
    ((not (file-exists-p file1)) nil)
    ((not (file-exists-p file2)) t)
-   (t (time-less-p (tramp-compat-file-attribute-modification-time
-                   (file-attributes file2))
-                  (tramp-compat-file-attribute-modification-time
-                   (file-attributes file1))))))
+   (t (time-less-p
+       (tramp-compat-file-attribute-modification-time (file-attributes file2))
+       (tramp-compat-file-attribute-modification-time
+       (file-attributes file1))))))
 
 (defun tramp-handle-file-regular-p (filename)
   "Like `file-regular-p' for Tramp files."
   (and (file-exists-p filename)
        ;; Sometimes, `file-attributes' does not return a proper value
        ;; even if `file-exists-p' does.
-       (ignore-errors
-        (eq ?-
-            (aref
-             (tramp-compat-file-attribute-modes (file-attributes filename))
-             0)))))
+       (when-let ((attr (file-attributes filename)))
+        (eq ?- (aref (tramp-compat-file-attribute-modes attr) 0)))))
 
 (defun tramp-handle-file-remote-p (filename &optional identification connected)
   "Like `file-remote-p' for Tramp files."
@@ -3380,8 +3346,7 @@ User is always nil."
   "Like `file-truename' for Tramp files."
   ;; Preserve trailing "/".
   (funcall
-   (if (tramp-compat-directory-name-p filename)
-       #'file-name-as-directory #'identity)
+   (if (directory-name-p filename) #'file-name-as-directory #'identity)
    ;; Quote properly.
    (funcall
     (if (tramp-compat-file-name-quoted-p filename)
@@ -3452,7 +3417,7 @@ User is always nil."
   "Like `insert-directory' for Tramp files."
   (unless switches (setq switches ""))
   ;; Mark trailing "/".
-  (when (and (tramp-compat-directory-name-p filename)
+  (when (and (directory-name-p filename)
             (not full-directory-p))
     (setq switches (concat switches "F")))
   ;; Check, whether directory is accessible.
@@ -3621,7 +3586,7 @@ User is always nil."
        v tramp-file-missing "Cannot load nonexistent file `%s'" file))
     (if (not (file-exists-p file))
        nil
-      (let ((tramp-message-show-message (not nomessage)))
+      (let ((inhibit-message nomessage))
        (with-tramp-progress-reporter v 0 (format "Loading %s" file)
          (let ((local-copy (file-local-copy file)))
            (unwind-protect
@@ -4505,16 +4470,15 @@ If FILENAME is remote, a file name handler is called."
     (when (and modes (not (zerop (logand modes #o2000))))
       (setq gid (tramp-compat-file-attribute-group-id (file-attributes dir)))))
 
-  (let ((handler (find-file-name-handler filename 'tramp-set-file-uid-gid)))
-    (if handler
-       (funcall handler #'tramp-set-file-uid-gid filename uid gid)
-      ;; On W32 systems, "chown" does not work.
-      (unless (memq system-type '(ms-dos windows-nt))
-       (let ((uid (or (and (natnump uid) uid) (tramp-get-local-uid 'integer)))
-             (gid (or (and (natnump gid) gid) (tramp-get-local-gid 'integer))))
-         (tramp-call-process
-          nil "chown" nil nil nil (format "%d:%d" uid gid)
-          (tramp-unquote-shell-quote-argument filename)))))))
+  (if-let ((handler (find-file-name-handler filename 'tramp-set-file-uid-gid)))
+      (funcall handler #'tramp-set-file-uid-gid filename uid gid)
+    ;; On W32 systems, "chown" does not work.
+    (unless (memq system-type '(ms-dos windows-nt))
+      (let ((uid (or (and (natnump uid) uid) (tramp-get-local-uid 'integer)))
+           (gid (or (and (natnump gid) gid) (tramp-get-local-gid 'integer))))
+       (tramp-call-process
+        nil "chown" nil nil nil (format "%d:%d" uid gid)
+        (tramp-unquote-shell-quote-argument filename))))))
 
 (defun tramp-get-local-uid (id-format)
   "The uid of the local user, in ID-FORMAT.
@@ -5058,10 +5022,4 @@ name of a process or buffer, or nil to default to the current buffer."
 ;;   `start-file-process-shell-command', which is sufficient due to
 ;;   connection-local `shell-file-name'.
 
-
 ;;; tramp.el ends here
-
-;; Local Variables:
-;; mode: Emacs-Lisp
-;; coding: utf-8
-;; End:
index b31f0e0fd2612d13d98771a1b882e27251264a68..0a92e0d320210b7fc173f3c12e2eec90ea4d99b7 100644 (file)
 ;; 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.4-pre"
+(defconst tramp-version "2.5.0-pre"
   "This version of Tramp.")
 
 ;;;###tramp-autoload
@@ -71,9 +68,9 @@
   "The repository revision of the Tramp sources.")
 
 ;; Check for Emacs version.
-(let ((x   (if (not (string-lessp emacs-version "24.4"))
+(let ((x   (if (not (string-lessp emacs-version "25.1"))
       "ok"
-    (format "Tramp 2.4.4-pre is not fit for %s"
+    (format "Tramp 2.5.0-pre is not fit for %s"
             (replace-regexp-in-string "\n" "" (emacs-version))))))
   (unless (string-equal "ok" x) (error "%s" x)))
 
 (provide 'trampver)
 
 ;;; trampver.el ends here
-
-;; Local Variables:
-;; mode: Emacs-Lisp
-;; coding: utf-8
-;; End:
index 3229d2b65067f2bb5a714df24d7a763a187767a9..b3fc129ef08f11ee929a09ac2e022eae69301246 100644 (file)
@@ -60,7 +60,6 @@
 (setq password-cache-expiry nil
       tramp-cache-read-persistent-data t ;; For auth-sources.
       tramp-copy-size-limit nil
-      tramp-message-show-message nil
       tramp-persistency-file-name nil
       tramp-verbose 0)
 
@@ -971,4 +970,5 @@ If INTERACTIVE is non-nil, the tests are run interactively."
    "^tramp-archive"))
 
 (provide 'tramp-archive-tests)
+
 ;;; tramp-archive-tests.el ends here
index 549fb70aa926c0c8cf402ddc37be503cd3f01c3f..247f878d3c5f6506a51a875cb89ab37ccc4c4671 100644 (file)
@@ -67,8 +67,6 @@
 (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)
       (add-to-list
        'tramp-default-host-alist
        `("\\`mock\\'" nil ,(system-name)))
-      ;; Emacs' Makefile sets $HOME to a nonexistent value.  Needed in
-      ;; batch mode only, therefore.
+      ;; Emacs's Makefile sets $HOME to a nonexistent value.  Needed
+      ;; in batch mode only, therefore.
       (unless (and (null noninteractive) (file-directory-p "~/"))
         (setenv "HOME" temporary-file-directory))
       (format "/mock::%s" temporary-file-directory)))
       remote-file-name-inhibit-cache nil
       tramp-cache-read-persistent-data t ;; For auth-sources.
       tramp-copy-size-limit nil
-      tramp-message-show-message nil
       tramp-persistency-file-name nil
       tramp-verbose 0)
 
@@ -177,7 +174,6 @@ Print the content of the Tramp connection and debug buffers, if
 properly.  BODY shall not contain a timeout."
   (declare (indent 1) (debug (natnump body)))
   `(let ((tramp-verbose (max (or ,verbose 0) (or tramp-verbose 0)))
-        (tramp-message-show-message t)
         (debug-ignored-errors
          (append
           '("^make-symbolic-link not supported$"
@@ -2039,7 +2035,7 @@ properly.  BODY shall not contain a timeout."
       "/method:host:/:/path//foo"))
 
     ;; Forwhatever reasons, the following tests let Emacs crash for
-    ;; Emacs 24 and Emacs 25, occasionally. No idea what's up.
+    ;; Emacs 25, occasionally. No idea what's up.
     (when (tramp--test-emacs26-p)
       (should
        (string-equal (substitute-in-file-name "/method:host://~foo") "/~foo"))
@@ -2238,7 +2234,7 @@ This checks also `file-name-as-directory', `file-name-directory',
          (should
           (string-equal
            (file-name-as-directory file)
-           (if (tramp-completion-mode-p)
+           (if non-essential
                file (concat file (if (tramp--test-ange-ftp-p) "/" "./")))))
          (should (string-equal (file-name-directory file) file))
          (should (string-equal (file-name-nondirectory file) "")))))))
@@ -2376,7 +2372,7 @@ This checks also `file-name-as-directory', `file-name-directory',
            ;; Check message.
            ;; Macro `ert-with-message-capture' was introduced in Emacs 26.1.
            (with-no-warnings (when (symbol-plist 'ert-with-message-capture)
-             (let ((tramp-message-show-message t))
+             (let (inhibit-message)
                (dolist
                    (noninteractive (unless (tramp--test-ange-ftp-p) '(nil t)))
                  (dolist (visit '(nil t "string" no-message))
@@ -4242,8 +4238,7 @@ This tests also `make-symbolic-link', `file-truename' and `add-name-to-file'."
   :tags '(:expensive-test)
   (skip-unless (tramp--test-enabled))
   (skip-unless (or (tramp--test-adb-p) (tramp--test-sh-p)))
-  ;; `make-process' has been inserted in Emacs 25.1.  It supports file
-  ;; name handlers since Emacs 27.
+  ;; `make-process' supports file name handlers since Emacs 27.
   (skip-unless (tramp--test-emacs27-p))
 
   (dolist (quoted (if (tramp--test-expensive-test) '(nil t) '(nil)))
@@ -4965,13 +4960,9 @@ INPUT, if non-nil, is a string sent to the process."
                (error (ert-skip "`vc-create-repo' not supported")))
              ;; The structure of VC-FILESET is not documented.  Let's
              ;; hope it won't change.
-             (condition-case nil
-                 (vc-register
-                  (list (car vc-handled-backends)
-                        (list (file-name-nondirectory tmp-name2))))
-               ;; `vc-register' has changed its arguments in Emacs
-               ;; 25.1.  Let's skip it for older Emacsen.
-               (error (skip-unless (tramp--test-emacs25-p))))
+             (vc-register
+              (list (car vc-handled-backends)
+                    (list (file-name-nondirectory tmp-name2))))
              ;; vc-git uses an own process sentinel, Tramp's sentinel
              ;; for flushing the cache isn't used.
              (dired-uncache (concat (file-remote-p default-directory) "/"))
@@ -5228,12 +5219,6 @@ INPUT, if non-nil, is a string sent to the process."
     (delete-directory tmp-file)
     (should-not (file-exists-p tmp-file))))
 
-(defun tramp--test-emacs25-p ()
-  "Check for Emacs version >= 25.1.
-Some semantics has been changed for there, w/o new functions or
-variables, so we check the Emacs version directly."
-  (>= emacs-major-version 25))
-
 (defun tramp--test-emacs26-p ()
   "Check for Emacs version >= 26.1.
 Some semantics has been changed for there, w/o new functions or
@@ -6162,12 +6147,14 @@ Since it unloads Tramp, it shall be the last test to run."
      (and (or (and (boundp x) (null (local-variable-if-set-p x)))
              (and (functionp x) (null (autoloadp (symbol-function x)))))
          (string-match "^tramp" (symbol-name x))
+         ;; `tramp-completion-mode' is autoloaded in Emacs < 28.1.
+         (not (eq 'tramp-completion-mode x))
          (not (string-match "^tramp\\(-archive\\)?--?test" (symbol-name x)))
          (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.  `cl--find-class' must be protected in Emacs 24.
-  (with-no-warnings (should-not (cl--find-class 'tramp-file-name)))
+  ;; shall be purged.
+  (should-not (cl--find-class 'tramp-file-name))
   (mapatoms
    (lambda (x)
      (and (functionp x)
@@ -6214,4 +6201,5 @@ If INTERACTIVE is non-nil, the tests are run interactively."
 ;;   file name operation cannot run in the timer.  Remove `:unstable' tag?
 
 (provide 'tramp-tests)
+
 ;;; tramp-tests.el ends here