branch: externals/tramp
commit 4ae9b86ab682b699994bff58b7560ed1c9c47ece
Author: Michael Albinus <[email protected]>
Commit: Michael Albinus <[email protected]>

    Sync with Tramp repo
---
 test/tramp-archive-tests.el |   2 +-
 test/tramp-tests.el         |   2 +-
 texi/tramp.texi             |   8 ++-
 texi/trampelpa.texi         |   2 +-
 texi/trampver.texi          |   2 +-
 tramp-adb.el                |   2 +-
 tramp-androidsu.el          |   2 +-
 tramp-archive.el            |   2 +-
 tramp-cache.el              |   2 +-
 tramp-cmds.el               |   2 +-
 tramp-compat.el             |   2 +-
 tramp-container.el          |   2 +-
 tramp-crypt.el              |   2 +-
 tramp-ftp.el                |   2 +-
 tramp-fuse.el               |   2 +-
 tramp-gvfs.el               |   2 +-
 tramp-integration.el        |   2 +-
 tramp-message.el            |   2 +-
 tramp-rclone.el             |   2 +-
 tramp-sh.el                 | 147 +++++++++++++++++++++++---------------------
 tramp-smb.el                |   9 +--
 tramp-sshfs.el              |   2 +-
 tramp-sudoedit.el           |   2 +-
 tramp-uu.el                 |   2 +-
 tramp.el                    |  31 +++++-----
 trampver.el                 |   2 +-
 26 files changed, 121 insertions(+), 118 deletions(-)

diff --git a/test/tramp-archive-tests.el b/test/tramp-archive-tests.el
index 5e9ea756b9..f3bfaac005 100644
--- a/test/tramp-archive-tests.el
+++ b/test/tramp-archive-tests.el
@@ -1,6 +1,6 @@
 ;;; tramp-archive-tests.el --- Tests of file archive access  -*- 
lexical-binding:t -*-
 
-;; Copyright (C) 2017-2025 Free Software Foundation, Inc.
+;; Copyright (C) 2017-2026 Free Software Foundation, Inc.
 
 ;; Author: Michael Albinus <[email protected]>
 
diff --git a/test/tramp-tests.el b/test/tramp-tests.el
index 979ff7edfc..cb8253e66f 100644
--- a/test/tramp-tests.el
+++ b/test/tramp-tests.el
@@ -1,6 +1,6 @@
 ;;; tramp-tests.el --- Tests of remote file access  -*- lexical-binding:t -*-
 
-;; Copyright (C) 2013-2025 Free Software Foundation, Inc.
+;; Copyright (C) 2013-2026 Free Software Foundation, Inc.
 
 ;; Author: Michael Albinus <[email protected]>
 
diff --git a/texi/tramp.texi b/texi/tramp.texi
index f53abb5c22..a85d8835b6 100644
--- a/texi/tramp.texi
+++ b/texi/tramp.texi
@@ -12,7 +12,7 @@
 @footnotestyle end
 
 @copying
-Copyright @copyright{} 1999--2025 Free Software Foundation, Inc.
+Copyright @copyright{} 1999--2026 Free Software Foundation, Inc.
 
 @quotation
 Permission is granted to copy, distribute and/or modify this document
@@ -1132,9 +1132,11 @@ an external transfer program.
 External methods save on the overhead of encoding and decoding of
 inline methods.
 
+@vindex tramp-copy-size-limit
 Since external methods have the overhead of opening a new channel,
 files smaller than @code{tramp-copy-size-limit} still use inline
-methods.
+methods.  If an external method is used inside a multi-hop connection
+(@pxref{Multi-hops}), its inherent inline method is used as well.
 
 @table @asis
 @cindex method @option{rcp}
@@ -3891,7 +3893,7 @@ proxy @samp{bird@@bastion} to a remote file on 
@samp{you@@remotehost}:
 ssh@value{postfixhop}you@@remotehost@value{postfix}/path @key{RET}}
 @end example
 
-Each involved method must be an inline method (@pxref{Inline methods}).
+Each involved method must be handled by @value{tramp}'s @code{tramp-sh} 
backend.
 
 @value{tramp} adds the ad-hoc definitions as an ephemeral record to
 @code{tramp-default-proxies-alist}, which are available for reuse
