From 74d3b20cf5fb4fe863a97379dea26412b27d7f39 Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Sun, 21 Dec 2014 12:10:31 +0100 Subject: [PATCH] Fixes: debbugs:18623 * net/tramp.el (tramp-handle-insert-file-contents): Set `find-file-not-found-functions' in case of errors. --- lisp/ChangeLog | 5 ++ lisp/net/tramp.el | 220 +++++++++++++++++++++++++++--------------------------- 2 files changed, 116 insertions(+), 109 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index ed08c9fbdbb..e4f620ecb40 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2014-12-21 Michael Albinus + + * 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 * net/tramp-sh.el (tramp-send-command-and-read): New optional diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el index 140bf1874bf..fdb00c813d6 100644 --- a/lisp/net/tramp.el +++ b/lisp/net/tramp.el @@ -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))) - - (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)) - - ;; `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 (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))))) - - ;; 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)))) + (unwind-protect + (if (not (file-exists-p filename)) + (tramp-message v 0 "(New file)") + + (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)) + + ;; `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 (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)))) + (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))))) + + ;; Result. + (list (expand-file-name filename) + (cadr result))))) (defun tramp-handle-load (file &optional noerror nomessage nosuffix must-suffix) "Like `load' for Tramp files." -- 2.11.4.GIT