]> git.eshelyaron.com Git - emacs.git/commitdiff
Handle last-coding-system-used in Tramp for all backends
authorMichael Albinus <michael.albinus@gmx.de>
Sun, 13 Aug 2023 14:48:00 +0000 (16:48 +0200)
committerMichael Albinus <michael.albinus@gmx.de>
Sun, 13 Aug 2023 14:48:00 +0000 (16:48 +0200)
* lisp/net/tramp.el (tramp-skeleton-write-region):
Handle `last-coding-system-used'.
(tramp-handle-write-region):
* lisp/net/tramp-adb.el (tramp-adb-handle-write-region):
* lisp/net/tramp-smb.el (tramp-smb-handle-write-region):
* lisp/net/tramp-sshfs.el (tramp-sshfs-handle-write-region):
Set `coding-system-used'.  (Bug#65022)

* lisp/net/tramp-sh.el (tramp-sh-handle-write-region):
Move `last-coding-system-used' handling to
`tramp-skeleton-write-region'.

lisp/net/tramp-adb.el
lisp/net/tramp-sh.el
lisp/net/tramp-smb.el
lisp/net/tramp-sshfs.el
lisp/net/tramp.el

index 58c93245335c1a4c8e75f2ae897312cba39b5cc3..f16c97a235ca8c73dc31119fdf16eb0ad347d004 100644 (file)
@@ -552,6 +552,8 @@ Emacs dired can't find files."
          (set-file-modes tmpfile (logior (or (file-modes tmpfile) 0) #o0600)))
        (let (create-lockfiles)
           (write-region start end tmpfile append 'no-message))
+       ;; Now, `last-coding-system-used' has the right value.  Remember it.
+       (setq coding-system-used last-coding-system-used)
        (with-tramp-progress-reporter
            v 3 (format-message
                 "Moving tmp file `%s' to `%s'" tmpfile filename)
index 9895af92502d68d3eab3c5064b8b68ae9637a37b..ffd910b41c4b6dc30e52b72fdccc66aa86173528 100644 (file)
@@ -3446,15 +3446,6 @@ implementation will be used."
 
        (let* ((modes (tramp-default-file-modes
                       filename (and (eq mustbenew 'excl) 'nofollow)))
-              ;; We use this to save the value of
-              ;; `last-coding-system-used' after writing the tmp
-              ;; file.  At the end of the function, we set
-              ;; `last-coding-system-used' to this saved value.  This
-              ;; way, any intermediary coding systems used while
-              ;; talking to the remote shell or suchlike won't hose
-              ;; this variable.  This approach was snarfed from
-              ;; ange-ftp.el.
-              coding-system-used
               ;; Write region into a tmp file.  This isn't really
               ;; needed if we use an encoding function, but currently
               ;; we use it always because this makes the logic
@@ -3484,11 +3475,11 @@ implementation will be used."
              ((error quit)
               (setq tramp-temp-buffer-file-name nil)
               (delete-file tmpfile)
-              (signal (car err) (cdr err))))
+              (signal (car err) (cdr err)))))
 
-           ;; Now, `last-coding-system-used' has the right value.
-           ;; Remember it.
-           (setq coding-system-used last-coding-system-used))
+         ;; Now, `last-coding-system-used' has the right value.
+         ;; Remember it.
+         (setq coding-system-used last-coding-system-used)
 
          ;; The permissions of the temporary file should be set.  If
          ;; FILENAME does not exist (eq modes nil) it has been
@@ -3618,11 +3609,7 @@ implementation will be used."
               v 'file-error
               (concat "Method `%s' should specify both encoding and "
                       "decoding command or an scp program")
-              method))))
-
-         ;; Make `last-coding-system-used' have the right value.
-         (when coding-system-used
-           (setq last-coding-system-used coding-system-used)))))))
+              method)))))))))
 
 (defvar tramp-vc-registered-file-names nil
   "List used to collect file names, which are checked during `vc-registered'.")
