Function: tar-untar-buffer
tar-untar-buffer is an interactive and byte-compiled function defined
in tar-mode.el.gz.
Signature
(tar-untar-buffer)
Documentation
Extract all archive members in the tar-file into the current directory.
Key Bindings
Source Code
;; Defined in /usr/src/emacs/lisp/tar-mode.el.gz
(defun tar-untar-buffer ()
"Extract all archive members in the tar-file into the current directory."
(interactive)
;; FIXME: make it work even if we're not in tar-mode.
(let ((data-buf (if (tar-data-swapped-p) tar-data-buffer
(current-buffer)))
(reporter (make-progress-reporter "Extracting")))
(with-current-buffer data-buf
(cl-assert (not enable-multibyte-characters)))
(dolist (descriptor tar-parse-info)
(let* ((orig (tar-header-name descriptor))
;; Note that default-directory may have different values
;; in the tar-mode and data buffers, so we stick to the
;; absolute file name from now on.
(name (expand-file-name orig))
(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)
(progress-reporter-update reporter name)
(if (and dir (not (file-exists-p dir)))
(make-directory dir t))
(unless (file-directory-p name)
(with-current-buffer data-buf
(let ((coding-system-for-write 'no-conversion)
(write-region-inhibit-fsync t))
(when link-desc
(lwarn '(tar link) :warning
"Extracted `%s', %s, as a normal file"
name link-desc))
(write-region start end name nil :nomessage)))
(set-file-modes name (tar-header-mode descriptor))))))
(progress-reporter-done reporter)))