changeset 103333:01d7b6369496

* net/tramp.el (tramp-do-copy-or-rename-file-directly): Make direct copy more robust, especially when "chown" is not applicable.
author Michael Albinus <michael.albinus@gmx.de>
date Sun, 07 Jun 2009 16:16:05 +0000
parents 0b2973597cd5
children f97d17e432eb
files lisp/net/tramp.el
diffstat 1 files changed, 34 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- 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.