changeset 80588:9d42c705fd64

(tar-summarize-buffer): Handle GNU Tar @LongLink format.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Sun, 25 May 2008 13:48:22 +0000
parents 52c723879a4b
children ed5ef027fc1e
files lisp/ChangeLog lisp/tar-mode.el
diffstat 2 files changed, 21 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Sat May 24 12:31:59 2008 +0000
+++ b/lisp/ChangeLog	Sun May 25 13:48:22 2008 +0000
@@ -1,3 +1,7 @@
+2008-05-25  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* tar-mode.el (tar-summarize-buffer): Handle GNU Tar @LongLink format.
+
 2008-05-24  Alan Mackenzie  <acm@muc.de>
 
 	* progmodes/cc-mode.el (c-postprocess-file-styles): Throw an error
--- a/lisp/tar-mode.el	Sat May 24 12:31:59 2008 +0000
+++ b/lisp/tar-mode.el	Sun May 25 13:48:22 2008 +0000
@@ -421,6 +421,16 @@
                                  (tar-header-block-tokenize
                                   (buffer-substring pos (+ pos 512)))))))
         (setq pos (+ pos 512))
+        (when (equal (tar-header-name tokens) "././@LongLink")
+          ;; This is a GNU Tar long-file-name header.
+          (let* ((size (tar-header-size tokens))
+                 ;; -1 so as to strip the terminating 0 byte.
+                 (name (buffer-substring pos (+ pos size -1))))
+            (setq pos (+ pos (ash (ash (+ 511 size) -9) 9)))
+            (setq tokens (tar-header-block-tokenize
+                          (buffer-substring pos (+ pos 512))))
+            (tar-setf (tar-header-name tokens) name)
+            (setq pos (+ pos 512))))
         (progress-reporter-update progress-reporter pos)
         (if (memq (tar-header-link-type tokens) '(20 55))
             ;; Foo.  There's an extra empty block after these.
@@ -429,20 +439,18 @@
           (if (< size 0)
               (error "%s has size %s - corrupted"
                      (tar-header-name tokens) size))
-                                        ;
-                                        ; This is just too slow.  Don't really need it anyway....
-                                        ;(tar-header-block-check-checksum
-                                        ;  hblock (tar-header-block-checksum hblock)
-                                        ;  (tar-header-name tokens))
+          ;;
+          ;; This is just too slow.  Don't really need it anyway....
+          ;;(tar-header-block-check-checksum
+          ;;  hblock (tar-header-block-checksum hblock)
+          ;;  (tar-header-name tokens))
 
           (push (make-tar-desc pos tokens) result)
 
           (and (null (tar-header-link-type tokens))
                (> size 0)
-               (setq pos
-                     (+ pos 512 (ash (ash (1- size) -9) 9)) ; this works
-                                        ;(+ pos (+ size (- 512 (rem (1- size) 512)))) ; this doesn't
-                     ))))
+               ;; Round up to a multiple of 512.
+               (setq pos (+ pos (ash (ash (+ 511 size) -9) 9))))))
       (make-local-variable 'tar-parse-info)
       (setq tar-parse-info (nreverse result))
       ;; A tar file should end with a block or two of nulls,