summaryrefslogtreecommitdiff
path: root/lisp/tar-mode.el
diff options
context:
space:
mode:
authorNoam Postavsky <npostavs@gmail.com>2019-05-25 19:44:41 -0400
committerNoam Postavsky <npostavs@gmail.com>2019-06-03 20:18:19 -0400
commitf81b812d75d33a7d24c8c0f46455bde9a7ee6840 (patch)
treed258d46ceca01aedb326fbbf9d593e7dd7ba4e7a /lisp/tar-mode.el
parent2aae063055283ee64ecf339c812a1fe6d1cb106e (diff)
downloademacs-f81b812d75d33a7d24c8c0f46455bde9a7ee6840.tar.gz
Let untarring (and hence package installation) go faster (Bug#35909)
* lisp/subr.el (progress-reporter-update) (progress-reporter-force-update, progress-reporter-do-update): Accept new optional argument, SUFFIX. * doc/lispref/display.texi (Progress): Document it. * etc/NEWS: Announce it. * lisp/tar-mode.el (tar-untar-buffer): Use a progress reporter instead of calling message. Suppress message from write-region. Let-bind write-region-inhibit-fsync to t.
Diffstat (limited to 'lisp/tar-mode.el')
-rw-r--r--lisp/tar-mode.el13
1 files changed, 8 insertions, 5 deletions
diff --git a/lisp/tar-mode.el b/lisp/tar-mode.el
index 599da9ac807..7ff31ff1026 100644
--- a/lisp/tar-mode.el
+++ b/lisp/tar-mode.el
@@ -523,7 +523,8 @@ MODE should be an integer which is a file mode value."
"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 ((descriptors tar-parse-info)) ;Read the var in its buffer.
+ (let ((descriptors tar-parse-info) ;Read the var in its buffer.
+ (reporter (make-progress-reporter "Extracting")))
(with-current-buffer
(if (tar-data-swapped-p) tar-data-buffer (current-buffer))
(set-buffer-multibyte nil) ;Hopefully, a no-op.
@@ -536,17 +537,19 @@ MODE should be an integer which is a file mode value."
(start (tar-header-data-start descriptor))
(end (+ start (tar-header-size descriptor))))
(unless (file-directory-p name)
- (message "Extracting %s" name)
+ (progress-reporter-update reporter name)
(if (and dir (not (file-exists-p dir)))
(make-directory dir t))
(unless (file-directory-p name)
- (let ((coding-system-for-write 'no-conversion))
+ (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)))
- (set-file-modes name (tar-header-mode descriptor))))))))
+ (write-region start end name nil :nomessage)))
+ (set-file-modes name (tar-header-mode descriptor)))))
+ (progress-reporter-done reporter))))
(defun tar-summarize-buffer ()
"Parse the contents of the tar file in the current buffer."