From 9cf3544e3bc88406c361bff9f7a7592d26feebe5 Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Tue, 2 Mar 2010 10:32:45 +0100 Subject: [PATCH] * net/tramp.el (tramp-do-copy-or-rename-file-out-of-band): Fix an error when FILENAME and NEWNAME are existing remote directories. * net/tramp-compat.el (tramp-compat-make-temp-file): Add optional parameter DIR-FLAG. --- lisp/ChangeLog | 8 ++++++++ lisp/net/tramp-compat.el | 23 +++++++++++++---------- lisp/net/tramp.el | 20 ++++++++++---------- 3 files changed, 31 insertions(+), 20 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index ca850a4db59..7beebd130b1 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,11 @@ +2010-03-02 Michael Albinus + + * net/tramp.el (tramp-do-copy-or-rename-file-out-of-band): Fix an + error when FILENAME and NEWNAME are existing remote directories. + + * net/tramp-compat.el (tramp-compat-make-temp-file): Add optional + parameter DIR-FLAG. + 2010-03-02 Glenn Morris * calendar/cal-hebrew.el (holiday-hebrew-passover): Fix date diff --git a/lisp/net/tramp-compat.el b/lisp/net/tramp-compat.el index 4f930d58cdc..9bcbe21116d 100644 --- a/lisp/net/tramp-compat.el +++ b/lisp/net/tramp-compat.el @@ -215,7 +215,7 @@ this is the function `temp-directory'." ;; has been introduced with Emacs 22. We try it, if it fails, we fall ;; back to `make-temp-name', creating the temporary file immediately ;; in order to avoid a security hole. -(defsubst tramp-compat-make-temp-file (filename) +(defsubst tramp-compat-make-temp-file (filename &optional dir-flag) "Create a temporary file (compat function). Add the extension of FILENAME, if existing." (let* (file-name-handler-alist @@ -226,21 +226,24 @@ Add the extension of FILENAME, if existing." result) (condition-case nil (setq result - (funcall (symbol-function 'make-temp-file) prefix nil extension)) + (funcall + (symbol-function 'make-temp-file) prefix dir-flag extension)) (error ;; We use our own implementation, taken from files.el. (while (condition-case () (progn (setq result (concat (make-temp-name prefix) extension)) - (write-region - "" nil result nil 'silent nil - ;; 7th parameter is MUSTBENEW in Emacs, and - ;; CODING-SYSTEM in XEmacs. It is not a security - ;; hole in XEmacs if we cannot use this parameter, - ;; because XEmacs uses a user-specific subdirectory - ;; with 0700 permissions. - (when (not (featurep 'xemacs)) 'excl)) + (if dir-flag + (make-directory result) + (write-region + "" nil result nil 'silent nil + ;; 7th parameter is MUSTBENEW in Emacs, and + ;; CODING-SYSTEM in XEmacs. It is not a security + ;; hole in XEmacs if we cannot use this parameter, + ;; because XEmacs uses a user-specific + ;; subdirectory with 0700 permissions. + (when (not (featurep 'xemacs)) 'excl))) nil) (file-already-exists t)) ;; The file was somehow created by someone else between diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el index 0957c78eddf..c029f073724 100644 --- a/lisp/net/tramp.el +++ b/lisp/net/tramp.el @@ -3798,13 +3798,12 @@ The method used must be an out-of-band method." ;; Both are Tramp files. We shall optimize it, when the ;; methods for filename and newname are the same. - (let ((tmpfile - (if (file-regular-p filename) - (tramp-compat-make-temp-file localname) - (make-temp-name - (expand-file-name - tramp-temp-name-prefix - (tramp-compat-temporary-file-directory)))))) + (let* ((dir-flag (file-directory-p filename)) + (tmpfile (tramp-compat-make-temp-file localname dir-flag))) + (if dir-flag + (setq tmpfile + (expand-file-name + (file-name-nondirectory newname) tmpfile))) (unwind-protect (progn (tramp-do-copy-or-rename-file-out-of-band @@ -3813,9 +3812,10 @@ The method used must be an out-of-band method." 'rename tmpfile newname keep-date)) ;; Save exit. (condition-case nil - (if (file-regular-p tmpfile) - (delete-file tmpfile) - (delete-directory tmpfile 'recursive)) + (if dir-flag + (delete-directory + (expand-file-name ".." tmpfile) 'recursive) + (delete-file tmpfile)) (error)))) ;; Expand hops. Might be necessary for gateway methods. -- 2.39.2