Fixes: debbugs:18623

* net/tramp.el (tramp-handle-insert-file-contents):
Set `find-file-not-found-functions' in case of errors.
This commit is contained in:
Michael Albinus 2014-12-21 12:10:31 +01:00
parent 48a9d9fdbb
commit 74d3b20cf5
2 changed files with 108 additions and 101 deletions

View file

@ -1,3 +1,8 @@
2014-12-21 Michael Albinus <michael.albinus@gmx.de>
* net/tramp.el (tramp-handle-insert-file-contents):
Set `find-file-not-found-functions' in case of errors. (Bug#18623)
2014-12-19 Michael Albinus <michael.albinus@gmx.de>
* net/tramp-sh.el (tramp-send-command-and-read): New optional

View file

@ -3086,115 +3086,117 @@ User is always nil."
(setq filename (expand-file-name filename))
(let (result local-copy remote-copy)
(with-parsed-tramp-file-name filename nil
(with-tramp-progress-reporter
v 3 (format "Inserting `%s'" filename)
(unwind-protect
(if (not (file-exists-p filename))
(progn
;; We don't raise a Tramp error, because it might be
;; suppressed, like in `find-file-noselect-1'.
(tramp-message
v 1 "File not `%s' found on remote host" filename)
(signal 'file-error
(list "File not found on remote host" filename)))
(unwind-protect
(if (not (file-exists-p filename))
(tramp-message v 0 "(New file)")
(if (and (tramp-local-host-p v)
(let (file-name-handler-alist)
(file-readable-p localname)))
;; Short track: if we are on the local host, we can
;; run directly.
(setq result
(tramp-run-real-handler
'insert-file-contents
(list localname visit beg end replace)))
(with-tramp-progress-reporter
v 3 (format "Inserting `%s'" filename)
(condition-case err
(if (and (tramp-local-host-p v)
(let (file-name-handler-alist)
(file-readable-p localname)))
;; Short track: if we are on the local host, we can
;; run directly.
(setq result
(tramp-run-real-handler
'insert-file-contents
(list localname visit beg end replace)))
;; When we shall insert only a part of the file, we
;; copy this part. This works only for the shell file
;; name handlers.
(when (and (or beg end)
(tramp-get-method-parameter
(tramp-file-name-method v) 'tramp-login-program))
(setq remote-copy (tramp-make-tramp-temp-file v))
;; This is defined in tramp-sh.el. Let's assume
;; this is loaded already.
(tramp-compat-funcall
'tramp-send-command
v
(cond
((and beg end)
(format "dd bs=1 skip=%d if=%s count=%d of=%s"
beg (tramp-shell-quote-argument localname)
(- end beg) remote-copy))
(beg
(format "dd bs=1 skip=%d if=%s of=%s"
beg (tramp-shell-quote-argument localname)
remote-copy))
(end
(format "dd bs=1 count=%d if=%s of=%s"
end (tramp-shell-quote-argument localname)
remote-copy))))
(setq tramp-temp-buffer-file-name nil beg nil end nil))
;; When we shall insert only a part of the file, we
;; copy this part. This works only for the shell file
;; name handlers.
(when (and (or beg end)
(tramp-get-method-parameter
(tramp-file-name-method v)
'tramp-login-program))
(setq remote-copy (tramp-make-tramp-temp-file v))
;; This is defined in tramp-sh.el. Let's assume
;; this is loaded already.
(tramp-compat-funcall
'tramp-send-command
v
(cond
((and beg end)
(format "dd bs=1 skip=%d if=%s count=%d of=%s"
beg (tramp-shell-quote-argument localname)
(- end beg) remote-copy))
(beg
(format "dd bs=1 skip=%d if=%s of=%s"
beg (tramp-shell-quote-argument localname)
remote-copy))
(end
(format "dd bs=1 count=%d if=%s of=%s"
end (tramp-shell-quote-argument localname)
remote-copy))))
(setq tramp-temp-buffer-file-name nil beg nil end nil))
;; `insert-file-contents-literally' takes care to
;; avoid calling jka-compr. By let-binding
;; `inhibit-file-name-operation', we propagate that
;; care to the `file-local-copy' operation.
(setq local-copy
(let ((inhibit-file-name-operation
(when (eq inhibit-file-name-operation
'insert-file-contents)
'file-local-copy)))
(cond
((stringp remote-copy)
(file-local-copy
(tramp-make-tramp-file-name
method user host remote-copy)))
((stringp tramp-temp-buffer-file-name)
(copy-file filename tramp-temp-buffer-file-name 'ok)
tramp-temp-buffer-file-name)
(t (file-local-copy filename)))))
;; `insert-file-contents-literally' takes care to
;; avoid calling jka-compr. By let-binding
;; `inhibit-file-name-operation', we propagate that
;; care to the `file-local-copy' operation.
(setq local-copy
(let ((inhibit-file-name-operation
(when (eq inhibit-file-name-operation
'insert-file-contents)
'file-local-copy)))
(cond
((stringp remote-copy)
(file-local-copy
(tramp-make-tramp-file-name
method user host remote-copy)))
((stringp tramp-temp-buffer-file-name)
(copy-file
filename tramp-temp-buffer-file-name 'ok)
tramp-temp-buffer-file-name)
(t (file-local-copy filename)))))
;; When the file is not readable for the owner, it
;; cannot be inserted, even if it is readable for the
;; group or for everybody.
(set-file-modes
local-copy (tramp-compat-octal-to-decimal "0600"))
;; When the file is not readable for the owner, it
;; cannot be inserted, even if it is readable for the
;; group or for everybody.
(set-file-modes
local-copy (tramp-compat-octal-to-decimal "0600"))
(when (and (null remote-copy)
(tramp-get-method-parameter
method 'tramp-copy-keep-tmpfile))
;; We keep the local file for performance reasons,
;; useful for "rsync".
(setq tramp-temp-buffer-file-name local-copy))
(when (and (null remote-copy)
(tramp-get-method-parameter
method 'tramp-copy-keep-tmpfile))
;; We keep the local file for performance reasons,
;; useful for "rsync".
(setq tramp-temp-buffer-file-name local-copy))
;; We must ensure that `file-coding-system-alist'
;; matches `local-copy'. We must also use `visit',
;; otherwise there might be an error in the
;; `revert-buffer' function under XEmacs.
(let ((file-coding-system-alist
(tramp-find-file-name-coding-system-alist
filename local-copy)))
(setq result
(insert-file-contents
local-copy visit beg end replace)))))
;; We must ensure that `file-coding-system-alist'
;; matches `local-copy'. We must also use `visit',
;; otherwise there might be an error in the
;; `revert-buffer' function under XEmacs.
(let ((file-coding-system-alist
(tramp-find-file-name-coding-system-alist
filename local-copy)))
(setq result
(insert-file-contents
local-copy visit beg end replace))))
(error
(add-hook 'find-file-not-found-functions
`(lambda () (signal ',(car err) ',(cdr err)))
nil t)
(signal (car err) (cdr err))))))
;; Save exit.
(progn
(when visit
(setq buffer-file-name filename)
(setq buffer-read-only (not (file-writable-p filename)))
(set-visited-file-modtime)
(set-buffer-modified-p nil))
(when (and (stringp local-copy)
(or remote-copy (null tramp-temp-buffer-file-name)))
(delete-file local-copy))
(when (stringp remote-copy)
(delete-file
(tramp-make-tramp-file-name method user host remote-copy)))))))
;; Save exit.
(progn
(when visit
(setq buffer-file-name filename)
(setq buffer-read-only (not (file-writable-p filename)))
(set-visited-file-modtime)
(set-buffer-modified-p nil))
(when (and (stringp local-copy)
(or remote-copy (null tramp-temp-buffer-file-name)))
(delete-file local-copy))
(when (stringp remote-copy)
(delete-file
(tramp-make-tramp-file-name method user host remote-copy)))))
;; Result.
(list (expand-file-name filename)
(cadr result))))
;; Result.
(list (expand-file-name filename)
(cadr result)))))
(defun tramp-handle-load (file &optional noerror nomessage nosuffix must-suffix)
"Like `load' for Tramp files."