diff --git a/texi/trampelpa.texi b/texi/trampelpa.texi
index 7ff6e28835..1ca4ae9492 100644
--- a/texi/trampelpa.texi
+++ b/texi/trampelpa.texi
@@ -1,6 +1,6 @@
 @c -*-texinfo-*-
 
-@c Copyright (C) 2021-2025 Free Software Foundation, Inc.
+@c Copyright (C) 2021-2026 Free Software Foundation, Inc.
 @c See file doclicense.texi for copying conditions.
 
 @include trampver.texi
diff --git a/texi/trampver.texi b/texi/trampver.texi
index ee4d5b2a35..ed18ab9bf4 100644
--- a/texi/trampver.texi
+++ b/texi/trampver.texi
@@ -2,7 +2,7 @@
 @c texi/trampver.texi.  Generated from trampver.texi.in by configure.
 
 @c This is part of the Emacs manual.
-@c Copyright (C) 2003--2025 Free Software Foundation, Inc.
+@c Copyright (C) 2003--2026 Free Software Foundation, Inc.
 @c See file doclicense.texi for copying conditions.
 
 @c In the  Tramp GIT, the version number and the bug report address
diff --git a/tramp-adb.el b/tramp-adb.el
index 99fcacd8de..a745633c24 100644
--- a/tramp-adb.el
+++ b/tramp-adb.el
@@ -1,6 +1,6 @@
 ;;; tramp-adb.el --- Functions for calling Android Debug Bridge from Tramp  
-*- lexical-binding:t -*-
 
-;; Copyright (C) 2011-2025 Free Software Foundation, Inc.
+;; Copyright (C) 2011-2026 Free Software Foundation, Inc.
 
 ;; Author: Jürgen Hötzel <[email protected]>
 ;; Maintainer: Michael Albinus <[email protected]>
diff --git a/tramp-androidsu.el b/tramp-androidsu.el
index 6cc3f14381..d3e528e8ce 100644
--- a/tramp-androidsu.el
+++ b/tramp-androidsu.el
@@ -1,6 +1,6 @@
 ;;; tramp-androidsu.el --- Tramp method for Android superuser shells  -*- 
lexical-binding:t -*-
 
-;; Copyright (C) 2024-2025 Free Software Foundation, Inc.
+;; Copyright (C) 2024-2026 Free Software Foundation, Inc.
 
 ;; Author: Po Lu
 ;; Keywords: comm, processes
diff --git a/tramp-archive.el b/tramp-archive.el
index a52b8be6e0..a4323156c2 100644
--- a/tramp-archive.el
+++ b/tramp-archive.el
@@ -1,6 +1,6 @@
 ;;; tramp-archive.el --- Tramp archive manager  -*- lexical-binding:t -*-
 
-;; Copyright (C) 2017-2025 Free Software Foundation, Inc.
+;; Copyright (C) 2017-2026 Free Software Foundation, Inc.
 
 ;; Author: Michael Albinus <[email protected]>
 ;; Keywords: comm, processes
diff --git a/tramp-cache.el b/tramp-cache.el
index 36fc8c3953..bb9179630c 100644
--- a/tramp-cache.el
+++ b/tramp-cache.el
@@ -1,6 +1,6 @@
 ;;; tramp-cache.el --- file information caching for Tramp  -*- 
lexical-binding:t -*-
 
-;; Copyright (C) 2000, 2005-2025 Free Software Foundation, Inc.
+;; Copyright (C) 2000, 2005-2026 Free Software Foundation, Inc.
 
 ;; Author: Daniel Pittman <[email protected]>
 ;;         Michael Albinus <[email protected]>
diff --git a/tramp-cmds.el b/tramp-cmds.el
index db3737500e..84c1c7ea7f 100644
--- a/tramp-cmds.el
+++ b/tramp-cmds.el
@@ -1,6 +1,6 @@
 ;;; tramp-cmds.el --- Interactive commands for Tramp  -*- lexical-binding:t -*-
 
-;; Copyright (C) 2007-2025 Free Software Foundation, Inc.
+;; Copyright (C) 2007-2026 Free Software Foundation, Inc.
 
 ;; Author: Michael Albinus <[email protected]>
 ;; Keywords: comm, processes
