* 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.
This commit is contained in:
Michael Albinus 2010-02-16 17:03:29 +01:00
parent adad7a44dd
commit aac0b0f2be
2 changed files with 44 additions and 11 deletions

View file

@ -1,3 +1,14 @@
2010-02-16 Michael Albinus <michael.albinus@gmx.de>
* 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 <cyd@stupidchicken.com>
* simple.el (save-interprogram-paste-before-kill): Doc fix.

View file

@ -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))