changeset 80473:1b9faa405c59

* net/tramp.el (tramp-find-file-name-coding-system-alist): New defun. (tramp-handle-insert-file-contents, tramp-handle-write-region): Use it.
author Michael Albinus <michael.albinus@gmx.de>
date Wed, 09 Apr 2008 20:17:27 +0000
parents 2d8979bd10ff
children f516420168b3
files lisp/net/tramp.el
diffstat 1 files changed, 41 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/net/tramp.el	Wed Apr 09 08:11:58 2008 +0000
+++ b/lisp/net/tramp.el	Wed Apr 09 20:17:27 2008 +0000
@@ -3888,6 +3888,21 @@
 	    (t (tramp-make-tramp-file-name
 		multi-method method user host "")))))))
 
+(defun tramp-find-file-name-coding-system-alist (filename tmpname)
+  "Like `find-operation-coding-system' for Tramp filenames.
+Tramp's `insert-file-contents' and `write-region' work over
+temporary file names.  If `file-coding-system-alist' contains an
+expression, which matches more than the file name suffix, the
+coding system might not be determined.  This function repairs it."
+  (let (result)
+    (dolist (elt file-coding-system-alist result)
+      (when (and (consp elt) (string-match (car elt) filename))
+	;; We found a matching entry in `file-coding-system-alist'.
+	;; So we add a similar entry, but with the temporary file name
+	;; as regexp.
+	(add-to-list
+	 'result (cons (regexp-quote tmpname) (cdr elt)) 'append)))))
+
 (defun tramp-handle-insert-file-contents
   (filename &optional visit beg end replace)
   "Like `insert-file-contents' for tramp files."
@@ -3916,14 +3931,18 @@
 	(tramp-message-for-buffer
 	 multi-method method user host
 	 9 "Inserting local temp file `%s'..." local-copy)
-	(setq result (insert-file-contents local-copy nil beg end replace))
-	(when visit
-	  (setq buffer-file-name filename)
-	  (set-visited-file-modtime)
-	  (set-buffer-modified-p nil))
-	;; Now `last-coding-system-used' has right value.  Remember it.
-	(when (boundp 'last-coding-system-used)
-	  (setq coding-system-used (symbol-value 'last-coding-system-used)))
+	;; We must ensure that `file-coding-system-alist' matches
+	;; `local-copy'.
+	(let ((file-coding-system-alist
+	       (tramp-find-file-name-coding-system-alist filename local-copy)))
+	  (setq result (insert-file-contents local-copy nil beg end replace))
+	  (when visit
+	    (setq buffer-file-name filename)
+	    (set-visited-file-modtime)
+	    (set-buffer-modified-p nil))
+	  ;; Now `last-coding-system-used' has right value.  Remember it.
+	  (when (boundp 'last-coding-system-used)
+	    (setq coding-system-used (symbol-value 'last-coding-system-used))))
 	(tramp-message-for-buffer
 	 multi-method method user host
 	 9 "Inserting local temp file `%s'...done" local-copy)
@@ -4072,17 +4091,20 @@
       ;; Set current buffer.  If connection wasn't open, `file-modes' has
       ;; changed it accidently.
       (set-buffer curbuf)
-      ;; We say `no-message' here because we don't want the visited file
-      ;; modtime data to be clobbered from the temp file.  We call
-      ;; `set-visited-file-modtime' ourselves later on.
-      (tramp-run-real-handler
-       'write-region
-       (if confirm ; don't pass this arg unless defined for backward compat.
-	   (list start end tmpfil append 'no-message lockname confirm)
-	 (list start end tmpfil append 'no-message lockname)))
-      ;; Now, `last-coding-system-used' has the right value.  Remember it.
-      (when (boundp 'last-coding-system-used)
-	(setq coding-system-used (symbol-value 'last-coding-system-used)))
+      ;; We say `no-message' here because we don't want the visited
+      ;; file modtime data to be clobbered from the temp file.  We
+      ;; call `set-visited-file-modtime' ourselves later on.  We must
+      ;; ensure that `file-coding-system-alist' matches `tmpfil'.
+      (let ((file-coding-system-alist
+	     (tramp-find-file-name-coding-system-alist filename tmpfil)))
+	(tramp-run-real-handler
+	 'write-region
+	 (if confirm ; don't pass this arg unless defined for backward compat.
+	     (list start end tmpfil append 'no-message lockname confirm)
+	   (list start end tmpfil append 'no-message lockname)))
+	;; Now, `last-coding-system-used' has the right value.  Remember it.
+	(when (boundp 'last-coding-system-used)
+	  (setq coding-system-used (symbol-value 'last-coding-system-used))))
       ;; The permissions of the temporary file should be set.  If
       ;; filename does not exist (eq modes nil) it has been renamed to
       ;; the backup file.  This case `save-buffer' handles