aboutsummaryrefslogtreecommitdiffstats
path: root/lisp
diff options
context:
space:
mode:
authorIvan Shmakov2019-06-25 19:54:35 +0200
committerLars Ingebrigtsen2019-06-25 19:54:35 +0200
commit0ab24743f1702aa52bb0bcb18798c698cc792da3 (patch)
tree6044869736507b4e066410f9f60dc50ed54fd90a /lisp
parentf0151e17d296bfdeb1ca3f002c9b430c8302a6e7 (diff)
downloademacs-0ab24743f1702aa52bb0bcb18798c698cc792da3.tar.gz
emacs-0ab24743f1702aa52bb0bcb18798c698cc792da3.zip
Heed default directory in tar-untar-buffer
* lisp/tar-mode.el (tar-untar-buffer): Fix use the value of default-directory local to the tar-mode buffer (bug#19865).
Diffstat (limited to 'lisp')
-rw-r--r--lisp/tar-mode.el41
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."