diff --git a/tramp-compat.el b/tramp-compat.el
index 93190fec3a..c9a728e2be 100644
--- a/tramp-compat.el
+++ b/tramp-compat.el
@@ -1,6 +1,6 @@
 ;;; tramp-compat.el --- Tramp compatibility functions  -*- lexical-binding:t 
-*-
 
-;; Copyright (C) 2007-2025 Free Software Foundation, Inc.
+;; Copyright (C) 2007-2026 Free Software Foundation, Inc.
 
 ;; Author: Michael Albinus <[email protected]>
 ;; Keywords: comm, processes
diff --git a/tramp-container.el b/tramp-container.el
index 897a4dcc72..91d9b239a7 100644
--- a/tramp-container.el
+++ b/tramp-container.el
@@ -1,6 +1,6 @@
 ;;; tramp-container.el --- Tramp integration for Docker-like containers  -*- 
lexical-binding: t; -*-
 
-;; Copyright © 2022-2025 Free Software Foundation, Inc.
+;; Copyright © 2022-2026 Free Software Foundation, Inc.
 
 ;; Author: Brian Cully <[email protected]>
 ;; Maintainer: Michael Albinus <[email protected]>
diff --git a/tramp-crypt.el b/tramp-crypt.el
index 0a5bdaf6ba..565b9f0a5a 100644
--- a/tramp-crypt.el
+++ b/tramp-crypt.el
@@ -1,6 +1,6 @@
 ;;; tramp-crypt.el --- Tramp crypt utilities  -*- lexical-binding:t -*-
 
-;; Copyright (C) 2020-2025 Free Software Foundation, Inc.
+;; Copyright (C) 2020-2026 Free Software Foundation, Inc.
 
 ;; Author: Michael Albinus <[email protected]>
 ;; Keywords: comm, processes
diff --git a/tramp-ftp.el b/tramp-ftp.el
index 4561518de1..7e140a0e37 100644
--- a/tramp-ftp.el
+++ b/tramp-ftp.el
@@ -1,6 +1,6 @@
 ;;; tramp-ftp.el --- Tramp convenience functions for Ange-FTP  -*- 
lexical-binding:t -*-
 
-;; Copyright (C) 2002-2025 Free Software Foundation, Inc.
+;; Copyright (C) 2002-2026 Free Software Foundation, Inc.
 
 ;; Author: Michael Albinus <[email protected]>
 ;; Keywords: comm, processes
diff --git a/tramp-fuse.el b/tramp-fuse.el
index 07f4ef7458..b3e59063cd 100644
--- a/tramp-fuse.el
+++ b/tramp-fuse.el
@@ -1,6 +1,6 @@
 ;;; tramp-fuse.el --- Tramp access functions for FUSE mounts  -*- 
lexical-binding:t -*-
 
-;; Copyright (C) 2021-2025 Free Software Foundation, Inc.
+;; Copyright (C) 2021-2026 Free Software Foundation, Inc.
 
 ;; Author: Michael Albinus <[email protected]>
 ;; Keywords: comm, processes
diff --git a/tramp-gvfs.el b/tramp-gvfs.el
index 687cc7e1bc..64efce227d 100644
--- a/tramp-gvfs.el
+++ b/tramp-gvfs.el
@@ -1,6 +1,6 @@
 ;;; tramp-gvfs.el --- Tramp access functions for GVFS daemon  -*- 
lexical-binding:t -*-
 
-;; Copyright (C) 2009-2025 Free Software Foundation, Inc.
+;; Copyright (C) 2009-2026 Free Software Foundation, Inc.
 
 ;; Author: Michael Albinus <[email protected]>
 ;; Keywords: comm, processes
diff --git a/tramp-integration.el b/tramp-integration.el
index 7b34ce08bd..0183960d7f 100644
--- a/tramp-integration.el
+++ b/tramp-integration.el
@@ -1,6 +1,6 @@
 ;;; tramp-integration.el --- Tramp integration into other packages  -*- 
lexical-binding:t -*-
 
-;; Copyright (C) 2019-2025 Free Software Foundation, Inc.
+;; Copyright (C) 2019-2026 Free Software Foundation, Inc.
 
 ;; Author: Michael Albinus <[email protected]>
 ;; Keywords: comm, processes
