]> code.delx.au - gnu-emacs/blobdiff - lisp/tar-mode.el
(proced-after-send-signal-hook): Use defcustom.
[gnu-emacs] / lisp / tar-mode.el
index 2e99766918d57b858170def7f6aa941113b38fb6..12c39117ddd6e037c232a15a916bd3ea7f4c3c00 100644 (file)
@@ -1,7 +1,7 @@
 ;;; tar-mode.el --- simple editing of tar files from GNU emacs
 
 ;; Copyright (C) 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-;;   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+;;   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
 
 ;; Author: Jamie Zawinski <jwz@lucid.com>
 ;; Maintainer: FSF
@@ -239,8 +239,13 @@ write-date, checksum, link-type, and link-name."
              (gname-end (1- tar-dmaj-offset))
              (link-p (aref string tar-linkp-offset))
              (magic-str (substring string tar-magic-offset
-                                   (1- tar-uname-offset)))
-             (uname-valid-p (car (member magic-str '("ustar  " "ustar\0\0"))))
+                                  ;; The magic string is actually 6bytes
+                                  ;; of magic string plus 2bytes of version
+                                  ;; which we here ignore.
+                                   (- tar-uname-offset 2)))
+            ;; The magic string is "ustar\0" for POSIX format, and
+            ;; "ustar " for GNU Tar's format.
+             (uname-valid-p (car (member magic-str '("ustar " "ustar\0"))))
              name linkname
              (nulsexp   "[^\000]*\000"))
         (when (string-match nulsexp string tar-name-offset)
@@ -256,7 +261,7 @@ write-date, checksum, link-type, and link-name."
                          nil
                        (- link-p ?0)))
         (setq linkname (substring string tar-link-offset link-end))
-        (when (and (equal uname-valid-p "ustar\0\0")
+        (when (and (equal uname-valid-p "ustar\0")
                    (string-match nulsexp string tar-prefix-offset)
                    (> (match-end 0) (1+ tar-prefix-offset)))
           (setq name (concat (substring string tar-prefix-offset
@@ -271,7 +276,7 @@ write-date, checksum, link-type, and link-name."
             (setq link-p 5))            ; directory
 
         (if (and (equal name "././@LongLink")
-                 (equal magic-str "ustar  ")) ;OLDGNU_MAGIC.
+                 (equal magic-str "ustar ")) ;OLDGNU_MAGIC.
             ;; This is a GNU Tar long-file-name header.
             (let* ((size (tar-parse-octal-integer
                           string tar-size-offset tar-time-offset))
@@ -637,7 +642,10 @@ See also: variables `tar-update-datestamp' and `tar-anal-blocksize'.
   ;; buffer for the summary.
   (assert (not (tar-data-swapped-p)))
   (set (make-local-variable 'revert-buffer-function) 'tar-mode-revert)
-  (add-hook 'write-contents-functions 'tar-mode-write-contents nil t)
+  ;; We started using write-contents-functions, but this hook is not
+  ;; used during auto-save, so we now use
+  ;; write-region-annotate-functions which hooks at a lower-level.
+  (add-hook 'write-region-annotate-functions 'tar-write-region-annotate nil t)
   (add-hook 'kill-buffer-hook 'tar-mode-kill-buffer-hook nil t)
   (add-hook 'change-major-mode-hook 'tar-change-major-mode-hook nil t)
   ;; Tar data is made of bytes, not chars.
@@ -1045,8 +1053,8 @@ for this to be permanent."
                (string-match "/" encoded-new-name
                             (- (length encoded-new-name) 99))
               (< (match-beginning 0) 155))
-      (unless (equal (tar-header-magic descriptor) "ustar\0\0")
-        (tar-alter-one-field tar-magic-offset "ustar\0\0"))
+      (unless (equal (tar-header-magic descriptor) "ustar\0")
+        (tar-alter-one-field tar-magic-offset (concat "ustar\0" "00")))
       (setq prefix (substring encoded-new-name 0 (match-beginning 0)))
       (setq encoded-new-name (substring encoded-new-name (match-end 0))))
 
@@ -1213,18 +1221,15 @@ Leaves the region wide."
             (insert (make-string (- goal-end (point-max)) ?\0))))))))
 
 
-;; Used in write-contents-functions to write tar-files out correctly.
-(defun tar-mode-write-contents ()
-  (save-excursion
-    (unwind-protect
-       (progn
-         (when (tar-data-swapped-p) (tar-swap-data))
-         (write-region nil nil buffer-file-name nil t))
-      (unless (tar-data-swapped-p) (tar-swap-data))))
+;; Used in write-region-annotate-functions to write tar-files out correctly.
+(defun tar-write-region-annotate (start end)
+  ;; When called from write-file (and auto-save), `start' is nil.
+  ;; When called from M-x write-region, we assume the user wants to save
+  ;; (part of) the summary, not the tar data.
+  (unless (or start (not (tar-data-swapped-p)))
   (tar-clear-modification-flags)
-  (set-buffer-modified-p nil)
-  ;; Return t because we've written the file.
-  t)
+    (set-buffer tar-data-buffer)
+    nil))
 
 (provide 'tar-mode)