]> git.eshelyaron.com Git - emacs.git/commitdiff
* net/tramp.el (tramp-find-file-name-coding-system-alist): New
authorMichael Albinus <michael.albinus@gmx.de>
Wed, 9 Apr 2008 20:17:27 +0000 (20:17 +0000)
committerMichael Albinus <michael.albinus@gmx.de>
Wed, 9 Apr 2008 20:17:27 +0000 (20:17 +0000)
defun.
(tramp-handle-insert-file-contents, tramp-handle-write-region):
Use it.

lisp/net/tramp.el

index d6d6a524be98f913568077c7958df159a6ee00d6..aaac6bfda8824368afb2cca2f8c1890fbab2da8f 100644 (file)
@@ -3888,6 +3888,21 @@ This will break if COMMAND prints a newline, followed by the value of
            (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 @@ This will break if COMMAND prints a newline, followed by the value of
        (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 @@ Returns a file name in `tramp-auto-save-directory' for autosaving this file."
       ;; 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