diff options
| -rw-r--r-- | lisp/tar-mode.el | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/lisp/tar-mode.el b/lisp/tar-mode.el index 7ff31ff1026..472631f6ae7 100644 --- a/lisp/tar-mode.el +++ b/lisp/tar-mode.el | |||
| @@ -523,24 +523,29 @@ MODE should be an integer which is a file mode value." | |||
| 523 | "Extract all archive members in the tar-file into the current directory." | 523 | "Extract all archive members in the tar-file into the current directory." |
| 524 | (interactive) | 524 | (interactive) |
| 525 | ;; FIXME: make it work even if we're not in tar-mode. | 525 | ;; FIXME: make it work even if we're not in tar-mode. |
| 526 | (let ((descriptors tar-parse-info) ;Read the var in its buffer. | 526 | (let ((data-buf (if (tar-data-swapped-p) tar-data-buffer |
| 527 | (current-buffer))) | ||
| 527 | (reporter (make-progress-reporter "Extracting"))) | 528 | (reporter (make-progress-reporter "Extracting"))) |
| 528 | (with-current-buffer | 529 | (with-current-buffer data-buf |
| 529 | (if (tar-data-swapped-p) tar-data-buffer (current-buffer)) | 530 | (cl-assert (not enable-multibyte-characters))) |
| 530 | (set-buffer-multibyte nil) ;Hopefully, a no-op. | 531 | (dolist (descriptor tar-parse-info) |
| 531 | (dolist (descriptor descriptors) | 532 | (let* ((orig (tar-header-name descriptor)) |
| 532 | (let* ((name (tar-header-name descriptor)) | 533 | ;; Note that default-directory may have different values |
| 533 | (dir (if (eq (tar-header-link-type descriptor) 5) | 534 | ;; in the tar-mode and data buffers, so we stick to the |
| 534 | name | 535 | ;; absolute file name from now on. |
| 535 | (file-name-directory name))) | 536 | (name (expand-file-name orig)) |
| 536 | (link-desc (tar--describe-as-link descriptor)) | 537 | (dir (if (eq (tar-header-link-type descriptor) 5) |
| 537 | (start (tar-header-data-start descriptor)) | 538 | name |
| 538 | (end (+ start (tar-header-size descriptor)))) | 539 | (file-name-directory name))) |
| 540 | (link-desc (tar--describe-as-link descriptor)) | ||
| 541 | (start (tar-header-data-start descriptor)) | ||
| 542 | (end (+ start (tar-header-size descriptor)))) | ||
| 543 | (unless (file-directory-p name) | ||
| 544 | (progress-reporter-update reporter name) | ||
| 545 | (if (and dir (not (file-exists-p dir))) | ||
| 546 | (make-directory dir t)) | ||
| 539 | (unless (file-directory-p name) | 547 | (unless (file-directory-p name) |
| 540 | (progress-reporter-update reporter name) | 548 | (with-current-buffer data-buf |
| 541 | (if (and dir (not (file-exists-p dir))) | ||
| 542 | (make-directory dir t)) | ||
| 543 | (unless (file-directory-p name) | ||
| 544 | (let ((coding-system-for-write 'no-conversion) | 549 | (let ((coding-system-for-write 'no-conversion) |
| 545 | (write-region-inhibit-fsync t)) | 550 | (write-region-inhibit-fsync t)) |
| 546 | (when link-desc | 551 | (when link-desc |
| @@ -548,8 +553,8 @@ MODE should be an integer which is a file mode value." | |||
| 548 | "Extracted `%s', %s, as a normal file" | 553 | "Extracted `%s', %s, as a normal file" |
| 549 | name link-desc)) | 554 | name link-desc)) |
| 550 | (write-region start end name nil :nomessage))) | 555 | (write-region start end name nil :nomessage))) |
| 551 | (set-file-modes name (tar-header-mode descriptor))))) | 556 | (set-file-modes name (tar-header-mode descriptor)))))) |
| 552 | (progress-reporter-done reporter)))) | 557 | (progress-reporter-done reporter))) |
| 553 | 558 | ||
| 554 | (defun tar-summarize-buffer () | 559 | (defun tar-summarize-buffer () |
| 555 | "Parse the contents of the tar file in the current buffer." | 560 | "Parse the contents of the tar file in the current buffer." |