]> git.eshelyaron.com Git - emacs.git/commitdiff
Warn about incomplete untarring of link files
authorNoam Postavsky <npostavs@gmail.com>
Sat, 17 Dec 2016 23:01:52 +0000 (18:01 -0500)
committerNoam Postavsky <npostavs@gmail.com>
Sun, 1 Jan 2017 21:36:23 +0000 (16:36 -0500)
The current tar-mode doesn't really support unpacking symlinks, it
simply creates an empty file of the same name.

* lisp/tar-mode.el (tar--describe-as-link): New function extracted from
`tar--check-descriptor'.
(tar-untar-buffer): Use it to warn about imperfectly untarred link
files.

lisp/tar-mode.el

index 345333b8bc4e1f066fc4f1efd1196013b9604366..f25b1a45ba1d3dec306e55191b285063049cbdfb 100644 (file)
@@ -544,6 +544,7 @@ MODE should be an integer which is a file mode value."
                (dir (if (eq (tar-header-link-type descriptor) 5)
                         name
                       (file-name-directory name)))
+               (link-desc (tar--describe-as-link descriptor))
                (start (tar-header-data-start descriptor))
                (end (+ start (tar-header-size descriptor))))
           (unless (file-directory-p name)
@@ -552,6 +553,10 @@ MODE should be an integer which is a file mode value."
                 (make-directory dir t))
             (unless (file-directory-p name)
              (let ((coding-system-for-write 'no-conversion))
+                (when link-desc
+                  (lwarn '(tar link) :warning
+                         "Extracted `%s', %s, as a normal file"
+                         name link-desc))
                (write-region start end name)))
             (set-file-modes name (tar-header-mode descriptor))))))))
 
@@ -816,19 +821,23 @@ tar-file's buffer."
          nil
          (error "This line does not describe a tar-file entry"))))
 
-(defun tar--check-descriptor (descriptor)
+(defun tar--describe-as-link (descriptor)
   (let ((link-p (tar-header-link-type descriptor)))
     (if link-p
-       (error "This is %s, not a real file"
-              (cond ((eq link-p 5) "a directory")
-                    ((eq link-p 20) "a tar directory header")
-                    ((eq link-p 28) "a next has longname")
-                    ((eq link-p 29) "a multivolume-continuation")
-                    ((eq link-p 35) "a sparse entry")
-                    ((eq link-p 38) "a volume header")
-                    ((eq link-p 55) "a pax global extended header")
-                    ((eq link-p 72) "a pax extended header")
-                    (t "a link"))))))
+       (cond ((eq link-p 5) "a directory")
+              ((eq link-p 20) "a tar directory header")
+              ((eq link-p 28) "a next has longname")
+              ((eq link-p 29) "a multivolume-continuation")
+              ((eq link-p 35) "a sparse entry")
+              ((eq link-p 38) "a volume header")
+              ((eq link-p 55) "a pax global extended header")
+              ((eq link-p 72) "a pax extended header")
+              (t "a link")))))
+
+(defun tar--check-descriptor (descriptor)
+  (let ((link-desc (tar--describe-as-link descriptor)))
+    (when link-desc
+      (error "This is %s, not a real file" link-desc))))
 
 (defun tar-get-descriptor ()
   (let* ((descriptor (tar-current-descriptor))