diff --git a/tramp-message.el b/tramp-message.el
index eecddc978c..fe7758bdb0 100644
--- a/tramp-message.el
+++ b/tramp-message.el
@@ -1,6 +1,6 @@
 ;;; tramp-message.el --- Tramp messages  -*- lexical-binding:t -*-
 
-;; Copyright (C) 2023-2025 Free Software Foundation, Inc.
+;; Copyright (C) 2023-2026 Free Software Foundation, Inc.
 
 ;; Author: Michael Albinus <[email protected]>
 ;; Keywords: comm, processes
diff --git a/tramp-rclone.el b/tramp-rclone.el
index e4008c197f..6b0daeba2a 100644
--- a/tramp-rclone.el
+++ b/tramp-rclone.el
@@ -1,6 +1,6 @@
 ;;; tramp-rclone.el --- Tramp access functions to cloud storages  -*- 
lexical-binding:t -*-
 
-;; Copyright (C) 2018-2025 Free Software Foundation, Inc.
+;; Copyright (C) 2018-2026 Free Software Foundation, Inc.
 
 ;; Author: Michael Albinus <[email protected]>
 ;; Keywords: comm, processes
diff --git a/tramp-sh.el b/tramp-sh.el
index 488f7e4919..97b72ba00a 100644
--- a/tramp-sh.el
+++ b/tramp-sh.el
@@ -1,6 +1,6 @@
 ;;; tramp-sh.el --- Tramp access functions for (s)sh-like connections  -*- 
lexical-binding:t -*-
 
-;; Copyright (C) 1998-2025 Free Software Foundation, Inc.
+;; Copyright (C) 1998-2026 Free Software Foundation, Inc.
 
 ;; (copyright statements below in code to be updated with the above notice)
 