index c50bd5b387f0a5246ee9e7df367be676308750a0..7249fa266acbe99b68ac8ec524b2d1ade4ceecb4 100644 (file)
@@ -1628,6 +1628,8 @@ VEC or USER, or if there is no home directory, return nil."
       ;; `set-visited-file-modtime' ourselves later on.
       (let (create-lockfiles)
         (write-region start end tmpfile append 'no-message))
+      ;; Now, `last-coding-system-used' has the right value.  Remember it.
+      (setq coding-system-used last-coding-system-used)
 
       (with-tramp-progress-reporter
          v 3 (format "Moving tmp file %s to %s" tmpfile filename)
index 0ec2a1e74b8d87fc849eabbcf7f92a3b468e4765..c638d32ec356ba0d8fac536699b92b22e9cb8270 100644 (file)
@@ -379,7 +379,9 @@ arguments to pass to the OPERATION."
   (tramp-skeleton-write-region start end filename append visit lockname mustbenew
     (let (create-lockfiles)
       (write-region
-       start end (tramp-fuse-local-file-name filename) append 'nomessage))))
+       start end (tramp-fuse-local-file-name filename) append 'nomessage))
+    ;; Now, `last-coding-system-used' has the right value.  Remember it.
+    (setq coding-system-used last-coding-system-used)))
 
 \f
 ;; File name conversions.
index 9fa698293ce0e7c7826e76c19149f04615f41f73..caa6baabc3101c19f4bbe0b2515b90f2dbdce4a5 100644 (file)
@@ -3719,14 +3719,22 @@ BODY is the backend specific code."
   ;; VISIT, for example `jka-compr-handler'.  We must respect this.
   ;; See Bug#55166.
   `(let* ((filename (expand-file-name ,filename))
-        (lockname (file-truename (or ,lockname filename)))
-        (handler (and (stringp ,visit)
-                      (let ((inhibit-file-name-handlers
-                             `(tramp-file-name-handler
-                               tramp-crypt-file-name-handler
-                               . inhibit-file-name-handlers))
-                            (inhibit-file-name-operation 'write-region))
-                        (find-file-name-handler ,visit 'write-region)))))
+         (lockname (file-truename (or ,lockname filename)))
+         (handler (and (stringp ,visit)
+                       (let ((inhibit-file-name-handlers
+                              `(tramp-file-name-handler
+                                tramp-crypt-file-name-handler
+                                . inhibit-file-name-handlers))
+                             (inhibit-file-name-operation 'write-region))
+                         (find-file-name-handler ,visit 'write-region))))
+         ;; We use this to save the value of
+         ;; `last-coding-system-used' after writing the tmp file.  At
+         ;; the end of the function, we set `last-coding-system-used'
+         ;; to this saved value.  This way, any intermediary coding
+         ;; systems used while talking to the remote shell or
+         ;; suchlike won't hose this variable.  This approach was
+         ;; snarfed from ange-ftp.el.
+         coding-system-used)
      (with-parsed-tramp-file-name filename nil
        (if handler
           (progn
@@ -3773,9 +3781,7 @@ BODY is the backend specific code."
           ;; likely that it is needed shortly after `write-region'.
           (tramp-set-file-property v localname "file-exists-p" t)
 
-          ;; We must protect `last-coding-system-used', now we have
-          ;; set it to its correct value.
-          (let (last-coding-system-used (need-chown t))
+          (let ((need-chown t))
             ;; Set file modification time.
             (when (or (eq ,visit t) (stringp ,visit))
               (when-let ((file-attr (file-attributes filename 'integer)))
@@ -3794,7 +3800,7 @@ BODY is the backend specific code."
                (tramp-set-file-uid-gid filename uid gid))
 
             ;; Set extended attributes.  We ignore possible errors,
-            ;; because ACL strings could be incompatible.
+            ;; because ACL strings or SELinux contexts could be incompatible.
             (when attributes
               (ignore-errors
                 (set-file-extended-attributes filename attributes)))
@@ -3813,7 +3819,11 @@ BODY is the backend specific code."
             (when (and (null noninteractive)
                        (or (eq ,visit t) (string-or-null-p ,visit)))
               (tramp-message v 0 "Wrote %s" filename))
-            (run-hooks 'tramp-handle-write-region-hook)))))))
+            (run-hooks 'tramp-handle-write-region-hook))))
+
+       ;; Make `last-coding-system-used' have the right value.
+       (when coding-system-used
+        (setq last-coding-system-used coding-system-used)))))
 
 ;;; Common file name handler functions for different backends:
 
@@ -5420,6 +5430,8 @@ of."
       ;; `set-visited-file-modtime' ourselves later on.
       (let (create-lockfiles)
         (write-region start end tmpfile append 'no-message))
+      ;; Now, `last-coding-system-used' has the right value.  Remember it.
+      (setq coding-system-used last-coding-system-used)
       (condition-case nil
          (rename-file tmpfile filename 'ok-if-already-exists)
        (error