From aac0b0f2be0f68669368b6050e4d0df26a9a8d9c Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Tue, 16 Feb 2010 17:03:29 +0100 Subject: [PATCH] * net/tramp.el (tramp-do-copy-or-rename-file-out-of-band): Fix errors in copying directories. (tramp-handle-add-name-to-file, tramp-handle-copy-directory) (tramp-do-copy-or-rename-file, tramp-handle-delete-directory) (tramp-handle-delete-file) (tramp-handle-dired-recursive-delete-directory) (tramp-handle-write-region): Flush also the cache for the upper directory. --- lisp/ChangeLog | 11 +++++++++++ lisp/net/tramp.el | 44 +++++++++++++++++++++++++++++++++----------- 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 64dff020286..17655fe4f6b 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,14 @@ +2010-02-16 Michael Albinus + + * net/tramp.el (tramp-do-copy-or-rename-file-out-of-band): Fix + errors in copying directories. + (tramp-handle-add-name-to-file, tramp-handle-copy-directory) + (tramp-do-copy-or-rename-file, tramp-handle-delete-directory) + (tramp-handle-delete-file) + (tramp-handle-dired-recursive-delete-directory) + (tramp-handle-write-region): Flush also the cache for the upper + directory. + 2010-02-16 Chong Yidong * simple.el (save-interprogram-paste-before-kill): Doc fix. diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el index e59383e31e7..77a3875eeb4 100644 --- a/lisp/net/tramp.el +++ b/lisp/net/tramp.el @@ -3420,6 +3420,7 @@ tramp-handle-file-name-all-completions: internal error accessing `%s': `%s'" (tramp-error v2 'file-error "add-name-to-file: file %s already exists" newname)) + (tramp-flush-file-property v2 (file-name-directory v2-localname)) (tramp-flush-file-property v2 v2-localname) (tramp-barf-unless-okay v1 @@ -3478,7 +3479,13 @@ tramp-handle-file-name-all-completions: internal error accessing `%s': `%s'" 'copy dirname newname keep-date)) ;; We must do it file-wise. (tramp-run-real-handler - 'copy-directory (list dirname newname keep-date parents)))))) + 'copy-directory (list dirname newname keep-date parents))) + + ;; When newname did exist, we have wrong cached values. + (when t2 + (with-parsed-tramp-file-name newname nil + (tramp-flush-file-property v (file-name-directory localname)) + (tramp-flush-file-property v localname)))))) (defun tramp-handle-rename-file (filename newname &optional ok-if-already-exists) @@ -3583,11 +3590,13 @@ and `rename'. FILENAME and NEWNAME must be absolute file names." ;; In case of `rename', we must flush the cache of the source file. (when (and t1 (eq op 'rename)) (with-parsed-tramp-file-name filename nil + (tramp-flush-file-property v (file-name-directory localname)) (tramp-flush-file-property v localname))) ;; When newname did exist, we have wrong cached values. (when t2 (with-parsed-tramp-file-name newname nil + (tramp-flush-file-property v (file-name-directory localname)) (tramp-flush-file-property v localname))) (with-parsed-tramp-file-name (if t1 filename newname) nil @@ -3789,7 +3798,13 @@ 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 (tramp-compat-make-temp-file localname))) + (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)))))) (unwind-protect (progn (tramp-do-copy-or-rename-file-out-of-band @@ -3798,7 +3813,9 @@ The method used must be an out-of-band method." 'rename tmpfile newname keep-date)) ;; Save exit. (condition-case nil - (delete-file tmpfile) + (if (file-regular-p tmpfile) + (delete-file tmpfile) + (delete-directory tmpfile 'recursive)) (error)))) ;; Expand hops. Might be necessary for gateway methods. @@ -3913,7 +3930,9 @@ The method used must be an out-of-band method." ;; If the operation was `rename', delete the original file. (unless (eq op 'copy) - (delete-file filename))))) + (if (file-regular-p filename) + (delete-file filename) + (delete-directory filename 'recursive)))))) (defun tramp-handle-make-directory (dir &optional parents) "Like `make-directory' for Tramp files." @@ -3932,6 +3951,7 @@ The method used must be an out-of-band method." "Like `delete-directory' for Tramp files." (setq directory (expand-file-name directory)) (with-parsed-tramp-file-name directory nil + (tramp-flush-file-property v (file-name-directory localname)) (tramp-flush-directory-property v localname) (unless (zerop (tramp-send-command-and-check v @@ -3945,6 +3965,7 @@ The method used must be an out-of-band method." "Like `delete-file' for Tramp files." (setq filename (expand-file-name filename)) (with-parsed-tramp-file-name filename nil + (tramp-flush-file-property v (file-name-directory localname)) (tramp-flush-file-property v localname) (unless (zerop (tramp-send-command-and-check v @@ -3974,6 +3995,7 @@ This is like `dired-recursive-delete-directory' for Tramp files." ;; This might take a while, allow it plenty of time. (tramp-wait-for-output (tramp-get-connection-process v) 120) ;; Make sure that it worked... + (tramp-flush-file-property v (file-name-directory localname)) (tramp-flush-directory-property v localname) (and (file-exists-p filename) (tramp-error @@ -4953,11 +4975,9 @@ Returns a file name in `tramp-auto-save-directory' for autosaving this file." (or (file-directory-p localname) (file-writable-p localname))))) ;; Short track: if we are on the local host, we can run directly. - (progn - (tramp-run-real-handler - 'write-region - (list start end localname append 'no-message lockname confirm)) - (tramp-flush-file-property v localname)) + (tramp-run-real-handler + 'write-region + (list start end localname append 'no-message lockname confirm)) (let ((rem-dec (tramp-get-remote-coding v "remote-decoding")) (loc-enc (tramp-get-local-coding v "local-encoding")) @@ -5121,8 +5141,7 @@ Returns a file name in `tramp-auto-save-directory' for autosaving this file." " decode using `%s' failed") filename rem-dec))) (tramp-message - v 5 "Decoding region into remote file %s...done" filename) - (tramp-flush-file-property v localname)) + v 5 "Decoding region into remote file %s...done" filename)) ;; Save exit. (delete-file tmpfile))) @@ -5139,6 +5158,9 @@ Returns a file name in `tramp-auto-save-directory' for autosaving this file." (when coding-system-used (set 'last-coding-system-used coding-system-used)))) + (tramp-flush-file-property v (file-name-directory localname)) + (tramp-flush-file-property v localname) + ;; We must protect `last-coding-system-used', now we have set it ;; to its correct value. (let (last-coding-system-used (need-chown t)) -- 2.39.5