From 8158337cc254403fbae6fed3d80064400f62f48b Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Sat, 21 Mar 2020 10:30:26 +0100 Subject: [PATCH] Fix Bug#40156 in Tramp * lisp/net/tramp-sh.el (tramp-sh-handle-write-region): Copy to temp file only if FILENAME exists. (Bug#40156) * test/lisp/net/tramp-tests.el (tramp-test10-write-region): Extend test. --- lisp/net/tramp-sh.el | 3 ++- test/lisp/net/tramp-tests.el | 9 ++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el index 7ac41d16c8b..06dca312275 100644 --- a/lisp/net/tramp-sh.el +++ b/lisp/net/tramp-sh.el @@ -3306,7 +3306,8 @@ STDERR can also be a file name." ;; If `append' is non-nil, we copy the file locally, and let ;; the native `write-region' implementation do the job. - (when append (copy-file filename tmpfile 'ok)) + (when (and append (file-exists-p filename)) + (copy-file filename tmpfile 'ok)) ;; We say `no-message' here because we don't want the ;; visited file modtime data to be clobbered from the temp diff --git a/test/lisp/net/tramp-tests.el b/test/lisp/net/tramp-tests.el index e220420d8cf..e6c6b28c58a 100644 --- a/test/lisp/net/tramp-tests.el +++ b/test/lisp/net/tramp-tests.el @@ -2356,7 +2356,14 @@ This checks also `file-name-as-directory', `file-name-directory', (write-region nil nil tmp-name 3)) (with-temp-buffer (insert-file-contents tmp-name) - (should (string-equal (buffer-string) "foobaz")))) + (should (string-equal (buffer-string) "foobaz"))) + (delete-file tmp-name) + (with-temp-buffer + (insert "foo") + (write-region nil nil tmp-name 'append)) + (with-temp-buffer + (insert-file-contents tmp-name) + (should (string-equal (buffer-string) "foo")))) ;; Write string. (write-region "foo" nil tmp-name) -- 2.39.2