From eedb7111185569e426726fe15242f8ba08f89b31 Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Sat, 8 Jul 2023 16:48:20 +0200 Subject: [PATCH] Rearrange setting date and modes in Tramp * 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 | 71 +++++++++++++++++++------------------------- 1 file changed, 31 insertions(+), 40 deletions(-) diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el index d8231bd5bd2..f2cbb74acd2 100644 --- a/lisp/net/tramp-sh.el +++ b/lisp/net/tramp-sh.el @@ -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) -- 2.39.2