comparison lisp/net/tramp.el @ 108244:2ee48fcc701c

Add FORCE argument to `delete-file'. * net/ange-ftp.el (ange-ftp-del-tmp-name): Make it a defun, forcing to delete the temporary file. (ange-ftp-delete-file): Add FORCE arg. (ange-ftp-rename-remote-to-remote) (ange-ftp-rename-local-to-remote, ange-ftp-rename-remote-to-local) (ange-ftp-load, ange-ftp-compress, ange-ftp-uncompress): Force file deletion. * net/tramp-compat.el (tramp-compat-delete-file): New defun. * net/tramp.el (tramp-handle-delete-file): Add FORCE arg. (tramp-handle-make-symbolic-link, tramp-handle-load) (tramp-do-copy-or-rename-file-via-buffer) (tramp-do-copy-or-rename-file-directly) (tramp-do-copy-or-rename-file-out-of-band) (tramp-handle-process-file, tramp-handle-call-process-region) (tramp-handle-shell-command, tramp-handle-file-local-copy) (tramp-handle-insert-file-contents, tramp-handle-write-region) (tramp-delete-temp-file-function): Use `tramp-compat-delete-file'. * net/tramp-fish.el (tramp-fish-handle-delete-file): Add FORCE arg. (tramp-fish-handle-make-symbolic-link) (tramp-fish-handle-process-file): Use `tramp-compat-delete-file'. * net/tramp-ftp.el (tramp-ftp-file-name-handler): Use `tramp-compat-delete-file'. * net/tramp-gvfs.el (tramp-gvfs-handle-delete-file): Add FORCE arg. (tramp-gvfs-handle-write-region): Use `tramp-compat-delete-file'. * net/tramp-imap.el (tramp-imap-handle-delete-file): Add FORCE arg. (tramp-imap-do-copy-or-rename-file): Use `tramp-compat-delete-file'. * net/tramp-smb.el (tramp-smb-handle-delete-file): Add FORCE arg. (tramp-smb-handle-copy-file, tramp-smb-handle-file-local-copy) (tramp-smb-handle-rename-file, tramp-smb-handle-write-region): Use `tramp-compat-delete-file'.
author Michael Albinus <michael.albinus@gmx.de>
date Wed, 05 May 2010 12:20:23 +0200
parents 9fd9b1a102cd
children 96984953f99e
comparison
equal deleted inserted replaced
108243:be3f6d650654 108244:2ee48fcc701c
2509 (format 2509 (format
2510 "File %s already exists; make it a link anyway? " 2510 "File %s already exists; make it a link anyway? "
2511 l-localname))))) 2511 l-localname)))))
2512 (tramp-error 2512 (tramp-error
2513 l 'file-already-exists "File %s already exists" l-localname) 2513 l 'file-already-exists "File %s already exists" l-localname)
2514 (delete-file linkname))) 2514 (tramp-compat-delete-file linkname 'force)))
2515 2515
2516 ;; If FILENAME is a Tramp name, use just the localname component. 2516 ;; If FILENAME is a Tramp name, use just the localname component.
2517 (when (tramp-tramp-file-p filename) 2517 (when (tramp-tramp-file-p filename)
2518 (setq filename 2518 (setq filename
2519 (tramp-file-name-localname 2519 (tramp-file-name-localname
2557 (unless nomessage (tramp-message v 0 "Loading %s..." file)) 2557 (unless nomessage (tramp-message v 0 "Loading %s..." file))
2558 (let ((local-copy (file-local-copy file))) 2558 (let ((local-copy (file-local-copy file)))
2559 ;; MUST-SUFFIX doesn't exist on XEmacs, so let it default to nil. 2559 ;; MUST-SUFFIX doesn't exist on XEmacs, so let it default to nil.
2560 (unwind-protect 2560 (unwind-protect
2561 (load local-copy noerror t t) 2561 (load local-copy noerror t t)
2562 (delete-file local-copy))) 2562 (tramp-compat-delete-file local-copy 'force)))
2563 (unless nomessage (tramp-message v 0 "Loading %s...done" file)) 2563 (unless nomessage (tramp-message v 0 "Loading %s...done" file))
2564 t))) 2564 t)))
2565 2565
2566 ;; Localname manipulation functions that grok Tramp localnames... 2566 ;; Localname manipulation functions that grok Tramp localnames...
2567 (defun tramp-handle-file-name-as-directory (file) 2567 (defun tramp-handle-file-name-as-directory (file)
3735 ;; KEEP-DATE handling. 3735 ;; KEEP-DATE handling.
3736 (when keep-date (set-file-times newname (nth 5 (file-attributes filename)))) 3736 (when keep-date (set-file-times newname (nth 5 (file-attributes filename))))
3737 ;; Set the mode. 3737 ;; Set the mode.
3738 (set-file-modes newname (tramp-default-file-modes filename)) 3738 (set-file-modes newname (tramp-default-file-modes filename))
3739 ;; If the operation was `rename', delete the original file. 3739 ;; If the operation was `rename', delete the original file.
3740 (unless (eq op 'copy) (delete-file filename))) 3740 (unless (eq op 'copy) (tramp-compat-delete-file filename 'force)))
3741 3741
3742 (defun tramp-do-copy-or-rename-file-directly 3742 (defun tramp-do-copy-or-rename-file-directly
3743 (op filename newname ok-if-already-exists keep-date preserve-uid-gid) 3743 (op filename newname ok-if-already-exists keep-date preserve-uid-gid)
3744 "Invokes `cp' or `mv' on the remote system. 3744 "Invokes `cp' or `mv' on the remote system.
3745 OP must be one of `copy' or `rename', indicating `cp' or `mv', 3745 OP must be one of `copy' or `rename', indicating `cp' or `mv',
3890 'rename-file 3890 'rename-file
3891 (list tmpfile localname2 ok-if-already-exists))))) 3891 (list tmpfile localname2 ok-if-already-exists)))))
3892 3892
3893 ;; Save exit. 3893 ;; Save exit.
3894 (condition-case nil 3894 (condition-case nil
3895 (delete-file tmpfile) 3895 (tramp-compat-delete-file tmpfile 'force)
3896 (error))))))))) 3896 (error)))))))))
3897 3897
3898 ;; Set the time and mode. Mask possible errors. 3898 ;; Set the time and mode. Mask possible errors.
3899 (condition-case nil 3899 (condition-case nil
3900 (when keep-date 3900 (when keep-date
3930 ;; Save exit. 3930 ;; Save exit.
3931 (condition-case nil 3931 (condition-case nil
3932 (if dir-flag 3932 (if dir-flag
3933 (tramp-compat-delete-directory 3933 (tramp-compat-delete-directory
3934 (expand-file-name ".." tmpfile) 'recursive) 3934 (expand-file-name ".." tmpfile) 'recursive)
3935 (delete-file tmpfile)) 3935 (tramp-compat-delete-file tmpfile 'force))
3936 (error)))) 3936 (error))))
3937 3937
3938 ;; Expand hops. Might be necessary for gateway methods. 3938 ;; Expand hops. Might be necessary for gateway methods.
3939 (setq v (car (tramp-compute-multi-hops v))) 3939 (setq v (car (tramp-compute-multi-hops v)))
3940 (aset v 3 localname) 3940 (aset v 3 localname)
4048 (set-file-modes newname (tramp-default-file-modes filename))))) 4048 (set-file-modes newname (tramp-default-file-modes filename)))))
4049 4049
4050 ;; If the operation was `rename', delete the original file. 4050 ;; If the operation was `rename', delete the original file.
4051 (unless (eq op 'copy) 4051 (unless (eq op 'copy)
4052 (if (file-regular-p filename) 4052 (if (file-regular-p filename)
4053 (delete-file filename) 4053 (tramp-compat-delete-file filename 'force)
4054 (tramp-compat-delete-directory filename 'recursive)))))) 4054 (tramp-compat-delete-directory filename 'recursive))))))
4055 4055
4056 (defun tramp-handle-make-directory (dir &optional parents) 4056 (defun tramp-handle-make-directory (dir &optional parents)
4057 "Like `make-directory' for Tramp files." 4057 "Like `make-directory' for Tramp files."
4058 (setq dir (expand-file-name dir)) 4058 (setq dir (expand-file-name dir))
4078 "%s %s" 4078 "%s %s"
4079 (if recursive "rm -rf" "rmdir") 4079 (if recursive "rm -rf" "rmdir")
4080 (tramp-shell-quote-argument localname)))) 4080 (tramp-shell-quote-argument localname))))
4081 (tramp-error v 'file-error "Couldn't delete %s" directory)))) 4081 (tramp-error v 'file-error "Couldn't delete %s" directory))))
4082 4082
4083 (defun tramp-handle-delete-file (filename) 4083 (defun tramp-handle-delete-file (filename &optional force)
4084 "Like `delete-file' for Tramp files." 4084 "Like `delete-file' for Tramp files."
4085 (setq filename (expand-file-name filename)) 4085 (setq filename (expand-file-name filename))
4086 (with-parsed-tramp-file-name filename nil 4086 (with-parsed-tramp-file-name filename nil
4087 (tramp-flush-file-property v (file-name-directory localname)) 4087 (tramp-flush-file-property v (file-name-directory localname))
4088 (tramp-flush-file-property v localname) 4088 (tramp-flush-file-property v localname)
4597 ;; Provide error file. 4597 ;; Provide error file.
4598 (when tmpstderr (rename-file tmpstderr (cadr destination) t)) 4598 (when tmpstderr (rename-file tmpstderr (cadr destination) t))
4599 4599
4600 ;; Cleanup. We remove all file cache values for the connection, 4600 ;; Cleanup. We remove all file cache values for the connection,
4601 ;; because the remote process could have changed them. 4601 ;; because the remote process could have changed them.
4602 (when tmpinput (delete-file tmpinput)) 4602 (when tmpinput (tramp-compat-delete-file tmpinput 'force))
4603 4603
4604 ;; `process-file-side-effects' has been introduced with GNU 4604 ;; `process-file-side-effects' has been introduced with GNU
4605 ;; Emacs 23.2. If set to `nil', no remote file will be changed 4605 ;; Emacs 23.2. If set to `nil', no remote file will be changed
4606 ;; by `program'. If it doesn't exist, we assume its default 4606 ;; by `program'. If it doesn't exist, we assume its default
4607 ;; value 't'. 4607 ;; value 't'.
4634 (let ((tmpfile (tramp-compat-make-temp-file ""))) 4634 (let ((tmpfile (tramp-compat-make-temp-file "")))
4635 (write-region start end tmpfile) 4635 (write-region start end tmpfile)
4636 (when delete (delete-region start end)) 4636 (when delete (delete-region start end))
4637 (unwind-protect 4637 (unwind-protect
4638 (apply 'call-process program tmpfile buffer display args) 4638 (apply 'call-process program tmpfile buffer display args)
4639 (delete-file tmpfile)))) 4639 (tramp-compat-delete-file tmpfile 'force))))
4640 4640
4641 (defun tramp-handle-shell-command 4641 (defun tramp-handle-shell-command
4642 (command &optional output-buffer error-buffer) 4642 (command &optional output-buffer error-buffer)
4643 "Like `shell-command' for Tramp files." 4643 "Like `shell-command' for Tramp files."
4644 (let* ((asynchronous (string-match "[ \t]*&[ \t]*\\'" command)) 4644 (let* ((asynchronous (string-match "[ \t]*&[ \t]*\\'" command))
4699 (apply 'process-file (car args) nil buffer nil (cdr args)) 4699 (apply 'process-file (car args) nil buffer nil (cdr args))
4700 ;; Insert error messages if they were separated. 4700 ;; Insert error messages if they were separated.
4701 (when (listp buffer) 4701 (when (listp buffer)
4702 (with-current-buffer error-buffer 4702 (with-current-buffer error-buffer
4703 (insert-file-contents (cadr buffer))) 4703 (insert-file-contents (cadr buffer)))
4704 (delete-file (cadr buffer))) 4704 (tramp-compat-delete-file (cadr buffer) 'force))
4705 (if current-buffer-p 4705 (if current-buffer-p
4706 ;; This is like exchange-point-and-mark, but doesn't 4706 ;; This is like exchange-point-and-mark, but doesn't
4707 ;; activate the mark. It is cleaner to avoid activation, 4707 ;; activate the mark. It is cleaner to avoid activation,
4708 ;; even though the command loop would deactivate the mark 4708 ;; even though the command loop would deactivate the mark
4709 ;; because we inserted text. 4709 ;; because we inserted text.
4781 (tramp-message 4781 (tramp-message
4782 v 5 "Decoding remote file %s with command %s..." 4782 v 5 "Decoding remote file %s with command %s..."
4783 filename loc-dec) 4783 filename loc-dec)
4784 (unwind-protect 4784 (unwind-protect
4785 (tramp-call-local-coding-command loc-dec tmpfile2 tmpfile) 4785 (tramp-call-local-coding-command loc-dec tmpfile2 tmpfile)
4786 (delete-file tmpfile2)))) 4786 (tramp-compat-delete-file tmpfile2 'force))))
4787 4787
4788 (tramp-message v 5 "Decoding remote file %s...done" filename) 4788 (tramp-message v 5 "Decoding remote file %s...done" filename)
4789 ;; Set proper permissions. 4789 ;; Set proper permissions.
4790 (set-file-modes tmpfile (tramp-default-file-modes filename)) 4790 (set-file-modes tmpfile (tramp-default-file-modes filename))
4791 ;; Set local user ownership. 4791 ;; Set local user ownership.
4795 (t (tramp-error 4795 (t (tramp-error
4796 v 'file-error "Wrong method specification for `%s'" method))) 4796 v 'file-error "Wrong method specification for `%s'" method)))
4797 4797
4798 ;; Error handling. 4798 ;; Error handling.
4799 ((error quit) 4799 ((error quit)
4800 (delete-file tmpfile) 4800 (tramp-compat-delete-file tmpfile 'force)
4801 (signal (car err) (cdr err)))) 4801 (signal (car err) (cdr err))))
4802 4802
4803 (run-hooks 'tramp-handle-file-local-copy-hook) 4803 (run-hooks 'tramp-handle-file-local-copy-hook)
4804 tmpfile))) 4804 tmpfile)))
4805 4805
4941 (setq buffer-read-only (not (file-writable-p filename))) 4941 (setq buffer-read-only (not (file-writable-p filename)))
4942 (set-visited-file-modtime) 4942 (set-visited-file-modtime)
4943 (set-buffer-modified-p nil)) 4943 (set-buffer-modified-p nil))
4944 (when (and (stringp local-copy) 4944 (when (and (stringp local-copy)
4945 (or remote-copy (null tramp-temp-buffer-file-name))) 4945 (or remote-copy (null tramp-temp-buffer-file-name)))
4946 (delete-file local-copy)) 4946 (tramp-compat-delete-file local-copy 'force))
4947 (when (stringp remote-copy) 4947 (when (stringp remote-copy)
4948 (delete-file 4948 (tramp-compat-delete-file
4949 (tramp-make-tramp-file-name method user host remote-copy)))))) 4949 (tramp-make-tramp-file-name method user host remote-copy)
4950 'force)))))
4950 4951
4951 ;; Result. 4952 ;; Result.
4952 (list (expand-file-name filename) 4953 (list (expand-file-name filename)
4953 (cadr result)))) 4954 (cadr result))))
4954 4955
5134 (tramp-run-real-handler 5135 (tramp-run-real-handler
5135 'write-region 5136 'write-region
5136 (list start end tmpfile append 'no-message lockname confirm)) 5137 (list start end tmpfile append 'no-message lockname confirm))
5137 ((error quit) 5138 ((error quit)
5138 (setq tramp-temp-buffer-file-name nil) 5139 (setq tramp-temp-buffer-file-name nil)
5139 (delete-file tmpfile) 5140 (tramp-compat-delete-file tmpfile 'force)
5140 (signal (car err) (cdr err)))) 5141 (signal (car err) (cdr err))))
5141 5142
5142 ;; Now, `last-coding-system-used' has the right value. Remember it. 5143 ;; Now, `last-coding-system-used' has the right value. Remember it.
5143 (when (boundp 'last-coding-system-used) 5144 (when (boundp 'last-coding-system-used)
5144 (setq coding-system-used 5145 (setq coding-system-used
5178 ;; We keep the local file for performance 5179 ;; We keep the local file for performance
5179 ;; reasons, useful for "rsync". 5180 ;; reasons, useful for "rsync".
5180 (copy-file tmpfile filename t) 5181 (copy-file tmpfile filename t)
5181 ((error quit) 5182 ((error quit)
5182 (setq tramp-temp-buffer-file-name nil) 5183 (setq tramp-temp-buffer-file-name nil)
5183 (delete-file tmpfile) 5184 (tramp-compat-delete-file tmpfile 'force)
5184 (signal (car err) (cdr err))))) 5185 (signal (car err) (cdr err)))))
5185 (setq tramp-temp-buffer-file-name nil) 5186 (setq tramp-temp-buffer-file-name nil)
5186 ;; Don't rename, in order to keep context in SELinux. 5187 ;; Don't rename, in order to keep context in SELinux.
5187 (unwind-protect 5188 (unwind-protect
5188 (copy-file tmpfile filename t) 5189 (copy-file tmpfile filename t)
5189 (delete-file tmpfile)))) 5190 (tramp-compat-delete-file tmpfile 'force))))
5190 5191
5191 ;; Use inline file transfer. 5192 ;; Use inline file transfer.
5192 (rem-dec 5193 (rem-dec
5193 ;; Encode tmpfile. 5194 ;; Encode tmpfile.
5194 (tramp-message v 5 "Encoding region...") 5195 (tramp-message v 5 "Encoding region...")
5268 filename rem-dec))) 5269 filename rem-dec)))
5269 (tramp-message 5270 (tramp-message
5270 v 5 "Decoding region into remote file %s...done" filename)) 5271 v 5 "Decoding region into remote file %s...done" filename))
5271 5272
5272 ;; Save exit. 5273 ;; Save exit.
5273 (delete-file tmpfile))) 5274 (tramp-compat-delete-file tmpfile 'force)))
5274 5275
5275 ;; That's not expected. 5276 ;; That's not expected.
5276 (t 5277 (t
5277 (tramp-error 5278 (tramp-error
5278 v 'file-error 5279 v 'file-error
6348 6349
6349 (defun tramp-delete-temp-file-function () 6350 (defun tramp-delete-temp-file-function ()
6350 "Remove temporary files related to current buffer." 6351 "Remove temporary files related to current buffer."
6351 (when (stringp tramp-temp-buffer-file-name) 6352 (when (stringp tramp-temp-buffer-file-name)
6352 (condition-case nil 6353 (condition-case nil
6353 (delete-file tramp-temp-buffer-file-name) 6354 (tramp-compat-delete-file tramp-temp-buffer-file-name 'force)
6354 (error nil)))) 6355 (error nil))))
6355 6356
6356 (add-hook 'kill-buffer-hook 'tramp-delete-temp-file-function) 6357 (add-hook 'kill-buffer-hook 'tramp-delete-temp-file-function)
6357 (add-hook 'tramp-cache-unload-hook 6358 (add-hook 'tramp-cache-unload-hook
6358 (lambda () 6359 (lambda ()