From: Michael Albinus Date: Sun, 7 Jun 2009 16:17:03 +0000 (+0000) Subject: * net/tramp.el (tramp-do-copy-or-rename-file-directly): Make direct X-Git-Tag: emacs-pretest-23.0.95~126 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=917b89a691a5d7c8ae442a6f2e7bc1230efded00;p=emacs.git * net/tramp.el (tramp-do-copy-or-rename-file-directly): Make direct copy more robust, especially when "chown" is not applicable. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 4f451446920..7072bb05fed 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2009-06-07 Michael Albinus + + * net/tramp.el (tramp-do-copy-or-rename-file-directly): Make direct + copy more robust, especially when "chown" is not applicable. + 2009-06-07 Martin Rudalics * emacs-lisp/lisp-mode.el (lisp-mode-variables): Fix doc-string. diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el index b6bfcf70901..5b51d6cc966 100644 --- a/lisp/net/tramp.el +++ b/lisp/net/tramp.el @@ -3270,16 +3270,26 @@ the uid and gid from FILENAME." (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 @@ the uid and gid from FILENAME." '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 @@ the uid and gid from FILENAME." ;; 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.