summaryrefslogtreecommitdiff
path: root/lisp/tar-mode.el
diff options
context:
space:
mode:
authorNoam Postavsky <npostavs@gmail.com>2016-12-17 18:01:52 -0500
committerNoam Postavsky <npostavs@gmail.com>2017-01-01 16:36:23 -0500
commit214a67b00b7b47445bcff284168da56b4934ffdb (patch)
tree5d248890aef4b0c6190c7474c27f74f91c802108 /lisp/tar-mode.el
parent5da2a5f449cd0c8f16f2244c90b57e27ca373892 (diff)
downloademacs-214a67b00b7b47445bcff284168da56b4934ffdb.tar.gz
Warn about incomplete untarring of link files
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.
Diffstat (limited to 'lisp/tar-mode.el')
-rw-r--r--lisp/tar-mode.el31
1 files changed, 20 insertions, 11 deletions
diff --git a/lisp/tar-mode.el b/lisp/tar-mode.el
index 345333b8bc4..f25b1a45ba1 100644
--- a/lisp/tar-mode.el
+++ b/lisp/tar-mode.el
@@ -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))