# HG changeset patch # User Michael Albinus # Date 1244391365 0 # Node ID 01d7b63694963560dab543506f19ff1733ce06cb # Parent 0b2973597cd5d02ad618db85aa98378b673c552f * net/tramp.el (tramp-do-copy-or-rename-file-directly): Make direct copy more robust, especially when "chown" is not applicable. diff -r 0b2973597cd5 -r 01d7b6369496 lisp/net/tramp.el --- a/lisp/net/tramp.el Sun Jun 07 07:35:55 2009 +0000 +++ b/lisp/net/tramp.el Sun Jun 07 16:16:05 2009 +0000 @@ -3270,16 +3270,26 @@ (t ;; Create the temporary file. (let ((tmpfile (tramp-compat-make-temp-file localname1))) - (condition-case err + (unwind-protect (progn (cond (t1 - (tramp-send-command - v (format - "%s %s %s" cmd - (tramp-shell-quote-argument localname1) - (tramp-shell-quote-argument tmpfile))) + (or + (zerop + (tramp-send-command-and-check + v (format + "%s %s %s" cmd + (tramp-shell-quote-argument localname1) + (tramp-shell-quote-argument tmpfile)))) + (tramp-error-with-buffer + nil v 'file-error + "Copying directly failed, see buffer `%s' for details." + (tramp-get-buffer v))) ;; We must change the ownership as remote user. + ;; Since this does not work reliable, we also + ;; give read permissions. + (set-file-modes + (concat prefix tmpfile) (tramp-octal-to-decimal "0777")) (tramp-set-file-uid-gid (concat prefix tmpfile) (tramp-get-local-uid 'integer) @@ -3293,6 +3303,9 @@ 'rename-file (list localname1 tmpfile t))) ;; We must change the ownership as local user. + ;; Since this does not work reliable, we also + ;; give read permissions. + (set-file-modes tmpfile (tramp-octal-to-decimal "0777")) (tramp-set-file-uid-gid tmpfile (tramp-get-remote-uid v 'integer) @@ -3301,20 +3314,26 @@ ;; Move the temporary file to its destination. (cond (t2 - (tramp-send-command - v (format - "mv -f %s %s" - (tramp-shell-quote-argument tmpfile) - (tramp-shell-quote-argument localname2)))) + (or + (zerop + (tramp-send-command-and-check + v (format + "cp -f -p %s %s" + (tramp-shell-quote-argument tmpfile) + (tramp-shell-quote-argument localname2)))) + (tramp-error-with-buffer + nil v 'file-error + "Copying directly failed, see buffer `%s' for details." + (tramp-get-buffer v)))) (t1 (tramp-run-real-handler 'rename-file (list tmpfile localname2 ok-if-already-exists))))) - ;; Error handling. - ((error quit) - (delete-file tmpfile) - (signal (car err) (cdr err)))))))))) + ;; Save exit. + (condition-case nil + (delete-file tmpfile) + (error))))))))) ;; Set the time and mode. Mask possible errors. ;; Won't be applied for 'rename.