]> git.eshelyaron.com Git - emacs.git/commitdiff
Rearrange setting date and modes in Tramp
authorMichael Albinus <michael.albinus@gmx.de>
Sat, 8 Jul 2023 14:48:20 +0000 (16:48 +0200)
committerMichael Albinus <michael.albinus@gmx.de>
Sat, 8 Jul 2023 14:48:20 +0000 (16:48 +0200)
* lisp/net/tramp-sh.el (tramp-do-copy-or-rename-file): Set date
and modes if appropriate.
(tramp-do-copy-or-rename-file-via-buffer)
(tramp-do-copy-or-rename-file-directly)
(tramp-do-copy-or-rename-file-out-of-band): Do not set date and modes.

lisp/net/tramp-sh.el

index d8231bd5bd2386ce0806e8d1ed145ace56d2d87a..f2cbb74acd2242e140edf4aa637b74f9754544a5 100644 (file)
@@ -1966,7 +1966,11 @@ file names."
          (t2 (tramp-tramp-file-p newname))
          (length (file-attribute-size
                   (file-attributes (file-truename filename))))
-         (msg-operation (if (eq op 'copy) "Copying" "Renaming")))
+         (file-times (file-attribute-modification-time
+                      (file-attributes filename)))
+         (file-modes (tramp-default-file-modes filename))
+         (msg-operation (if (eq op 'copy) "Copying" "Renaming"))
+          copy-keep-date)
 
       (with-parsed-tramp-file-name (if t1 filename newname) nil
        (unless length
@@ -1991,6 +1995,8 @@ file names."
                   ;; both files, we invoke `cp' or `mv' on the remote
                   ;; host directly.
                   ((tramp-equal-remote filename newname)
+                   (setq copy-keep-date
+                         (or (eq op 'rename) keep-date preserve-uid-gid))
                    (tramp-do-copy-or-rename-file-directly
                     op filename newname
                     ok-if-already-exists keep-date preserve-uid-gid))
@@ -1999,6 +2005,8 @@ file names."
                   ((and
                     (tramp-method-out-of-band-p v1 length)
                     (tramp-method-out-of-band-p v2 length))
+                   (setq copy-keep-date
+                          (tramp-get-method-parameter v 'tramp-copy-keep-date))
                    (tramp-do-copy-or-rename-file-out-of-band
                     op filename newname ok-if-already-exists keep-date))
 
@@ -2020,6 +2028,8 @@ file names."
              (cond
               ;; Fast track on local machine.
               ((tramp-local-host-p v)
+               (setq copy-keep-date
+                     (or (eq op 'rename) keep-date preserve-uid-gid))
                (tramp-do-copy-or-rename-file-directly
                 op filename newname
                 ok-if-already-exists keep-date preserve-uid-gid))
@@ -2027,6 +2037,8 @@ file names."
               ;; If the Tramp file has an out-of-band method, the
               ;; corresponding copy-program can be invoked.
               ((tramp-method-out-of-band-p v length)
+               (setq copy-keep-date
+                      (tramp-get-method-parameter v 'tramp-copy-keep-date))
                (tramp-do-copy-or-rename-file-out-of-band
                 op filename newname ok-if-already-exists keep-date))
 
@@ -2054,10 +2066,19 @@ file names."
            ;; When newname did exist, we have wrong cached values.
            (when t2
              (with-parsed-tramp-file-name newname v2
-               (tramp-flush-file-properties v2 v2-localname)))))))))
+               (tramp-flush-file-properties v2 v2-localname)))
+
+            ;; KEEP-DATE handling.
+            (when (and keep-date (not copy-keep-date))
+              (tramp-compat-set-file-times
+               newname file-times (unless ok-if-already-exists 'nofollow)))
+
+            ;; Set the mode.
+            (unless (and keep-date copy-keep-date)
+              (set-file-modes newname file-modes))))))))
 
 (defun tramp-do-copy-or-rename-file-via-buffer
-    (op filename newname ok-if-already-exists keep-date)
+    (op filename newname _ok-if-already-exists _keep-date)
   "Use an Emacs buffer to copy or rename a file.
 First arg OP is either `copy' or `rename' and indicates the operation.
 FILENAME is the source file, NEWNAME the target file.
@@ -2084,14 +2105,7 @@ KEEP-DATE is non-nil if NEWNAME should have the same timestamp as FILENAME."
     (with-temp-file newname
       (set-buffer-multibyte nil)
       (insert-file-contents-literally filename)))
-  ;; KEEP-DATE handling.
-  (when keep-date
-    (tramp-compat-set-file-times
-     newname
-     (file-attribute-modification-time (file-attributes filename))
-     (unless ok-if-already-exists 'nofollow)))
-  ;; Set the mode.
-  (set-file-modes newname (tramp-default-file-modes filename))
+
   ;; If the operation was `rename', delete the original file.
   (unless (eq op 'copy) (delete-file filename)))
 
@@ -2107,12 +2121,10 @@ as FILENAME.  PRESERVE-UID-GID, when non-nil, instructs to keep
 the uid and gid from FILENAME."
   ;; FILENAME and NEWNAME are already expanded.
   (let ((t1 (tramp-tramp-file-p filename))
-       (t2 (tramp-tramp-file-p newname))
-       (file-times (file-attribute-modification-time
-                    (file-attributes filename)))
-       (file-modes (tramp-default-file-modes filename)))
+       (t2 (tramp-tramp-file-p newname)))
     (with-parsed-tramp-file-name (if t1 filename newname) nil
-      (let* ((cmd (cond ((and (eq op 'copy) preserve-uid-gid) "cp -f -p")
+      (let* ((cmd (cond ((and (eq op 'copy) (or keep-date preserve-uid-gid))
+                         "cp -f -p")
                        ((eq op 'copy) "cp -f")
                        ((eq op 'rename) "mv -f")
                        (t (tramp-error
@@ -2241,14 +2253,7 @@ the uid and gid from FILENAME."
                       (list tmpfile localname2 ok-if-already-exists)))))
 
                ;; Save exit.
-               (ignore-errors (delete-file tmpfile)))))))))
-
-      ;; Set the time and mode.  Mask possible errors.
-      (ignore-errors
-         (when keep-date
-           (tramp-compat-set-file-times
-            newname file-times (unless ok-if-already-exists 'nofollow))
-           (set-file-modes newname file-modes))))))
+               (ignore-errors (delete-file tmpfile))))))))))))
 
 (defun tramp-do-copy-or-rename-file-out-of-band
     (op filename newname ok-if-already-exists keep-date)
@@ -2260,7 +2265,7 @@ The method used must be an out-of-band method."
         (v2 (and (tramp-tramp-file-p newname)
                  (tramp-dissect-file-name newname)))
         (v (or v1 v2))
-        copy-program copy-args copy-env copy-keep-date listener spec
+        copy-program copy-args copy-env listener spec
         options source target remote-copy-program remote-copy-args p)
 
     (if (and v1 v2 (string-empty-p (tramp-scp-direct-remote-copying v1 v2)))
@@ -2332,8 +2337,6 @@ The method used must be an out-of-band method."
                  ?y (tramp-scp-force-scp-protocol v)
                  ?z (tramp-scp-direct-remote-copying v1 v2))
            copy-program (tramp-get-method-parameter v 'tramp-copy-program)
-           copy-keep-date (tramp-get-method-parameter
-                           v 'tramp-copy-keep-date)
            copy-args
            ;; " " has either been a replacement of "%k" (when
            ;; keep-date argument is non-nil), or a replacement for
@@ -2441,19 +2444,7 @@ The method used must be an out-of-band method."
            ;; Houston, we have a problem!  Likely, the listener is
            ;; still running, so let's clear everything (but the
            ;; cached password).
-           (tramp-cleanup-connection v 'keep-debug 'keep-password))))
-
-      ;; Handle KEEP-DATE argument.
-      (when (and keep-date (not copy-keep-date))
-       (tramp-compat-set-file-times
-        newname
-        (file-attribute-modification-time (file-attributes filename))
-        (unless ok-if-already-exists 'nofollow)))
-
-      ;; Set the mode.
-      (unless (and keep-date copy-keep-date)
-       (ignore-errors
-         (set-file-modes newname (tramp-default-file-modes filename)))))
+           (tramp-cleanup-connection v 'keep-debug 'keep-password)))))
 
     ;; If the operation was `rename', delete the original file.
     (unless (eq op 'copy)