@@ -2098,66 +2098,67 @@ ID-FORMAT valid values are `string' and `integer'."
   "Like `copy-directory' for Tramp files."
   (tramp-skeleton-copy-directory
       dirname newname keep-date parents copy-contents
-    (let ((t1 (tramp-tramp-file-p dirname))
-         (t2 (tramp-tramp-file-p newname))
-         target)
-      (with-parsed-tramp-file-name (if t1 dirname newname) nil
-       (cond
-        ((and copy-directory-create-symlink
-              (setq target (file-symlink-p dirname))
-              (tramp-equal-remote dirname newname))
-         (make-symbolic-link
-          target
-          (if (directory-name-p newname)
-              (concat newname (file-name-nondirectory dirname)) newname)
-          t))
-
-        ;; Shortcut: if method, host, user are the same for both
-        ;; files, we invoke `cp' on the remote host directly.
-        ((and (not copy-contents)
-              (tramp-equal-remote dirname newname))
-         (when (and (file-directory-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)))
-         (tramp-do-copy-or-rename-file-directly
-          'copy dirname newname
-          'ok-if-already-exists keep-date 'preserve-uid-gid))
-
-        ;; scp or rsync DTRT.
-        ((and (not copy-contents)
-              (tramp-get-method-parameter v 'tramp-copy-recursive)
-              ;; When DIRNAME and NEWNAME are remote, they must have
-              ;; the same method.
-              (or (null t1) (null t2)
-                  (string-equal
-                   (tramp-file-name-method (tramp-dissect-file-name dirname))
-                   (tramp-file-name-method (tramp-dissect-file-name 
newname)))))
-         (when (and (file-directory-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)))
-         (when (and (file-directory-p newname)
-                    (not (string-equal (file-name-nondirectory dirname)
-                                       (file-name-nondirectory newname))))
-           (setq newname
-                 (expand-file-name (file-name-nondirectory dirname) newname)))
-         (unless (file-directory-p (file-name-directory newname))
-           (make-directory (file-name-directory newname) parents))
-         (tramp-do-copy-or-rename-file-out-of-band
-          'copy dirname newname 'ok-if-already-exists keep-date))
-
-        ;; We must do it file-wise.
-        (t (tramp-run-real-handler
-            #'copy-directory
-            (list dirname newname keep-date parents copy-contents))))
-
-       ;; NEWNAME has wrong cached values.
-       (when t2
-         (with-parsed-tramp-file-name (expand-file-name newname) nil
-           (tramp-flush-file-properties v localname)))))))
+    (let* ((v1 (and (tramp-tramp-file-p dirname)
+                   (tramp-dissect-file-name dirname)))
+          (v2 (and (tramp-tramp-file-p newname)
+                   (tramp-dissect-file-name newname)))
+          (v (or v1 v2))
+          target)
+      (cond
+       ((and copy-directory-create-symlink
+            (setq target (file-symlink-p dirname))
+            (tramp-equal-remote dirname newname))
+       (make-symbolic-link
+        target
+        (if (directory-name-p newname)
+            (concat newname (file-name-nondirectory dirname)) newname)
+        t))
+
+       ;; Shortcut: if method, host, user are the same for both files,
+       ;; we invoke `cp' on the remote host directly.
+       ((and (not copy-contents)
+            (tramp-equal-remote dirname newname))
+       (when (and (file-directory-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)))
+       (tramp-do-copy-or-rename-file-directly
+        'copy dirname newname
+        'ok-if-already-exists keep-date 'preserve-uid-gid))
+
+       ;; scp or rsync DTRT.
+       ((and (not copy-contents)
+            (tramp-get-method-parameter v 'tramp-copy-recursive)
+            ;; When DIRNAME and NEWNAME are remote, they must have
+            ;; the same method.  None of them must be multi-hop.
+            (or (and (null v1) (tramp-method-out-of-band-p v2 0))
+                (and (null v2) (tramp-method-out-of-band-p v1 0))
+                (and v1 v2
+                     (tramp-method-out-of-band-p v1 0)
+                     (tramp-method-out-of-band-p v2 0)
+                     (string-equal
+                      (tramp-file-name-method v1)
+                      (tramp-file-name-method v2)))))
+       (when (and (file-directory-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)))
+       (when (and (file-directory-p newname)
+                  (not (string-equal (file-name-nondirectory dirname)
+                                     (file-name-nondirectory newname))))
+         (setq newname
+               (expand-file-name (file-name-nondirectory dirname) newname)))
+       (unless (file-directory-p (file-name-directory newname))
+         (make-directory (file-name-directory newname) parents))
+       (tramp-do-copy-or-rename-file-out-of-band
+        'copy dirname newname 'ok-if-already-exists keep-date))
+
+       ;; We must do it file-wise.
+       (t (tramp-run-real-handler
+          #'copy-directory
+          (list dirname newname keep-date parents copy-contents)))))))
 
 (defun tramp-sh-handle-rename-file
   (filename newname &optional ok-if-already-exists)
@@ -5679,7 +5680,11 @@ raises an error."
   (and
    ;; It shall be an out-of-band method.
    (tramp-get-method-parameter vec 'tramp-copy-program)
-   ;; There must be a size, otherwise the file doesn't exist.
+   ;; There shouldn't be a multi-hop.
+   (or (not (tramp-multi-hop-p vec))
+       (null (cdr (tramp-compute-multi-hops vec))))
+   ;; There must be a SIZE, otherwise the file doesn't exist.  A zero
+   ;; SIZE is used for directories.
    (numberp size)
    ;; Either the file size is large enough, or (in rare cases) there
    ;; does not exist a remote encoding.
@@ -5823,9 +5828,10 @@ Nonexistent directories are removed from spec."
     (or
      (catch 'ls-found
        (dolist (cmd
-               ;; Prefer GNU ls on *BSD and macOS.
+               ;; Prefer GNU ls on *BSD and macOS.  See also
+               ;; Bug#80075 for Linux.
                 (if (tramp-check-remote-uname vec tramp-bsd-unames)
-                   '("gls" "ls" "gnuls") '("ls" "gnuls" "gls")))
+                   '("gls" "ls" "gnuls") '("gnuls" "ls"   "gls")))
         (let ((dl (tramp-get-remote-path vec))
               result)
           (while (and dl (setq result (tramp-find-executable vec cmd dl t t)))
@@ -5966,11 +5972,14 @@ Nonexistent directories are removed from spec."
   "Determine remote `readlink' command."
   (with-tramp-connection-property vec "readlink"
     (tramp-message vec 5 "Finding a suitable `readlink' command")
-    (when-let* ((result (tramp-find-executable
-                        vec "readlink" (tramp-get-remote-path vec)))
-               ((tramp-send-command-and-check
-                 vec (format "%s --canonicalize-missing /" result))))
-       result)))
+    ;; See Bug#80075.
+    (catch 'readlink-found
+      (dolist (cmd '("gnureadlink" "readlink"))
+       (when-let* ((result (tramp-find-executable
+                            vec cmd (tramp-get-remote-path vec)))
+                   ((tramp-send-command-and-check
+                     vec (format "%s --canonicalize-missing /" result))))
+         (throw 'readlink-found result))))))
 
 (defun tramp-get-remote-touch (vec)
   "Determine remote `touch' command."
diff --git a/tramp-smb.el b/tramp-smb.el
index 2013c3980d..10ab64929e 100644
--- a/tramp-smb.el
+++ b/tramp-smb.el
@@ -1,6 +1,6 @@
 ;;; tramp-smb.el --- Tramp access functions for SMB servers  -*- 
lexical-binding:t -*-
 
-;; Copyright (C) 2002-2025 Free Software Foundation, Inc.
+;; Copyright (C) 2002-2026 Free Software Foundation, Inc.
 
 ;; Author: Michael Albinus <[email protected]>
 ;; Keywords: comm, processes
@@ -577,12 +577,7 @@ arguments to pass to the OPERATION."
 
                ;; Set the mode.
                (unless keep-date
-                 (set-file-modes newname (tramp-default-file-modes dirname)))
-
-               ;; When newname did exist, we have wrong cached values.
-               (when t2
-                 (with-parsed-tramp-file-name newname nil
-                   (tramp-flush-file-properties v localname))))
+                 (set-file-modes newname (tramp-default-file-modes dirname))))
 
               ;; We must do it file-wise.
               (t
diff --git a/tramp-sshfs.el b/tramp-sshfs.el
index 6e59a877e1..338d128cc4 100644
--- a/tramp-sshfs.el
+++ b/tramp-sshfs.el
@@ -1,6 +1,6 @@
 ;;; tramp-sshfs.el --- Tramp access functions via sshfs  -*- lexical-binding:t 
-*-
 
-;; Copyright (C) 2021-2025 Free Software Foundation, Inc.
+;; Copyright (C) 2021-2026 Free Software Foundation, Inc.
 
 ;; Author: Michael Albinus <[email protected]>
 ;; Keywords: comm, processes
diff --git a/tramp-sudoedit.el b/tramp-sudoedit.el
index 279b7e610b..d3bb8b8478 100644
--- a/tramp-sudoedit.el
+++ b/tramp-sudoedit.el
@@ -1,6 +1,6 @@
 ;;; tramp-sudoedit.el --- Functions for accessing under root permissions  -*- 
lexical-binding:t -*-
 
-;; Copyright (C) 2018-2025 Free Software Foundation, Inc.
+;; Copyright (C) 2018-2026 Free Software Foundation, Inc.
 
 ;; Author: Michael Albinus <[email protected]>
 ;; Keywords: comm, processes
diff --git a/tramp-uu.el b/tramp-uu.el
index ee6cad173e..952445bf7b 100644
--- a/tramp-uu.el
+++ b/tramp-uu.el
@@ -1,6 +1,6 @@
 ;;; tramp-uu.el --- uuencode in Lisp  -*- lexical-binding:t -*-
 
-;; Copyright (C) 2002-2025 Free Software Foundation, Inc.
+;; Copyright (C) 2002-2026 Free Software Foundation, Inc.
 
 ;; Author: Kai Großjohann <[email protected]>
 ;; Maintainer: Michael Albinus <[email protected]>
diff --git a/tramp.el b/tramp.el
index 1866c7dad6..a6be310f04 100644
--- a/tramp.el
+++ b/tramp.el
@@ -1,6 +1,6 @@
 ;;; tramp.el --- Transparent Remote Access, Multiple Protocol  -*- 
lexical-binding:t -*-
 
-;; Copyright (C) 1998-2025 Free Software Foundation, Inc.
+;; Copyright (C) 1998-2026 Free Software Foundation, Inc.
 
 ;; Author: Kai Großjohann <[email protected]>
 ;;         Michael Albinus <[email protected]>
@@ -296,9 +296,8 @@ pair of the form (KEY VALUE).  The following KEYs are 
defined:
     - \"%a\" adds the pseudo-terminal allocation argument \"-t\" in
        asynchronous processes, if the connection type is not `pipe'.
 
-    The existence of `tramp-login-args', combined with the
-    absence of `tramp-copy-args', is an indication that the
-    method is capable of multi-hops.
+    The existence of `tramp-login-args' is an indication that the method
+    is capable of multi-hops.
 
   * `tramp-async-args'
     When an asynchronous process is started, we know already that
@@ -2137,7 +2136,7 @@ of `current-buffer'."
   "Execute BODY and return the result.
 In case of an error, raise a `file-missing' error if FILENAME
 does not exist, otherwise propagate the error."
-  (declare (indent 2) (debug (tramp-file-name-p form &rest body)))
+  (declare (indent 2) (debug t))
   (let ((err (make-symbol "err")))
     `(condition-case ,err
         (let (signal-hook-function) ,@body)
@@ -2176,7 +2175,7 @@ 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 &rest body)))
+  (declare (indent 2) (debug t))
   (let ((bindings
          (mapcar
          (lambda (elem)
@@ -3044,14 +3043,7 @@ BODY is the backend specific code."
              tramp--last-hop-directory
              (tramp-make-tramp-file-name (tramp-dissect-hop-name hop))))
 
-      (let (;; When `tramp-syntax' is `simplified', we need a default method.
-           (tramp-default-method
-            (and (string-empty-p tramp-postfix-method-format)
-                 tramp-default-method))
-           (tramp-default-method-alist
-            (and (string-empty-p tramp-postfix-method-format)
-                 tramp-default-method-alist))
-           tramp-default-user tramp-default-user-alist
+      (let (tramp-default-user tramp-default-user-alist
            tramp-default-host tramp-default-host-alist)
 
        ;; Possible completion structures.
@@ -3592,7 +3584,7 @@ User is always nil."
 ;;; Skeleton macros for file name handler functions.
 
 (defmacro tramp-skeleton-copy-directory
-  (directory _newname &optional _keep-date _parents _copy-contents &rest body)
+  (directory newname &optional _keep-date _parents _copy-contents &rest body)
   "Skeleton for `tramp-*-handle-copy-directory'.
 BODY is the backend specific code."
   (declare (indent 5) (debug t))
@@ -3603,7 +3595,12 @@ BODY is the backend specific code."
      (unless (file-exists-p ,directory)
        (tramp-error
        (tramp-dissect-file-name ,directory) 'file-missing ,directory))
-     ,@body))
+     ,@body
+
+     ;; NEWNAME has wrong cached values.
+     (when (tramp-tramp-file-p ,newname)
+       (with-parsed-tramp-file-name (expand-file-name ,newname) nil
+        (tramp-flush-file-properties v localname)))))
 
 (defmacro tramp-skeleton-delete-directory (directory recursive trash &rest 
body)
   "Skeleton for `tramp-*-handle-delete-directory'.
@@ -5155,7 +5152,7 @@ Do not set it manually, it is used buffer-local in 
`tramp-get-lock-pid'.")
   "Whether the method of VEC is capable of multi-hops."
   (let ((tramp-verbose 0))
     (and (tramp-sh-file-name-handler-p vec)
-        (not (tramp-get-method-parameter vec 'tramp-copy-program)))))
+        (tramp-get-method-parameter vec 'tramp-login-args))))
 
 (defun tramp-add-hops (vec)
   "Add ad-hoc proxy definitions to `tramp-default-proxies-alist'."
diff --git a/trampver.el b/trampver.el
index 51e04e0a1c..f813fe869d 100644
--- a/trampver.el
+++ b/trampver.el
@@ -1,7 +1,7 @@
 ;;; trampver.el --- Transparent Remote Access, Multiple Protocol  -*- 
lexical-binding:t -*-
 ;;; lisp/trampver.el.  Generated from trampver.el.in by configure.
 
-;; Copyright (C) 2003-2025 Free Software Foundation, Inc.
+;; Copyright (C) 2003-2026 Free Software Foundation, Inc.
 
 ;; Author: Kai Großjohann <[email protected]>
 ;; Maintainer: Michael Albinus <[email protected]>

Reply via email to