changeset 77788:b5a6f9693d00

(tar-file-name-handler): New function. (tar-extract): Bind file-name-handler-alist to it to force find-buffer-file-type-coding-system behave as if the file being extracted existed. Use last-coding-system-used to force buffer-file-coding-system to what decode-coding-region actually used to decode the file.
author Eli Zaretskii <eliz@gnu.org>
date Wed, 23 May 2007 17:31:39 +0000
parents 2149606de072
children 0499176f26d1
files lisp/tar-mode.el
diffstat 1 files changed, 22 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/tar-mode.el	Wed May 23 08:54:24 2007 +0000
+++ b/lisp/tar-mode.el	Wed May 23 17:31:39 2007 +0000
@@ -681,6 +681,12 @@
   (goto-char (posn-point (event-end event)))
   (tar-extract))
 
+(defun tar-file-name-handler (op &rest args)
+  "Helper function for `tar-extract'."
+  (or (eq op 'file-exists-p)
+      (let ((file-name-handler-alist nil))
+	(apply op args))))
+
 (defun tar-extract (&optional other-window-p)
   "In Tar mode, extract this entry of the tar file into its own buffer."
   (interactive)
@@ -735,9 +741,19 @@
 				  (save-excursion
 				    (funcall set-auto-coding-function
 					     name (- (point-max) (point)))))
-			     (car (find-operation-coding-system
-				   'insert-file-contents
-				   (cons name (current-buffer)) t))))
+			     ;; The following binding causes
+			     ;; find-buffer-file-type-coding-system
+			     ;; (defined on dos-w32.el) to act as if
+			     ;; the file being extracted existed, so
+			     ;; that the file's contents' encoding and
+			     ;; EOL format are auto-detected.
+			     (let ((file-name-handler-alist
+				    (if (featurep 'dos-w32)
+					'(("" . tar-file-name-handler))
+				      file-name-handler-alist)))
+			       (car (find-operation-coding-system
+				     'insert-file-contents
+				     (cons name (current-buffer)) t)))))
 			(multibyte enable-multibyte-characters)
 			(detected (detect-coding-region
 				   (point-min)
@@ -758,7 +774,9 @@
 			      (coding-system-change-text-conversion
 			       coding 'raw-text)))
 		    (decode-coding-region (point-min) (point-max) coding)
-		    (set-buffer-file-coding-system coding))
+		    ;; Force buffer-file-coding-system to what
+		    ;; decode-coding-region actually used.
+		    (set-buffer-file-coding-system last-coding-system-used t))
 		  ;; Set the default-directory to the dir of the
 		  ;; superior buffer.
 		  (setq default-directory