Fix visiting zip archives inside tar archives

* lisp/tar-mode.el (tar-archive-from-tar): New local variable.
(tar-extract): Set it non-nil for an extracted member that happens
to be arc-mode archive.
* lisp/arc-mode.el (tar-archive-from-tar): Defvar it.
(archive-unique-fname): Make sure FNAME can be created in DIR,
even if FNAME is provided as an absolute file name (this happens
if the archive is a member of a Tar archive, for example).
(archive-extract): Set 'archive-remote' for archives that were
extracted from Tar archives.  (Bug#70987)
This commit is contained in:
Eli Zaretskii 2024-05-20 15:29:39 +03:00
parent 18457c64b0
commit 45916eadae
2 changed files with 16 additions and 1 deletions

View file

@ -563,6 +563,8 @@ Its value is an `archive--file-desc'.")
(defvar-local archive-files nil
"Vector of `archive--file-desc' objects.")
(defvar tar-archive-from-tar nil)
;; -------------------------------------------------------------------------
;;; Section: Support functions.
@ -754,7 +756,8 @@ archive.
;; on local filesystem. Treat such archives as remote.
(or archive-remote
(setq archive-remote
(or (string-match archive-remote-regexp (buffer-file-name))
(or tar-archive-from-tar ; was included in a tar archive
(string-match archive-remote-regexp (buffer-file-name))
(string-match file-name-invalid-regexp
(buffer-file-name)))))
@ -920,6 +923,9 @@ If FNAME can be uniquely created in DIR, it is returned unaltered.
If FNAME is something our underlying filesystem can't grok, or if another
file by that name already exists in DIR, a unique new name is generated
using `make-temp-file', and the generated name is returned."
(if (file-name-absolute-p fname)
;; We need a file name relative to the filesystem root.
(setq fname (substring fname (1+ (string-search "/" fname)))))
(let ((fullname (expand-file-name fname dir))
(alien (string-match file-name-invalid-regexp fname))
(tmpfile
@ -1179,6 +1185,9 @@ NEW-NAME."
(buffer (get-buffer bufname))
(just-created nil)
(file-name-coding archive-file-name-coding-system))
(or archive-remote
(and (local-variable-p 'tar-archive-from-tar)
(setq archive-remote tar-archive-from-tar)))
(if (and buffer
(string= (buffer-file-name buffer) arcfilename))
nil

View file

@ -135,6 +135,10 @@ This information is useful, but it takes screen space away from file names."
(put 'tar-superior-buffer 'permanent-local t)
(put 'tar-superior-descriptor 'permanent-local t)
(defvar tar-archive-from-tar nil
"Non-nil if an arc-mode archive file is a member of a tar archive.")
(put tar-archive-from-tar 'permanent-local t)
;; The Tar data is made up of bytes and better manipulated as bytes
;; and can be very large, so insert/delete can be costly. The summary we
;; want to display may contain non-ascii chars, of course, so we'd like it
@ -1124,6 +1128,8 @@ return nil. Otherwise point is returned."
default-directory))
(set-buffer-modified-p nil)
(normal-mode) ; pick a mode.
(when (derived-mode-p 'archive-mode)
(setq-local tar-archive-from-tar t))
(setq-local tar-superior-buffer tar-buffer)
(setq-local tar-superior-descriptor descriptor)
(setq buffer-read-only read-only-p)