Mercurial > emacs
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 () |