annotate lisp/tar-mode.el @ 110410:f2e111723c3a

Merge changes made in Gnus trunk. Reimplement nnimap, and do tweaks to the rest of the code to support that. * gnus-int.el (gnus-finish-retrieve-group-infos) (gnus-retrieve-group-data-early): New functions. * gnus-range.el (gnus-range-nconcat): New function. * gnus-start.el (gnus-get-unread-articles): Support early retrieval of data. (gnus-read-active-for-groups): Support finishing the early retrieval of data. * gnus-sum.el (gnus-summary-move-article): Pass the move-to group name if the move is internal, so that nnimap can do fast internal moves. * gnus.el (gnus-article-special-mark-lists): Add uid/active tuples, for nnimap usage. * nnimap.el: Rewritten. * nnmail.el (nnmail-inhibit-default-split-group): New internal variable to allow the mail splitting to not return a default group. This is useful for nnimap, which will leave unmatched mail in the inbox. * utf7.el (utf7-encode): Autoload. Implement shell connection. * nnimap.el (nnimap-open-shell-stream): New function. (nnimap-open-connection): Use it. Get the number of lines by using BODYSTRUCTURE. (nnimap-transform-headers): Get the number of lines in each message. (nnimap-retrieve-headers): Query for BODYSTRUCTURE so that we get the number of lines. Not all servers return UIDNEXT. Work past this problem. Remove junk from end of file. Fix typo in "bogus" section. Make capabilties be case-insensitive. Require cl when compiling. Don't bug out if the LIST command doesn't have any parameters. 2010-09-17 Knut Anders Hatlen <kahatlen@gmail.com> (tiny change) * nnimap.el (nnimap-get-groups): Don't bug out if the LIST command doesn't have any parameters. (mm-text-html-renderer): Document gnus-article-html. 2010-09-17 Julien Danjou <julien@danjou.info> (tiny fix) * mm-decode.el (mm-text-html-renderer): Document gnus-article-html. * dgnushack.el: Define netrc-credentials. If the user doesn't have a /etc/services, supply some sensible port defaults. Have `unseen-or-unread' select an unread unseen article first. (nntp-open-server): Return whether the open was successful or not. Throughout all files, replace (save-excursion (set-buffer ...)) with (with-current-buffer ... ). Save result so that it doesn't say "failed" all the time. Add ~/.authinfo to the default, since that's probably most useful for users. Don't use the "finish" method when we're reading from the agent. Add some more nnimap-relevant agent stuff to nnagent.el. * nnimap.el (nnimap-with-process-buffer): Removed. Revert one line that was changed by mistake in the last checkin. (nnimap-open-connection): Don't error out when we can't make a connection nnimap-related changes to avoid bugging out if we can't contact a server. * gnus-start.el (gnus-get-unread-articles): Don't try to scan groups from methods that are denied. * nnimap.el (nnimap-possibly-change-group): Return nil if we can't log in. (nnimap-finish-retrieve-group-infos): Make sure we're not waiting for nothing. * gnus-sum.el (gnus-select-newsgroup): Indent.
author Katsumi Yamaoka <yamaoka@jpl.org>
date Sat, 18 Sep 2010 10:02:19 +0000
parents 0b37f86b040e
children 6a7fb61524be
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 584
diff changeset
1 ;;; tar-mode.el --- simple editing of tar files from GNU emacs
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2
64762
41bb365f41c4 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 64431
diff changeset
3 ;; Copyright (C) 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
106815
1d1d5d9bd884 Add 2010 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 105889
diff changeset
4 ;; 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
104823
68150c643e2e Use default-value rather than default-enable-multibyte-characters.
Glenn Morris <rgm@gnu.org>
parents: 103321
diff changeset
5 ;; Free Software Foundation, Inc.
840
113281b361ec *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 814
diff changeset
6
775
1ca26ccad38e *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
7 ;; Author: Jamie Zawinski <jwz@lucid.com>
21045
cc3f3c1ea725 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 20970
diff changeset
8 ;; Maintainer: FSF
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 775
diff changeset
9 ;; Created: 04 Apr 1990
814
38b2499cb3e9 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 807
diff changeset
10 ;; Keywords: unix
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
12 ;; This file is part of GNU Emacs.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
13
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94296
diff changeset
14 ;; GNU Emacs is free software: you can redistribute it and/or modify
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
15 ;; it under the terms of the GNU General Public License as published by
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94296
diff changeset
16 ;; the Free Software Foundation, either version 3 of the License, or
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94296
diff changeset
17 ;; (at your option) any later version.
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
18
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
19 ;; GNU Emacs is distributed in the hope that it will be useful,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
20 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
21 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
22 ;; GNU General Public License for more details.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
23
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
24 ;; You should have received a copy of the GNU General Public License
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94296
diff changeset
25 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
26
775
1ca26ccad38e *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
27 ;;; Commentary:
1ca26ccad38e *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
28
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
29 ;; This package attempts to make dealing with Unix 'tar' archives easier.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
30 ;; When this code is loaded, visiting a file whose name ends in '.tar' will
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
31 ;; cause the contents of that archive file to be displayed in a Dired-like
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
32 ;; listing. It is then possible to use the customary Dired keybindings to
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
33 ;; extract sub-files from that archive, either by reading them into their own
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
34 ;; editor buffers, or by copying them directly to arbitrary files on disk.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
35 ;; It is also possible to delete sub-files from within the tar file and write
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
36 ;; the modified archive back to disk, or to edit sub-files within the archive
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
37 ;; and re-insert the modified files into the archive. See the documentation
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
38 ;; string of tar-mode for more info.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
39
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
40 ;; This code now understands the extra fields that GNU tar adds to tar files.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
41
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
42 ;; This interacts correctly with "uncompress.el" in the Emacs library,
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47656
diff changeset
43 ;; which you get with
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
44 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
45 ;; (autoload 'uncompress-while-visiting "uncompress")
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
46 ;; (setq auto-mode-alist (cons '("\\.Z$" . uncompress-while-visiting)
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
47 ;; auto-mode-alist))
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
48 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
49 ;; Do not attempt to use tar-mode.el with crypt.el, you will lose.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
50
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47656
diff changeset
51 ;; *************** TO DO ***************
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
52 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
53 ;; o chmod should understand "a+x,og-w".
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
54 ;;
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47656
diff changeset
55 ;; o It's not possible to add a NEW file to a tar archive; not that
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
56 ;; important, but still...
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
57 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
58 ;; o The code is less efficient that it could be - in a lot of places, I
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
59 ;; pull a 512-character string out of the buffer and parse it, when I could
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
60 ;; be parsing it in place, not garbaging a string. Should redo that.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
61 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
62 ;; o I'd like a command that searches for a string/regexp in every subfile
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
63 ;; of an archive, where <esc> would leave you in a subfile-edit buffer.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
64 ;; (Like the Meta-R command of the Zmacs mail reader.)
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
65 ;;
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47656
diff changeset
66 ;; o Sometimes (but not always) reverting the tar-file buffer does not
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
67 ;; re-grind the listing, and you are staring at the binary tar data.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
68 ;; Typing 'g' again immediately after that will always revert and re-grind
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
69 ;; it, though. I have no idea why this happens.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
70 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
71 ;; o Tar-mode interacts poorly with crypt.el and zcat.el because the tar
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
72 ;; write-file-hook actually writes the file. Instead it should remove the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
73 ;; header (and conspire to put it back afterwards) so that other write-file
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
74 ;; hooks which frob the buffer have a chance to do their dirty work. There
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
75 ;; might be a problem if the tar write-file-hook does not come *first* on
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
76 ;; the list.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
77 ;;
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47656
diff changeset
78 ;; o Block files, sparse files, continuation files, and the various header
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
79 ;; types aren't editable. Actually I don't know that they work at all.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
80
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
81 ;; Rationale:
7103
b5fad00fa757 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 7090
diff changeset
82
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
83 ;; Why does tar-mode edit the file itself instead of using tar?
7103
b5fad00fa757 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 7090
diff changeset
84
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
85 ;; That means that you can edit tar files which you don't have room for
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
86 ;; on your local disk.
7103
b5fad00fa757 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 7090
diff changeset
87
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
88 ;; I don't know about recent features in gnu tar, but old versions of tar
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
89 ;; can't replace a file in the middle of a tar file with a new version.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
90 ;; Tar-mode can. I don't think tar can do things like chmod the subfiles.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
91 ;; An implementation which involved unpacking and repacking the file into
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
92 ;; some scratch directory would be very wasteful, and wouldn't be able to
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
93 ;; preserve the file owners.
7103
b5fad00fa757 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 7090
diff changeset
94
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
95 ;;; Bugs:
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
96
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
97 ;; - Rename on ././@LongLink files
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
98 ;; - Revert confirmation displays the raw data temporarily.
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
99
775
1ca26ccad38e *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
100 ;;; Code:
1ca26ccad38e *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
101
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
102 (eval-when-compile (require 'cl))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
103
20808
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
104 (defgroup tar nil
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
105 "Simple editing of tar files."
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
106 :prefix "tar-"
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
107 :group 'data)
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
108
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
109 (defcustom tar-anal-blocksize 20
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
110 "The blocksize of tar files written by Emacs, or nil, meaning don't care.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
111 The blocksize of a tar file is not really the size of the blocks; rather, it is
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47656
diff changeset
112 the number of blocks written with one system call. When tarring to a tape,
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
113 this is the size of the *tape* blocks, but when writing to a file, it doesn't
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
114 matter much. The only noticeable difference is that if a tar file does not
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
115 have a blocksize of 20, tar will tell you that; all this really controls is
20808
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
116 how many null padding bytes go on the end of the tar file."
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
117 :type '(choice integer (const nil))
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
118 :group 'tar)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
119
20808
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
120 (defcustom tar-update-datestamp nil
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
121 "Non-nil means Tar mode should play fast and loose with sub-file datestamps.
10843
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
122 If this is true, then editing and saving a tar file entry back into its
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
123 tar file will update its datestamp. If false, the datestamp is unchanged.
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
124 You may or may not want this - it is good in that you can tell when a file
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
125 in a tar archive has been changed, but it is bad for the same reason that
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47656
diff changeset
126 editing a file in the tar archive at all is bad - the changed version of
20808
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
127 the file never exists on disk."
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
128 :type 'boolean
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
129 :group 'tar)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
130
20808
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
131 (defcustom tar-mode-show-date nil
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
132 "Non-nil means Tar mode should show the date/time of each subfile.
20808
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
133 This information is useful, but it takes screen space away from file names."
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
134 :type 'boolean
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
135 :group 'tar)
10843
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
136
2542
ae4176e2e8fa Add defvars to pacify the byte compiler, at RMS's request.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 880
diff changeset
137 (defvar tar-parse-info nil)
ae4176e2e8fa Add defvars to pacify the byte compiler, at RMS's request.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 880
diff changeset
138 (defvar tar-superior-buffer nil)
ae4176e2e8fa Add defvars to pacify the byte compiler, at RMS's request.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 880
diff changeset
139 (defvar tar-superior-descriptor nil)
88955
1d1275f5d5b7 (tar-file-name-coding-system): New variable. Make
Kenichi Handa <handa@m17n.org>
parents: 43424
diff changeset
140 (defvar tar-file-name-coding-system nil)
4260
e0713a13f2d7 (tar-parse-info, tar-header-offset, tar-superior-buffer)
Richard M. Stallman <rms@gnu.org>
parents: 4120
diff changeset
141
e0713a13f2d7 (tar-parse-info, tar-header-offset, tar-superior-buffer)
Richard M. Stallman <rms@gnu.org>
parents: 4120
diff changeset
142 (put 'tar-superior-buffer 'permanent-local t)
e0713a13f2d7 (tar-parse-info, tar-header-offset, tar-superior-buffer)
Richard M. Stallman <rms@gnu.org>
parents: 4120
diff changeset
143 (put 'tar-superior-descriptor 'permanent-local t)
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
144
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
145 ;; The Tar data is made up of bytes and better manipulated as bytes
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
146 ;; and can be very large, so insert/delete can be costly. The summary we
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
147 ;; want to display may contain non-ascci chars, of course, so we'd like it
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
148 ;; to be multibyte. We used to keep both in the same buffer and switch
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
149 ;; from/to uni/multibyte. But this had several downsides:
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
150 ;; - set-buffer-multibyte has an O(N^2) worst case that tends to be triggered
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
151 ;; here, so it gets atrociously slow on large Tar files.
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
152 ;; - need to widen/narrow the buffer to show/hide the raw data, and need to
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
153 ;; maintain a tar-header-offset that keeps track of the boundary between
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
154 ;; the two.
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
155 ;; - can't use markers because they're not preserved by set-buffer-multibyte.
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
156 ;; So instead, we now keep the two pieces of data in separate buffers, and
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
157 ;; use the new buffer-swap-text primitive when we need to change which data
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
158 ;; is associated with "the" buffer.
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
159 (defvar tar-data-buffer nil "Buffer that holds the actual raw tar bytes.")
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
160 (make-variable-buffer-local 'tar-data-buffer)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
161
100787
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
162 (defvar tar-data-swapped nil
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
163 "If non-nil, `tar-data-buffer' indeed holds raw tar bytes.")
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
164 (make-variable-buffer-local 'tar-data-swapped)
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
165
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
166 (defun tar-data-swapped-p ()
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
167 "Return non-nil if the tar-data is in `tar-data-buffer'."
100787
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
168 (and (buffer-live-p tar-data-buffer)
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
169 ;; Sanity check to try and make sure tar-data-swapped tracks the swap
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
170 ;; state correctly: the raw data is expected to be always larger than
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
171 ;; the summary.
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
172 (progn
105653
8177db6744a6 (tar-data-swapped-p): Make the assertion a bit more
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 104823
diff changeset
173 (assert (or (= (buffer-size tar-data-buffer) (buffer-size))
8177db6744a6 (tar-data-swapped-p): Make the assertion a bit more
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 104823
diff changeset
174 (eq tar-data-swapped
8177db6744a6 (tar-data-swapped-p): Make the assertion a bit more
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 104823
diff changeset
175 (> (buffer-size tar-data-buffer) (buffer-size)))))
100787
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
176 tar-data-swapped)))
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
177
100698
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
178 (defun tar-swap-data ()
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
179 "Swap buffer contents between current buffer and `tar-data-buffer'.
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
180 Preserve the modified states of the buffers and set `buffer-swapped-with'."
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
181 (let ((data-buffer-modified-p (buffer-modified-p tar-data-buffer))
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
182 (current-buffer-modified-p (buffer-modified-p)))
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
183 (buffer-swap-text tar-data-buffer)
100787
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
184 (setq tar-data-swapped (not tar-data-swapped))
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
185 (restore-buffer-modified-p data-buffer-modified-p)
100698
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
186 (with-current-buffer tar-data-buffer
100787
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
187 (restore-buffer-modified-p current-buffer-modified-p))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
188
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
189 ;;; down to business.
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
190
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
191 (defstruct (tar-header
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
192 (:constructor nil)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
193 (:type vector)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
194 :named
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
195 (:constructor
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
196 make-tar-header (data-start name mode uid gid size date checksum
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
197 link-type link-name magic uname gname dmaj dmin)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
198 data-start name mode uid gid size date checksum link-type link-name
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
199 magic uname gname dmaj dmin
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
200 ;; Start of the header can be nil (meaning it's 512 bytes before data-start)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
201 ;; or a marker (in case the header uses LongLink thingies).
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
202 header-start)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
203
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
204 (defconst tar-name-offset 0)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
205 (defconst tar-mode-offset (+ tar-name-offset 100))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
206 (defconst tar-uid-offset (+ tar-mode-offset 8))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
207 (defconst tar-gid-offset (+ tar-uid-offset 8))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
208 (defconst tar-size-offset (+ tar-gid-offset 8))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
209 (defconst tar-time-offset (+ tar-size-offset 12))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
210 (defconst tar-chk-offset (+ tar-time-offset 12))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
211 (defconst tar-linkp-offset (+ tar-chk-offset 8))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
212 (defconst tar-link-offset (+ tar-linkp-offset 1))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
213 ;;; GNU-tar specific slots.
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
214 (defconst tar-magic-offset (+ tar-link-offset 100))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
215 (defconst tar-uname-offset (+ tar-magic-offset 8))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
216 (defconst tar-gname-offset (+ tar-uname-offset 32))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
217 (defconst tar-dmaj-offset (+ tar-gname-offset 32))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
218 (defconst tar-dmin-offset (+ tar-dmaj-offset 8))
94270
e1d36e944ae0 (tar-prefix-offset): New constant.
Juri Linkov <juri@jurta.org>
parents: 93612
diff changeset
219 (defconst tar-prefix-offset (+ tar-dmin-offset 8))
e1d36e944ae0 (tar-prefix-offset): New constant.
Juri Linkov <juri@jurta.org>
parents: 93612
diff changeset
220 (defconst tar-end-offset (+ tar-prefix-offset 155))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
221
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
222 (defun tar-roundup-512 (s)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
223 "Round S up to the next multiple of 512."
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
224 (ash (ash (+ s 511) -9) 9))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
225
100698
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
226 (defun tar-header-block-tokenize (pos coding)
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
227 "Return a `tar-header' structure.
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47656
diff changeset
228 This is a list of name, mode, uid, gid, size,
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
229 write-date, checksum, link-type, and link-name."
102525
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
230 (if (> (+ pos 512) (point-max)) (error "Malformed Tar header"))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
231 (assert (zerop (mod (- pos (point-min)) 512)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
232 (assert (not enable-multibyte-characters))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
233 (let ((string (buffer-substring pos (setq pos (+ pos 512)))))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
234 (when ;(some 'plusp string) ; <-- oops, massive cycle hog!
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
235 (or (not (= 0 (aref string 0))) ; This will do.
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
236 (not (= 0 (aref string 101))))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
237 (let* ((name-end tar-mode-offset)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
238 (link-end (1- tar-magic-offset))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
239 (uname-end (1- tar-gname-offset))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
240 (gname-end (1- tar-dmaj-offset))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
241 (link-p (aref string tar-linkp-offset))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
242 (magic-str (substring string tar-magic-offset
101136
ef524a34d985 (tar-header-block-tokenize): Properly ignore the version
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100935
diff changeset
243 ;; The magic string is actually 6bytes
ef524a34d985 (tar-header-block-tokenize): Properly ignore the version
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100935
diff changeset
244 ;; of magic string plus 2bytes of version
ef524a34d985 (tar-header-block-tokenize): Properly ignore the version
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100935
diff changeset
245 ;; which we here ignore.
ef524a34d985 (tar-header-block-tokenize): Properly ignore the version
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100935
diff changeset
246 (- tar-uname-offset 2)))
ef524a34d985 (tar-header-block-tokenize): Properly ignore the version
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100935
diff changeset
247 ;; The magic string is "ustar\0" for POSIX format, and
ef524a34d985 (tar-header-block-tokenize): Properly ignore the version
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100935
diff changeset
248 ;; "ustar " for GNU Tar's format.
ef524a34d985 (tar-header-block-tokenize): Properly ignore the version
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100935
diff changeset
249 (uname-valid-p (car (member magic-str '("ustar " "ustar\0"))))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
250 name linkname
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
251 (nulsexp "[^\000]*\000"))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
252 (when (string-match nulsexp string tar-name-offset)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
253 (setq name-end (min name-end (1- (match-end 0)))))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
254 (when (string-match nulsexp string tar-link-offset)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
255 (setq link-end (min link-end (1- (match-end 0)))))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
256 (when (string-match nulsexp string tar-uname-offset)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
257 (setq uname-end (min uname-end (1- (match-end 0)))))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
258 (when (string-match nulsexp string tar-gname-offset)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
259 (setq gname-end (min gname-end (1- (match-end 0)))))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
260 (setq name (substring string tar-name-offset name-end)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
261 link-p (if (or (= link-p 0) (= link-p ?0))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
262 nil
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
263 (- link-p ?0)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
264 (setq linkname (substring string tar-link-offset link-end))
101136
ef524a34d985 (tar-header-block-tokenize): Properly ignore the version
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100935
diff changeset
265 (when (and (equal uname-valid-p "ustar\0")
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
266 (string-match nulsexp string tar-prefix-offset)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
267 (> (match-end 0) (1+ tar-prefix-offset)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
268 (setq name (concat (substring string tar-prefix-offset
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
269 (1- (match-end 0)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
270 "/" name)))
104823
68150c643e2e Use default-value rather than default-enable-multibyte-characters.
Glenn Morris <rgm@gnu.org>
parents: 103321
diff changeset
271 (if (default-value 'enable-multibyte-characters)
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
272 (setq name
100698
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
273 (decode-coding-string name coding)
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
274 linkname
100698
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
275 (decode-coding-string linkname coding)))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
276 (if (and (null link-p) (string-match "/\\'" name))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
277 (setq link-p 5)) ; directory
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
278
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
279 (if (and (equal name "././@LongLink")
103321
f50defb23b3e (tar-header-block-tokenize): Obey @LongLink even for
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 102546
diff changeset
280 ;; Supposedly @LongLink is only used for GNUTAR
f50defb23b3e (tar-header-block-tokenize): Obey @LongLink even for
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 102546
diff changeset
281 ;; format (i.e. "ustar ") but some POSIX Tar files
f50defb23b3e (tar-header-block-tokenize): Obey @LongLink even for
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 102546
diff changeset
282 ;; (with "ustar\0") have been seen using it as well.
f50defb23b3e (tar-header-block-tokenize): Obey @LongLink even for
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 102546
diff changeset
283 (member magic-str '("ustar " "ustar\0")))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
284 ;; This is a GNU Tar long-file-name header.
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
285 (let* ((size (tar-parse-octal-integer
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
286 string tar-size-offset tar-time-offset))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
287 ;; -1 so as to strip the terminating 0 byte.
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
288 (name (buffer-substring pos (+ pos size -1)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
289 (descriptor (tar-header-block-tokenize
100787
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
290 (+ pos (tar-roundup-512 size))
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
291 coding)))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
292 (cond
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
293 ((eq link-p (- ?L ?0)) ;GNUTYPE_LONGNAME.
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
294 (setf (tar-header-name descriptor) name))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
295 ((eq link-p (- ?K ?0)) ;GNUTYPE_LONGLINK.
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
296 (setf (tar-header-link-name descriptor) name))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
297 (t
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
298 (message "Unrecognized GNU Tar @LongLink format")))
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
299 (setf (tar-header-header-start descriptor)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
300 (copy-marker (- pos 512) t))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
301 descriptor)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
302
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
303 (make-tar-header
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
304 (copy-marker pos nil)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
305 name
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
306 (tar-parse-octal-integer string tar-mode-offset tar-uid-offset)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
307 (tar-parse-octal-integer string tar-uid-offset tar-gid-offset)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
308 (tar-parse-octal-integer string tar-gid-offset tar-size-offset)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
309 (tar-parse-octal-integer string tar-size-offset tar-time-offset)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
310 (tar-parse-octal-long-integer string tar-time-offset tar-chk-offset)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
311 (tar-parse-octal-integer string tar-chk-offset tar-linkp-offset)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
312 link-p
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
313 linkname
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
314 uname-valid-p
105653
8177db6744a6 (tar-data-swapped-p): Make the assertion a bit more
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 104823
diff changeset
315 (when uname-valid-p
8177db6744a6 (tar-data-swapped-p): Make the assertion a bit more
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 104823
diff changeset
316 (decode-coding-string
8177db6744a6 (tar-data-swapped-p): Make the assertion a bit more
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 104823
diff changeset
317 (substring string tar-uname-offset uname-end) coding))
8177db6744a6 (tar-data-swapped-p): Make the assertion a bit more
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 104823
diff changeset
318 (when uname-valid-p
8177db6744a6 (tar-data-swapped-p): Make the assertion a bit more
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 104823
diff changeset
319 (decode-coding-string
8177db6744a6 (tar-data-swapped-p): Make the assertion a bit more
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 104823
diff changeset
320 (substring string tar-gname-offset gname-end) coding))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
321 (tar-parse-octal-integer string tar-dmaj-offset tar-dmin-offset)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
322 (tar-parse-octal-integer string tar-dmin-offset tar-prefix-offset)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
323 ))))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
324
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
325 ;; Pseudo-field.
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
326 (defun tar-header-data-end (descriptor)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
327 (let* ((data-start (tar-header-data-start descriptor))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
328 (link-type (tar-header-link-type descriptor))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
329 (size (tar-header-size descriptor))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
330 (fudge (cond
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
331 ;; Foo. There's an extra empty block after these.
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
332 ((memq link-type '(20 55)) 512)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
333 (t 0))))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
334 (+ data-start fudge
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
335 (if (and (null link-type) (> size 0))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
336 (tar-roundup-512 size)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
337 0))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
338
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
339 (defun tar-parse-octal-integer (string &optional start end)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
340 (if (null start) (setq start 0))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
341 (if (null end) (setq end (length string)))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
342 (if (= (aref string start) 0)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
343 0
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
344 (let ((n 0))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
345 (while (< start end)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
346 (setq n (if (< (aref string start) ?0) n
10843
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
347 (+ (* n 8) (- (aref string start) ?0)))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
348 start (1+ start)))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
349 n)))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
350
10843
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
351 (defun tar-parse-octal-long-integer (string &optional start end)
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
352 (if (null start) (setq start 0))
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
353 (if (null end) (setq end (length string)))
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
354 (if (= (aref string start) 0)
11071
d629a0af50ca (tar-parse-octal-long-integer): Return list, not vector.
Karl Heuer <kwzh@gnu.org>
parents: 10922
diff changeset
355 (list 0 0)
10843
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
356 (let ((lo 0)
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
357 (hi 0))
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
358 (while (< start end)
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
359 (if (>= (aref string start) ?0)
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
360 (setq lo (+ (* lo 8) (- (aref string start) ?0))
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
361 hi (+ (* hi 8) (ash lo -16))
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
362 lo (logand lo 65535)))
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
363 (setq start (1+ start)))
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
364 (list hi lo))))
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
365
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
366 (defun tar-parse-octal-integer-safe (string)
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
367 (if (zerop (length string)) (error "empty string"))
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
368 (mapc (lambda (c)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
369 (if (or (< c ?0) (> c ?7))
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
370 (error "`%c' is not an octal digit" c)))
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
371 string)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
372 (tar-parse-octal-integer string))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
373
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
374
8023
f29df49c6e53 (tar-extract): Set file name by hand before calling
Richard M. Stallman <rms@gnu.org>
parents: 7497
diff changeset
375 (defun tar-header-block-checksum (string)
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
376 "Compute and return a tar-acceptable checksum for this block."
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
377 (assert (not (multibyte-string-p string)))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
378 (let* ((chk-field-start tar-chk-offset)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
379 (chk-field-end (+ chk-field-start 8))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
380 (sum 0)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
381 (i 0))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
382 ;; Add up all of the characters except the ones in the checksum field.
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
383 ;; Add that field as if it were filled with spaces.
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
384 (while (< i chk-field-start)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
385 (setq sum (+ sum (aref string i))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
386 i (1+ i)))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
387 (setq i chk-field-end)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
388 (while (< i 512)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
389 (setq sum (+ sum (aref string i))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
390 i (1+ i)))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
391 (+ sum (* 32 8))))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
392
8023
f29df49c6e53 (tar-extract): Set file name by hand before calling
Richard M. Stallman <rms@gnu.org>
parents: 7497
diff changeset
393 (defun tar-header-block-check-checksum (hblock desired-checksum file-name)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
394 "Beep and print a warning if the checksum doesn't match."
8023
f29df49c6e53 (tar-extract): Set file name by hand before calling
Richard M. Stallman <rms@gnu.org>
parents: 7497
diff changeset
395 (if (not (= desired-checksum (tar-header-block-checksum hblock)))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
396 (progn (beep) (message "Invalid checksum for file %s!" file-name))))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
397
10843
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
398 (defun tar-clip-time-string (time)
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
399 (let ((str (current-time-string time)))
29424
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
400 (concat " " (substring str 4 16) (substring str 19 24))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
401
29424
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
402 (defun tar-grind-file-mode (mode)
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
403 "Construct a `-rw--r--r--' string indicating MODE.
10922
0c3d44805949 (tar-grind-file-mode): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 10843
diff changeset
404 MODE should be an integer which is a file mode value."
29424
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
405 (string
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
406 (if (zerop (logand 256 mode)) ?- ?r)
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
407 (if (zerop (logand 128 mode)) ?- ?w)
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
408 (if (zerop (logand 1024 mode)) (if (zerop (logand 64 mode)) ?- ?x) ?s)
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
409 (if (zerop (logand 32 mode)) ?- ?r)
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
410 (if (zerop (logand 16 mode)) ?- ?w)
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
411 (if (zerop (logand 2048 mode)) (if (zerop (logand 8 mode)) ?- ?x) ?s)
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
412 (if (zerop (logand 4 mode)) ?- ?r)
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
413 (if (zerop (logand 2 mode)) ?- ?w)
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
414 (if (zerop (logand 1 mode)) ?- ?x)))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
415
8023
f29df49c6e53 (tar-extract): Set file name by hand before calling
Richard M. Stallman <rms@gnu.org>
parents: 7497
diff changeset
416 (defun tar-header-block-summarize (tar-hblock &optional mod-p)
29424
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
417 "Return a line similar to the output of `tar -vtf'."
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
418 (let ((name (tar-header-name tar-hblock))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
419 (mode (tar-header-mode tar-hblock))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
420 (uid (tar-header-uid tar-hblock))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
421 (gid (tar-header-gid tar-hblock))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
422 (uname (tar-header-uname tar-hblock))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
423 (gname (tar-header-gname tar-hblock))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
424 (size (tar-header-size tar-hblock))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
425 (time (tar-header-date tar-hblock))
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
426 ;; (ck (tar-header-checksum tar-hblock))
29424
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
427 (type (tar-header-link-type tar-hblock))
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
428 (link-name (tar-header-link-name tar-hblock)))
80592
8436412d2e08 (tar-header-block-summarize): Ensure one space around user&group.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 80588
diff changeset
429 (format "%c%c%s %7s/%-7s %7s%s %s%s"
29424
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
430 (if mod-p ?* ? )
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
431 (cond ((or (eq type nil) (eq type 0)) ?-)
49806
2edf03d7c602 (tar-header-block-summarize): Use l for symlink, h for hard link.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
432 ((eq type 1) ?h) ; link
2edf03d7c602 (tar-header-block-summarize): Use l for symlink, h for hard link.
Richard M. Stallman <rms@gnu.org>
parents: 49597
diff changeset
433 ((eq type 2) ?l) ; symlink
29424
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
434 ((eq type 3) ?c) ; char special
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
435 ((eq type 4) ?b) ; block special
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
436 ((eq type 5) ?d) ; directory
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
437 ((eq type 6) ?p) ; FIFO/pipe
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
438 ((eq type 20) ?*) ; directory listing
44204
c9cbe448711d (tar-header-block-summarize, tar-get-descriptor):
Richard M. Stallman <rms@gnu.org>
parents: 43777
diff changeset
439 ((eq type 28) ?L) ; next has longname
29424
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
440 ((eq type 29) ?M) ; multivolume continuation
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
441 ((eq type 35) ?S) ; sparse
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
442 ((eq type 38) ?V) ; volume header
77925
3da77a559100 (tar-header-block-summarize, tar-summarize-buffer)
Chong Yidong <cyd@stupidchicken.com>
parents: 77788
diff changeset
443 ((eq type 55) ?H) ; extended pax header
74243
b5548562a340 (tar-header-block-summarize, tar-clear-modification-flags): "?\ " -> "?\s".
Juanma Barranquero <lekktu@gmail.com>
parents: 70945
diff changeset
444 (t ?\s)
29424
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
445 )
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
446 (tar-grind-file-mode mode)
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
447 (if (= 0 (length uname)) uid uname)
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
448 (if (= 0 (length gname)) gid gname)
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
449 size
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
450 (if tar-mode-show-date (tar-clip-time-string time) "")
38081
fecdcc18b027 (tar-header-block-summarize): Add help-echo to mouse-highlighted text.
Eli Zaretskii <eliz@gnu.org>
parents: 38062
diff changeset
451 (propertize name
fecdcc18b027 (tar-header-block-summarize): Add help-echo to mouse-highlighted text.
Eli Zaretskii <eliz@gnu.org>
parents: 38062
diff changeset
452 'mouse-face 'highlight
fecdcc18b027 (tar-header-block-summarize): Add help-echo to mouse-highlighted text.
Eli Zaretskii <eliz@gnu.org>
parents: 38062
diff changeset
453 'help-echo "mouse-2: extract this file into a buffer")
29424
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
454 (if (or (eq type 1) (eq type 2))
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
455 (concat (if (= type 1) " ==> " " --> ") link-name)
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
456 ""))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
457
43777
c62ae85e0f7b (tar-untar-buffer): New function.
Richard M. Stallman <rms@gnu.org>
parents: 43424
diff changeset
458 (defun tar-untar-buffer ()
47656
940195447c9f (tar-untar-buffer): Handle dir-entries.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46926
diff changeset
459 "Extract all archive members in the tar-file into the current directory."
43777
c62ae85e0f7b (tar-untar-buffer): New function.
Richard M. Stallman <rms@gnu.org>
parents: 43424
diff changeset
460 (interactive)
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
461 ;; FIXME: make it work even if we're not in tar-mode.
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
462 (let ((descriptors tar-parse-info)) ;Read the var in its buffer.
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
463 (with-current-buffer
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
464 (if (tar-data-swapped-p) tar-data-buffer (current-buffer))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
465 (set-buffer-multibyte nil) ;Hopefully, a no-op.
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
466 (dolist (descriptor descriptors)
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
467 (let* ((name (tar-header-name descriptor))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
468 (dir (if (eq (tar-header-link-type descriptor) 5)
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
469 name
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
470 (file-name-directory name)))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
471 (start (tar-header-data-start descriptor))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
472 (end (+ start (tar-header-size descriptor))))
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
473 (unless (file-directory-p name)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
474 (message "Extracting %s" name)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
475 (if (and dir (not (file-exists-p dir)))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
476 (make-directory dir t))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
477 (unless (file-directory-p name)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
478 (write-region start end name))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
479 (set-file-modes name (tar-header-mode descriptor))))))))
43777
c62ae85e0f7b (tar-untar-buffer): New function.
Richard M. Stallman <rms@gnu.org>
parents: 43424
diff changeset
480
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
481 (defun tar-summarize-buffer ()
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
482 "Parse the contents of the tar file in the current buffer."
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
483 (assert (tar-data-swapped-p))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
484 (let* ((modified (buffer-modified-p))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
485 (result '())
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
486 (pos (point-min))
100698
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
487 (coding tar-file-name-coding-system)
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
488 (progress-reporter
95370
fafc513e04bc (tar-summarize-buffer): Fix reporter initialization.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95347
diff changeset
489 (with-current-buffer tar-data-buffer
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
490 (make-progress-reporter "Parsing tar file..."
95370
fafc513e04bc (tar-summarize-buffer): Fix reporter initialization.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95347
diff changeset
491 (point-min) (point-max))))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
492 descriptor)
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
493 (with-current-buffer tar-data-buffer
102525
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
494 (while (and (< pos (point-max))
100698
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
495 (setq descriptor (tar-header-block-tokenize pos coding)))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
496 (let ((size (tar-header-size descriptor)))
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
497 (if (< size 0)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
498 (error "%s has size %s - corrupted"
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
499 (tar-header-name descriptor) size)))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
500 ;;
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
501 ;; This is just too slow. Don't really need it anyway....
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
502 ;;(tar-header-block-check-checksum
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
503 ;; hblock (tar-header-block-checksum hblock)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
504 ;; (tar-header-name descriptor))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
505
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
506 (push descriptor result)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
507 (setq pos (tar-header-data-end descriptor))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
508 (progress-reporter-update progress-reporter pos)))
9698
b321ed01c3dc (tar-summarize-buffer): Check for end of buffer before extracting substring.
Karl Heuer <kwzh@gnu.org>
parents: 8043
diff changeset
509
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
510 (set (make-local-variable 'tar-parse-info) (nreverse result))
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
511 ;; A tar file should end with a block or two of nulls,
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
512 ;; but let's not get a fatal error if it doesn't.
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
513 (if (null descriptor)
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
514 (progress-reporter-done progress-reporter)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
515 (message "Warning: premature EOF parsing tar file"))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
516 (goto-char (point-min))
90283
9970a9645ad9 Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-4
Miles Bader <miles@gnu.org>
parents: 90261
diff changeset
517 (let ((inhibit-read-only t)
9970a9645ad9 Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-4
Miles Bader <miles@gnu.org>
parents: 90261
diff changeset
518 (total-summaries
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
519 (mapconcat 'tar-header-block-summarize tar-parse-info "\n")))
90283
9970a9645ad9 Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-4
Miles Bader <miles@gnu.org>
parents: 90261
diff changeset
520 (insert total-summaries "\n"))
9970a9645ad9 Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-4
Miles Bader <miles@gnu.org>
parents: 90261
diff changeset
521 (goto-char (point-min))
9970a9645ad9 Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-4
Miles Bader <miles@gnu.org>
parents: 90261
diff changeset
522 (restore-buffer-modified-p modified)))
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
523
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
524 (defvar tar-mode-map
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
525 (let ((map (make-keymap)))
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
526 (suppress-keymap map)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
527 (define-key map " " 'tar-next-line)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
528 (define-key map "C" 'tar-copy)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
529 (define-key map "d" 'tar-flag-deleted)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
530 (define-key map "\^D" 'tar-flag-deleted)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
531 (define-key map "e" 'tar-extract)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
532 (define-key map "f" 'tar-extract)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
533 (define-key map "\C-m" 'tar-extract)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
534 (define-key map [mouse-2] 'tar-mouse-extract)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
535 (define-key map "g" 'revert-buffer)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
536 (define-key map "h" 'describe-mode)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
537 (define-key map "n" 'tar-next-line)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
538 (define-key map "\^N" 'tar-next-line)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
539 (define-key map [down] 'tar-next-line)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
540 (define-key map "o" 'tar-extract-other-window)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
541 (define-key map "p" 'tar-previous-line)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
542 (define-key map "q" 'quit-window)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
543 (define-key map "\^P" 'tar-previous-line)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
544 (define-key map [up] 'tar-previous-line)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
545 (define-key map "R" 'tar-rename-entry)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
546 (define-key map "u" 'tar-unflag)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
547 (define-key map "v" 'tar-view)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
548 (define-key map "x" 'tar-expunge)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
549 (define-key map "\177" 'tar-unflag-backwards)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
550 (define-key map "E" 'tar-extract-other-window)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
551 (define-key map "M" 'tar-chmod-entry)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
552 (define-key map "G" 'tar-chgrp-entry)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
553 (define-key map "O" 'tar-chown-entry)
93612
0cdd5c9c63c2 (tar-mode-map): Obey mouse-1-click-follows-link.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 91801
diff changeset
554 ;; Let mouse-1 follow the link.
0cdd5c9c63c2 (tar-mode-map): Obey mouse-1-click-follows-link.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 91801
diff changeset
555 (define-key map [follow-link] 'mouse-face)
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
556
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
557 ;; Make menu bar items.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
558
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
559 ;; Get rid of the Edit menu bar item to save space.
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
560 (define-key map [menu-bar edit] 'undefined)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
561
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
562 (define-key map [menu-bar immediate]
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
563 (cons "Immediate" (make-sparse-keymap "Immediate")))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
564
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
565 (define-key map [menu-bar immediate view]
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
566 '("View This File" . tar-view))
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
567 (define-key map [menu-bar immediate display]
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
568 '("Display in Other Window" . tar-display-other-window))
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
569 (define-key map [menu-bar immediate find-file-other-window]
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
570 '("Find in Other Window" . tar-extract-other-window))
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
571 (define-key map [menu-bar immediate find-file]
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
572 '("Find This File" . tar-extract))
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
573
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
574 (define-key map [menu-bar mark]
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
575 (cons "Mark" (make-sparse-keymap "Mark")))
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
576
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
577 (define-key map [menu-bar mark unmark-all]
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
578 '("Unmark All" . tar-clear-modification-flags))
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
579 (define-key map [menu-bar mark deletion]
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
580 '("Flag" . tar-flag-deleted))
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
581 (define-key map [menu-bar mark unmark]
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
582 '("Unflag" . tar-unflag))
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
583
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
584 (define-key map [menu-bar operate]
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
585 (cons "Operate" (make-sparse-keymap "Operate")))
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
586
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
587 (define-key map [menu-bar operate chown]
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
588 '("Change Owner..." . tar-chown-entry))
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
589 (define-key map [menu-bar operate chgrp]
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
590 '("Change Group..." . tar-chgrp-entry))
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
591 (define-key map [menu-bar operate chmod]
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
592 '("Change Mode..." . tar-chmod-entry))
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
593 (define-key map [menu-bar operate rename]
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
594 '("Rename to..." . tar-rename-entry))
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
595 (define-key map [menu-bar operate copy]
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
596 '("Copy to..." . tar-copy))
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
597 (define-key map [menu-bar operate expunge]
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
598 '("Expunge Marked Files" . tar-expunge))
91801
8e06d480f634 Fix broken indentation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 91367
diff changeset
599
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
600 map)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
601 "Local keymap for Tar mode listings.")
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
602
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
603
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
604 ;; tar mode is suitable only for specially formatted data.
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
605 (put 'tar-mode 'mode-class 'special)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
606 (put 'tar-subfile-mode 'mode-class 'special)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
607
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
608 (defun tar-change-major-mode-hook ()
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
609 ;; Bring the actual Tar data back into the main buffer.
100698
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
610 (when (tar-data-swapped-p) (tar-swap-data))
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
611 ;; Throw away the summary.
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
612 (when (buffer-live-p tar-data-buffer) (kill-buffer tar-data-buffer)))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
613
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
614 (defun tar-mode-kill-buffer-hook ()
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
615 (if (buffer-live-p tar-data-buffer) (kill-buffer tar-data-buffer)))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
616
3419
97205883b02d Typo in autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 3365
diff changeset
617 ;;;###autoload
41170
e4b5d4e63bd3 (tar-mode): Use define-derived-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39471
diff changeset
618 (define-derived-mode tar-mode nil "Tar"
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
619 "Major mode for viewing a tar file as a dired-like listing of its contents.
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47656
diff changeset
620 You can move around using the usual cursor motion commands.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
621 Letters no longer insert themselves.
6611
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
622 Type `e' to pull a file out of the tar file and into its own buffer;
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
623 or click mouse-2 on the file's line in the Tar mode buffer.
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
624 Type `c' to copy an entry from the tar file into another file on disk.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
625
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47656
diff changeset
626 If you edit a sub-file of this archive (as with the `e' command) and
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
627 save it with \\[save-buffer], the contents of that buffer will be
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47656
diff changeset
628 saved back into the tar-file buffer; in this way you can edit a file
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
629 inside of a tar archive without extracting it and re-archiving it.
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
630
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
631 See also: variables `tar-update-datestamp' and `tar-anal-blocksize'.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
632 \\{tar-mode-map}"
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
633 (make-local-variable 'tar-parse-info)
41170
e4b5d4e63bd3 (tar-mode): Use define-derived-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39471
diff changeset
634 (set (make-local-variable 'require-final-newline) nil) ; binary data, dude...
e4b5d4e63bd3 (tar-mode): Use define-derived-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39471
diff changeset
635 (set (make-local-variable 'local-enable-local-variables) nil)
e4b5d4e63bd3 (tar-mode): Use define-derived-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39471
diff changeset
636 (set (make-local-variable 'next-line-add-newlines) nil)
88955
1d1275f5d5b7 (tar-file-name-coding-system): New variable. Make
Kenichi Handa <handa@m17n.org>
parents: 43424
diff changeset
637 (set (make-local-variable 'tar-file-name-coding-system)
1d1275f5d5b7 (tar-file-name-coding-system): New variable. Make
Kenichi Handa <handa@m17n.org>
parents: 43424
diff changeset
638 (or file-name-coding-system
1d1275f5d5b7 (tar-file-name-coding-system): New variable. Make
Kenichi Handa <handa@m17n.org>
parents: 43424
diff changeset
639 default-file-name-coding-system
1d1275f5d5b7 (tar-file-name-coding-system): New variable. Make
Kenichi Handa <handa@m17n.org>
parents: 43424
diff changeset
640 locale-coding-system))
23482
43849bed4a16 (tar-mode): Locally set file-precious-flag.
Richard M. Stallman <rms@gnu.org>
parents: 23380
diff changeset
641 ;; Prevent loss of data when saving the file.
41170
e4b5d4e63bd3 (tar-mode): Use define-derived-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39471
diff changeset
642 (set (make-local-variable 'file-precious-flag) t)
60689
5a0fcfdcc95e (tar-mode): Turn off undo unconditionally.
Richard M. Stallman <rms@gnu.org>
parents: 59569
diff changeset
643 (buffer-disable-undo)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
644 (widen)
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
645 ;; Now move the Tar data into an auxiliary buffer, so we can use the main
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
646 ;; buffer for the summary.
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
647 (assert (not (tar-data-swapped-p)))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
648 (set (make-local-variable 'revert-buffer-function) 'tar-mode-revert)
100935
e55ce6002e3d (tar-mode, tar-mode-write-contents)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100908
diff changeset
649 ;; We started using write-contents-functions, but this hook is not
e55ce6002e3d (tar-mode, tar-mode-write-contents)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100908
diff changeset
650 ;; used during auto-save, so we now use
e55ce6002e3d (tar-mode, tar-mode-write-contents)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100908
diff changeset
651 ;; write-region-annotate-functions which hooks at a lower-level.
e55ce6002e3d (tar-mode, tar-mode-write-contents)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100908
diff changeset
652 (add-hook 'write-region-annotate-functions 'tar-write-region-annotate nil t)
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
653 (add-hook 'kill-buffer-hook 'tar-mode-kill-buffer-hook nil t)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
654 (add-hook 'change-major-mode-hook 'tar-change-major-mode-hook nil t)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
655 ;; Tar data is made of bytes, not chars.
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
656 (set-buffer-multibyte nil) ;Hopefully a no-op.
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
657 (set (make-local-variable 'tar-data-buffer)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
658 (generate-new-buffer (format " *tar-data %s*"
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
659 (file-name-nondirectory
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
660 (or buffer-file-name (buffer-name))))))
102525
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
661 (condition-case err
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
662 (progn
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
663 (tar-swap-data)
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
664 (tar-summarize-buffer)
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
665 (tar-next-line 0))
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
666 (error
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
667 ;; If summarizing caused an error, then maybe the buffer doesn't contain
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
668 ;; tar data. Rather than show a mysterious empty buffer, let's
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
669 ;; revert to fundamental-mode.
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
670 (fundamental-mode)
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
671 (signal (car err) (cdr err)))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
672
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
673
108220
0b37f86b040e Use define-minor-mode where applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107897
diff changeset
674 (define-minor-mode tar-subfile-mode
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
675 "Minor mode for editing an element of a tar-file.
14769
acf049402d18 (tar-subfile-mode): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14294
diff changeset
676 This mode arranges for \"saving\" this buffer to write the data
acf049402d18 (tar-subfile-mode): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14294
diff changeset
677 into the tar-file buffer that it came from. The changes will actually
acf049402d18 (tar-subfile-mode): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14294
diff changeset
678 appear on disk when you save the tar-file's buffer."
108220
0b37f86b040e Use define-minor-mode where applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107897
diff changeset
679 ;; Don't do this, because it is redundant and wastes mode line space.
0b37f86b040e Use define-minor-mode where applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107897
diff changeset
680 ;; :lighter " TarFile"
0b37f86b040e Use define-minor-mode where applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107897
diff changeset
681 nil nil nil
2542
ae4176e2e8fa Add defvars to pacify the byte compiler, at RMS's request.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 880
diff changeset
682 (or (and (boundp 'tar-superior-buffer) tar-superior-buffer)
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
683 (error "This buffer is not an element of a tar file"))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
684 (cond (tar-subfile-mode
46926
dd4d628efd2e (tar-subfile-mode): Use add-hook and remove-hook, and use
Richard M. Stallman <rms@gnu.org>
parents: 45348
diff changeset
685 (add-hook 'write-file-functions 'tar-subfile-save-buffer nil t)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
686 ;; turn off auto-save.
22032
e27e9e844efe (tar-subfile-mode): Call auto-save-mode with -1.
Dave Love <fx@gnu.org>
parents: 21851
diff changeset
687 (auto-save-mode -1)
108220
0b37f86b040e Use define-minor-mode where applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107897
diff changeset
688 (setq buffer-auto-save-file-name nil))
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
689 (t
46926
dd4d628efd2e (tar-subfile-mode): Use add-hook and remove-hook, and use
Richard M. Stallman <rms@gnu.org>
parents: 45348
diff changeset
690 (remove-hook 'write-file-functions 'tar-subfile-save-buffer t))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
691
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
692
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
693 ;; Revert the buffer and recompute the dired-like listing.
23380
0088626fec1c (tar-mode-revert): no-auto-save arg renamed from no-autosave.
Karl Heuer <kwzh@gnu.org>
parents: 22810
diff changeset
694 (defun tar-mode-revert (&optional no-auto-save no-confirm)
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
695 (unwind-protect
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
696 (let ((revert-buffer-function nil))
100698
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
697 (if (tar-data-swapped-p) (tar-swap-data))
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
698 ;; FIXME: If we ask for confirmation, the user will be temporarily
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
699 ;; looking at the raw data.
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
700 (revert-buffer no-auto-save no-confirm 'preserve-modes)
100698
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
701 ;; Recompute the summary.
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
702 (if (buffer-live-p tar-data-buffer) (kill-buffer tar-data-buffer))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
703 (tar-mode))
100698
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
704 (unless (tar-data-swapped-p) (tar-swap-data))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
705
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
706
43424
444fb6708a66 (tar-next-line, tar-previous-line): Add doc string,
Pavel Janík <Pavel@Janik.cz>
parents: 41170
diff changeset
707 (defun tar-next-line (arg)
444fb6708a66 (tar-next-line, tar-previous-line): Add doc string,
Pavel Janík <Pavel@Janik.cz>
parents: 41170
diff changeset
708 "Move cursor vertically down ARG lines and to the start of the filename."
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
709 (interactive "p")
43424
444fb6708a66 (tar-next-line, tar-previous-line): Add doc string,
Pavel Janík <Pavel@Janik.cz>
parents: 41170
diff changeset
710 (forward-line arg)
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
711 (goto-char (or (next-single-property-change (point) 'mouse-face) (point))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
712
43424
444fb6708a66 (tar-next-line, tar-previous-line): Add doc string,
Pavel Janík <Pavel@Janik.cz>
parents: 41170
diff changeset
713 (defun tar-previous-line (arg)
444fb6708a66 (tar-next-line, tar-previous-line): Add doc string,
Pavel Janík <Pavel@Janik.cz>
parents: 41170
diff changeset
714 "Move cursor vertically up ARG lines and to the start of the filename."
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
715 (interactive "p")
43424
444fb6708a66 (tar-next-line, tar-previous-line): Add doc string,
Pavel Janík <Pavel@Janik.cz>
parents: 41170
diff changeset
716 (tar-next-line (- arg)))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
717
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
718 (defun tar-current-descriptor (&optional noerror)
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
719 "Return the tar-descriptor of the current line, or signals an error."
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
720 ;; I wish lines had plists, like in ZMACS...
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
721 (or (nth (count-lines (point-min) (line-beginning-position))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
722 tar-parse-info)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
723 (if noerror
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
724 nil
6611
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
725 (error "This line does not describe a tar-file entry"))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
726
6611
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
727 (defun tar-get-descriptor ()
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
728 (let* ((descriptor (tar-current-descriptor))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
729 (size (tar-header-size descriptor))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
730 (link-p (tar-header-link-type descriptor)))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
731 (if link-p
77925
3da77a559100 (tar-header-block-summarize, tar-summarize-buffer)
Chong Yidong <cyd@stupidchicken.com>
parents: 77788
diff changeset
732 (error "This is %s, not a real file"
3da77a559100 (tar-header-block-summarize, tar-summarize-buffer)
Chong Yidong <cyd@stupidchicken.com>
parents: 77788
diff changeset
733 (cond ((eq link-p 5) "a directory")
3da77a559100 (tar-header-block-summarize, tar-summarize-buffer)
Chong Yidong <cyd@stupidchicken.com>
parents: 77788
diff changeset
734 ((eq link-p 20) "a tar directory header")
3da77a559100 (tar-header-block-summarize, tar-summarize-buffer)
Chong Yidong <cyd@stupidchicken.com>
parents: 77788
diff changeset
735 ((eq link-p 28) "a next has longname")
3da77a559100 (tar-header-block-summarize, tar-summarize-buffer)
Chong Yidong <cyd@stupidchicken.com>
parents: 77788
diff changeset
736 ((eq link-p 29) "a multivolume-continuation")
3da77a559100 (tar-header-block-summarize, tar-summarize-buffer)
Chong Yidong <cyd@stupidchicken.com>
parents: 77788
diff changeset
737 ((eq link-p 35) "a sparse entry")
3da77a559100 (tar-header-block-summarize, tar-summarize-buffer)
Chong Yidong <cyd@stupidchicken.com>
parents: 77788
diff changeset
738 ((eq link-p 38) "a volume header")
3da77a559100 (tar-header-block-summarize, tar-summarize-buffer)
Chong Yidong <cyd@stupidchicken.com>
parents: 77788
diff changeset
739 ((eq link-p 55) "an extended pax header")
3da77a559100 (tar-header-block-summarize, tar-summarize-buffer)
Chong Yidong <cyd@stupidchicken.com>
parents: 77788
diff changeset
740 (t "a link"))))
78128
aec26e5eba68 (tar-get-descriptor): No error for zero-length file.
Richard M. Stallman <rms@gnu.org>
parents: 77925
diff changeset
741 (if (zerop size) (message "This is a zero-length file"))
6611
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
742 descriptor))
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
743
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
744 (defun tar-mouse-extract (event)
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
745 "Extract a file whose tar directory line you click on."
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
746 (interactive "e")
91801
8e06d480f634 Fix broken indentation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 91367
diff changeset
747 (with-current-buffer (window-buffer (posn-window (event-end event)))
6611
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
748 (save-excursion
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
749 (goto-char (posn-point (event-end event)))
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
750 ;; Just make sure this doesn't get an error.
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
751 (tar-get-descriptor)))
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
752 (select-window (posn-window (event-end event)))
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
753 (goto-char (posn-point (event-end event)))
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
754 (tar-extract))
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
755
77788
b5a6f9693d00 (tar-file-name-handler): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 75347
diff changeset
756 (defun tar-file-name-handler (op &rest args)
b5a6f9693d00 (tar-file-name-handler): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 75347
diff changeset
757 "Helper function for `tar-extract'."
b5a6f9693d00 (tar-file-name-handler): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 75347
diff changeset
758 (or (eq op 'file-exists-p)
b5a6f9693d00 (tar-file-name-handler): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 75347
diff changeset
759 (let ((file-name-handler-alist nil))
b5a6f9693d00 (tar-file-name-handler): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 75347
diff changeset
760 (apply op args))))
b5a6f9693d00 (tar-file-name-handler): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 75347
diff changeset
761
6611
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
762 (defun tar-extract (&optional other-window-p)
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
763 "In Tar mode, extract this entry of the tar file into its own buffer."
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
764 (interactive)
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
765 (let* ((view-p (eq other-window-p 'view))
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
766 (descriptor (tar-get-descriptor))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
767 (name (tar-header-name descriptor))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
768 (size (tar-header-size descriptor))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
769 (start (tar-header-data-start descriptor))
6611
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
770 (end (+ start size)))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
771 (let* ((tar-buffer (current-buffer))
34495
390a9f3dd80c (tar-extract): Base the name of the subfile buffer
Andreas Schwab <schwab@suse.de>
parents: 29646
diff changeset
772 (tarname (buffer-name))
38719
03376ff9ccfd (tar-extract): Avoid generating a new buffer
Gerd Moellmann <gerd@gnu.org>
parents: 38081
diff changeset
773 (bufname (concat (file-name-nondirectory name)
03376ff9ccfd (tar-extract): Avoid generating a new buffer
Gerd Moellmann <gerd@gnu.org>
parents: 38081
diff changeset
774 " ("
38053
3e512ad7ce98 (tar-extract): Call generate-new-buffer-name to
Eli Zaretskii <eliz@gnu.org>
parents: 37634
diff changeset
775 tarname
38719
03376ff9ccfd (tar-extract): Avoid generating a new buffer
Gerd Moellmann <gerd@gnu.org>
parents: 38081
diff changeset
776 ")"))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
777 (read-only-p (or buffer-read-only view-p))
34495
390a9f3dd80c (tar-extract): Base the name of the subfile buffer
Andreas Schwab <schwab@suse.de>
parents: 29646
diff changeset
778 (new-buffer-file-name (expand-file-name
390a9f3dd80c (tar-extract): Base the name of the subfile buffer
Andreas Schwab <schwab@suse.de>
parents: 29646
diff changeset
779 ;; `:' is not allowed on Windows
102525
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
780 (concat tarname "!"
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
781 (if (string-match "/" name)
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
782 name
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
783 ;; Make sure `name' contains a /
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
784 ;; so set-auto-mode doesn't try
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
785 ;; to look at `tarname' for hints.
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
786 (concat "./" name)))))
38719
03376ff9ccfd (tar-extract): Avoid generating a new buffer
Gerd Moellmann <gerd@gnu.org>
parents: 38081
diff changeset
787 (buffer (get-file-buffer new-buffer-file-name))
88955
1d1275f5d5b7 (tar-file-name-coding-system): New variable. Make
Kenichi Handa <handa@m17n.org>
parents: 43424
diff changeset
788 (just-created nil)
90073
f02550ff43d0 (tar-extract): Adjust code merged from trunk for
Kenichi Handa <handa@m17n.org>
parents: 90043
diff changeset
789 undo-list)
38719
03376ff9ccfd (tar-extract): Avoid generating a new buffer
Gerd Moellmann <gerd@gnu.org>
parents: 38081
diff changeset
790 (unless buffer
34495
390a9f3dd80c (tar-extract): Base the name of the subfile buffer
Andreas Schwab <schwab@suse.de>
parents: 29646
diff changeset
791 (setq buffer (generate-new-buffer bufname))
91801
8e06d480f634 Fix broken indentation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 91367
diff changeset
792 (with-current-buffer buffer
90073
f02550ff43d0 (tar-extract): Adjust code merged from trunk for
Kenichi Handa <handa@m17n.org>
parents: 90043
diff changeset
793 (setq undo-list buffer-undo-list
f02550ff43d0 (tar-extract): Adjust code merged from trunk for
Kenichi Handa <handa@m17n.org>
parents: 90043
diff changeset
794 buffer-undo-list t))
34495
390a9f3dd80c (tar-extract): Base the name of the subfile buffer
Andreas Schwab <schwab@suse.de>
parents: 29646
diff changeset
795 (setq bufname (buffer-name buffer))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
796 (setq just-created t)
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
797 (with-current-buffer tar-data-buffer
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
798 (let (coding)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
799 (narrow-to-region start end)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
800 (goto-char start)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
801 (setq coding (or coding-system-for-read
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
802 (and set-auto-coding-function
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
803 (funcall set-auto-coding-function
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
804 name (- end start)))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
805 ;; The following binding causes
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
806 ;; find-buffer-file-type-coding-system
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
807 ;; (defined on dos-w32.el) to act as if
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
808 ;; the file being extracted existed, so
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
809 ;; that the file's contents' encoding and
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
810 ;; EOL format are auto-detected.
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
811 (let ((file-name-handler-alist
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
812 '(("" . tar-file-name-handler))))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
813 (car (find-operation-coding-system
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
814 'insert-file-contents
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
815 (cons name (current-buffer)) t)))))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
816 (if (or (not coding)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
817 (eq (coding-system-type coding) 'undecided))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
818 (setq coding (detect-coding-region start end t)))
104823
68150c643e2e Use default-value rather than default-enable-multibyte-characters.
Glenn Morris <rgm@gnu.org>
parents: 103321
diff changeset
819 (if (and (default-value 'enable-multibyte-characters)
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
820 (coding-system-get coding :for-unibyte))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
821 (with-current-buffer buffer
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
822 (set-buffer-multibyte nil)))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
823 (widen)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
824 (decode-coding-region start end coding buffer)))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
825 (with-current-buffer buffer
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
826 (goto-char (point-min))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
827 (setq buffer-file-name new-buffer-file-name)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
828 (setq buffer-file-truename
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
829 (abbreviate-file-name buffer-file-name))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
830 ;; Force buffer-file-coding-system to what
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
831 ;; decode-coding-region actually used.
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
832 (set-buffer-file-coding-system last-coding-system-used t)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
833 ;; Set the default-directory to the dir of the
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
834 ;; superior buffer.
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
835 (setq default-directory
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
836 (with-current-buffer tar-buffer
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
837 default-directory))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
838 (rename-buffer bufname)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
839 (set-buffer-modified-p nil)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
840 (setq buffer-undo-list undo-list)
102546
f4adb8b6af6c (tar-extract): Setup the buffer's name, undo-list, and
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 102525
diff changeset
841 (normal-mode) ; pick a mode.
f4adb8b6af6c (tar-extract): Setup the buffer's name, undo-list, and
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 102525
diff changeset
842 (set (make-local-variable 'tar-superior-buffer) tar-buffer)
f4adb8b6af6c (tar-extract): Setup the buffer's name, undo-list, and
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 102525
diff changeset
843 (set (make-local-variable 'tar-superior-descriptor) descriptor)
f4adb8b6af6c (tar-extract): Setup the buffer's name, undo-list, and
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 102525
diff changeset
844 (setq buffer-read-only read-only-p)
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
845 (tar-subfile-mode 1)))
107897
1721e4658521 Test for special mode-class in view-buffer instead of view-file (bug#5513).
Juri Linkov <juri@jurta.org>
parents: 106815
diff changeset
846 (cond
1721e4658521 Test for special mode-class in view-buffer instead of view-file (bug#5513).
Juri Linkov <juri@jurta.org>
parents: 106815
diff changeset
847 (view-p
1721e4658521 Test for special mode-class in view-buffer instead of view-file (bug#5513).
Juri Linkov <juri@jurta.org>
parents: 106815
diff changeset
848 (view-buffer buffer (and just-created 'kill-buffer-if-not-modified)))
1721e4658521 Test for special mode-class in view-buffer instead of view-file (bug#5513).
Juri Linkov <juri@jurta.org>
parents: 106815
diff changeset
849 ((eq other-window-p 'display) (display-buffer buffer))
1721e4658521 Test for special mode-class in view-buffer instead of view-file (bug#5513).
Juri Linkov <juri@jurta.org>
parents: 106815
diff changeset
850 (other-window-p (switch-to-buffer-other-window buffer))
1721e4658521 Test for special mode-class in view-buffer instead of view-file (bug#5513).
Juri Linkov <juri@jurta.org>
parents: 106815
diff changeset
851 (t (switch-to-buffer buffer))))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
852
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
853
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
854 (defun tar-extract-other-window ()
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
855 "In Tar mode, find this entry of the tar file in another window."
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
856 (interactive)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
857 (tar-extract t))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
858
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
859 (defun tar-display-other-window ()
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
860 "In Tar mode, display this entry of the tar file in another window."
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
861 (interactive)
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
862 (tar-extract 'display))
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
863
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
864 (defun tar-view ()
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
865 "In Tar mode, view the tar file entry on this line."
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
866 (interactive)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
867 (tar-extract 'view))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
868
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
869
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
870 (defun tar-read-file-name (&optional prompt)
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
871 "Read a file name with this line's entry as the default."
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
872 (or prompt (setq prompt "Copy to: "))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
873 (let* ((default-file (expand-file-name
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
874 (tar-header-name (tar-current-descriptor))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
875 (target (expand-file-name
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
876 (read-file-name prompt
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
877 (file-name-directory default-file)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
878 default-file nil))))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
879 (if (or (string= "" (file-name-nondirectory target))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
880 (file-directory-p target))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
881 (setq target (concat (if (string-match "/$" target)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
882 (substring target 0 (1- (match-end 0)))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
883 target)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
884 "/"
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
885 (file-name-nondirectory default-file))))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
886 target))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
887
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
888
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
889 (defun tar-copy (&optional to-file)
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
890 "In Tar mode, extract this entry of the tar file into a file on disk.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
891 If TO-FILE is not supplied, it is prompted for, defaulting to the name of
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
892 the current tar-entry."
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
893 (interactive (list (tar-read-file-name)))
6611
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
894 (let* ((descriptor (tar-get-descriptor))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
895 (name (tar-header-name descriptor))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
896 (size (tar-header-size descriptor))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
897 (start (tar-header-data-start descriptor))
12662
07ba0f6e9ada (tar-copy): Inhibit use of jka-compr handler
Richard M. Stallman <rms@gnu.org>
parents: 12027
diff changeset
898 (end (+ start size))
07ba0f6e9ada (tar-copy): Inhibit use of jka-compr handler
Richard M. Stallman <rms@gnu.org>
parents: 12027
diff changeset
899 (inhibit-file-name-handlers inhibit-file-name-handlers)
07ba0f6e9ada (tar-copy): Inhibit use of jka-compr handler
Richard M. Stallman <rms@gnu.org>
parents: 12027
diff changeset
900 (inhibit-file-name-operation inhibit-file-name-operation))
105889
f47d28b0dece * tar-mode.el (tar-copy): Call write-region on the right buffer
Chong Yidong <cyd@stupidchicken.com>
parents: 105653
diff changeset
901 (with-current-buffer
f47d28b0dece * tar-mode.el (tar-copy): Call write-region on the right buffer
Chong Yidong <cyd@stupidchicken.com>
parents: 105653
diff changeset
902 (if (tar-data-swapped-p) tar-data-buffer (current-buffer))
12662
07ba0f6e9ada (tar-copy): Inhibit use of jka-compr handler
Richard M. Stallman <rms@gnu.org>
parents: 12027
diff changeset
903 ;; Inhibit compressing a subfile again if *both* name and
07ba0f6e9ada (tar-copy): Inhibit use of jka-compr handler
Richard M. Stallman <rms@gnu.org>
parents: 12027
diff changeset
904 ;; to-file are handled by jka-compr
105889
f47d28b0dece * tar-mode.el (tar-copy): Call write-region on the right buffer
Chong Yidong <cyd@stupidchicken.com>
parents: 105653
diff changeset
905 (if (and (eq (find-file-name-handler name 'write-region)
f47d28b0dece * tar-mode.el (tar-copy): Call write-region on the right buffer
Chong Yidong <cyd@stupidchicken.com>
parents: 105653
diff changeset
906 'jka-compr-handler)
f47d28b0dece * tar-mode.el (tar-copy): Call write-region on the right buffer
Chong Yidong <cyd@stupidchicken.com>
parents: 105653
diff changeset
907 (eq (find-file-name-handler to-file 'write-region)
f47d28b0dece * tar-mode.el (tar-copy): Call write-region on the right buffer
Chong Yidong <cyd@stupidchicken.com>
parents: 105653
diff changeset
908 'jka-compr-handler))
12662
07ba0f6e9ada (tar-copy): Inhibit use of jka-compr handler
Richard M. Stallman <rms@gnu.org>
parents: 12027
diff changeset
909 (setq inhibit-file-name-handlers
07ba0f6e9ada (tar-copy): Inhibit use of jka-compr handler
Richard M. Stallman <rms@gnu.org>
parents: 12027
diff changeset
910 (cons 'jka-compr-handler
07ba0f6e9ada (tar-copy): Inhibit use of jka-compr handler
Richard M. Stallman <rms@gnu.org>
parents: 12027
diff changeset
911 (and (eq inhibit-file-name-operation 'write-region)
07ba0f6e9ada (tar-copy): Inhibit use of jka-compr handler
Richard M. Stallman <rms@gnu.org>
parents: 12027
diff changeset
912 inhibit-file-name-handlers))
07ba0f6e9ada (tar-copy): Inhibit use of jka-compr handler
Richard M. Stallman <rms@gnu.org>
parents: 12027
diff changeset
913 inhibit-file-name-operation 'write-region))
88955
1d1275f5d5b7 (tar-file-name-coding-system): New variable. Make
Kenichi Handa <handa@m17n.org>
parents: 43424
diff changeset
914 (let ((coding-system-for-write 'no-conversion))
1d1275f5d5b7 (tar-file-name-coding-system): New variable. Make
Kenichi Handa <handa@m17n.org>
parents: 43424
diff changeset
915 (write-region start end to-file nil nil nil t)))
7090
cf0b24d47cdd (tar-copy): Don't bother with a temp buffer.
Karl Heuer <kwzh@gnu.org>
parents: 7078
diff changeset
916 (message "Copied tar entry %s to %s" name to-file)))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
917
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
918 (defun tar-flag-deleted (p &optional unflag)
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
919 "In Tar mode, mark this sub-file to be deleted from the tar file.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
920 With a prefix argument, mark that many files."
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
921 (interactive "p")
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
922 (beginning-of-line)
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
923 (dotimes (i (abs p))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
924 (if (tar-current-descriptor unflag) ; barf if we're not on an entry-line.
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
925 (progn
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
926 (delete-char 1)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
927 (insert (if unflag " " "D"))))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
928 (forward-line (if (< p 0) -1 1)))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
929 (if (eobp) nil (forward-char 36)))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
930
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
931 (defun tar-unflag (p)
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
932 "In Tar mode, un-mark this sub-file if it is marked to be deleted.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
933 With a prefix argument, un-mark that many files forward."
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
934 (interactive "p")
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
935 (tar-flag-deleted p t))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
936
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
937 (defun tar-unflag-backwards (p)
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
938 "In Tar mode, un-mark this sub-file if it is marked to be deleted.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
939 With a prefix argument, un-mark that many files backward."
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
940 (interactive "p")
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
941 (tar-flag-deleted (- p) t))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
942
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
943
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
944 (defun tar-expunge-internal ()
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
945 "Expunge the tar-entry specified by the current line."
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
946 (let ((descriptor (tar-current-descriptor)))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
947 ;;
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
948 ;; delete the current line...
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
949 (delete-region (line-beginning-position) (line-beginning-position 2))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
950 ;;
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
951 ;; delete the data pointer...
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
952 (setq tar-parse-info (delq descriptor tar-parse-info))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
953 ;;
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
954 ;; delete the data from inside the file...
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
955 (with-current-buffer tar-data-buffer
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
956 (delete-region (or (tar-header-header-start descriptor)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
957 (- (tar-header-data-start descriptor) 512))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
958 (tar-header-data-end descriptor)))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
959
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
960
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
961 (defun tar-expunge (&optional noconfirm)
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
962 "In Tar mode, delete all the archived files flagged for deletion.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
963 This does not modify the disk image; you must save the tar file itself
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
964 for this to be permanent."
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
965 (interactive)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
966 (if (or noconfirm
11450
aee30032f324 (tar-mode): Locally bind next-line-add-newlines to nil.
Richard M. Stallman <rms@gnu.org>
parents: 11431
diff changeset
967 (y-or-n-p "Expunge files marked for deletion? "))
88955
1d1275f5d5b7 (tar-file-name-coding-system): New variable. Make
Kenichi Handa <handa@m17n.org>
parents: 43424
diff changeset
968 (let ((n 0))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
969 (save-excursion
29646
e57c6c814e3f (tar-extract): For goto-char, use (point-min), not
Kenichi Handa <handa@m17n.org>
parents: 29534
diff changeset
970 (goto-char (point-min))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
971 (while (not (eobp))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
972 (if (looking-at "D")
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
973 (progn (tar-expunge-internal)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
974 (setq n (1+ n)))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
975 (forward-line 1)))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
976 ;; after doing the deletions, add any padding that may be necessary.
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
977 (tar-pad-to-blocksize))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
978 (if (zerop n)
11450
aee30032f324 (tar-mode): Locally bind next-line-add-newlines to nil.
Richard M. Stallman <rms@gnu.org>
parents: 11431
diff changeset
979 (message "Nothing to expunge.")
aee30032f324 (tar-mode): Locally bind next-line-add-newlines to nil.
Richard M. Stallman <rms@gnu.org>
parents: 11431
diff changeset
980 (message "%s files expunged. Be sure to save this buffer." n)))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
981
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
982
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
983 (defun tar-clear-modification-flags ()
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
984 "Remove the stars at the beginning of each line."
11301
1234d00b8492 (tar-clear-modification-flags): Fix several bugs.
Richard M. Stallman <rms@gnu.org>
parents: 11210
diff changeset
985 (interactive)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
986 (save-excursion
29646
e57c6c814e3f (tar-extract): For goto-char, use (point-min), not
Kenichi Handa <handa@m17n.org>
parents: 29534
diff changeset
987 (goto-char (point-min))
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
988 (while (not (eobp))
74243
b5548562a340 (tar-header-block-summarize, tar-clear-modification-flags): "?\ " -> "?\s".
Juanma Barranquero <lekktu@gmail.com>
parents: 70945
diff changeset
989 (if (not (eq (following-char) ?\s))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
990 (progn (delete-char 1) (insert " ")))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
991 (forward-line 1))))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
992
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
993
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
994 (defun tar-chown-entry (new-uid)
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
995 "Change the user-id associated with this entry in the tar file.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
996 If this tar file was written by GNU tar, then you will be able to edit
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
997 the user id as a string; otherwise, you must edit it as a number.
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
998 You can force editing as a number by calling this with a prefix arg.
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
999 This does not modify the disk image; you must save the tar file itself
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1000 for this to be permanent."
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1001 (interactive
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1002 (list
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1003 (let ((descriptor (tar-current-descriptor)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1004 (if (or current-prefix-arg
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1005 (not (tar-header-magic descriptor)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1006 (read-number
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1007 "New UID number: "
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1008 (format "%s" (tar-header-uid descriptor)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1009 (read-string "New UID string: " (tar-header-uname descriptor))))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1010 (cond ((stringp new-uid)
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1011 (setf (tar-header-uname (tar-current-descriptor)) new-uid)
105653
8177db6744a6 (tar-data-swapped-p): Make the assertion a bit more
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 104823
diff changeset
1012 (tar-alter-one-field tar-uname-offset
8177db6744a6 (tar-data-swapped-p): Make the assertion a bit more
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 104823
diff changeset
1013 (concat (encode-coding-string
8177db6744a6 (tar-data-swapped-p): Make the assertion a bit more
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 104823
diff changeset
1014 new-uid tar-file-name-coding-system)
8177db6744a6 (tar-data-swapped-p): Make the assertion a bit more
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 104823
diff changeset
1015 "\000")))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1016 (t
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1017 (setf (tar-header-uid (tar-current-descriptor)) new-uid)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1018 (tar-alter-one-field tar-uid-offset
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1019 (concat (substring (format "%6o" new-uid) 0 6) "\000 ")))))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1020
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1021
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1022 (defun tar-chgrp-entry (new-gid)
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
1023 "Change the group-id associated with this entry in the tar file.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1024 If this tar file was written by GNU tar, then you will be able to edit
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1025 the group id as a string; otherwise, you must edit it as a number.
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1026 You can force editing as a number by calling this with a prefix arg.
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1027 This does not modify the disk image; you must save the tar file itself
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1028 for this to be permanent."
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1029 (interactive
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1030 (list
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1031 (let ((descriptor (tar-current-descriptor)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1032 (if (or current-prefix-arg
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1033 (not (tar-header-magic descriptor)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1034 (read-number
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1035 "New GID number: "
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1036 (format "%s" (tar-header-gid descriptor)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1037 (read-string "New GID string: " (tar-header-gname descriptor))))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1038 (cond ((stringp new-gid)
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1039 (setf (tar-header-gname (tar-current-descriptor)) new-gid)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1040 (tar-alter-one-field tar-gname-offset
105653
8177db6744a6 (tar-data-swapped-p): Make the assertion a bit more
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 104823
diff changeset
1041 (concat (encode-coding-string
8177db6744a6 (tar-data-swapped-p): Make the assertion a bit more
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 104823
diff changeset
1042 new-gid tar-file-name-coding-system)
8177db6744a6 (tar-data-swapped-p): Make the assertion a bit more
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 104823
diff changeset
1043 "\000")))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1044 (t
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1045 (setf (tar-header-gid (tar-current-descriptor)) new-gid)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1046 (tar-alter-one-field tar-gid-offset
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1047 (concat (substring (format "%6o" new-gid) 0 6) "\000 ")))))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1048
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1049 (defun tar-rename-entry (new-name)
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
1050 "Change the name associated with this entry in the tar file.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1051 This does not modify the disk image; you must save the tar file itself
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1052 for this to be permanent."
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1053 (interactive
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1054 (list (read-string "New name: "
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1055 (tar-header-name (tar-current-descriptor)))))
6611
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
1056 (if (string= "" new-name) (error "zero length name"))
88955
1d1275f5d5b7 (tar-file-name-coding-system): New variable. Make
Kenichi Handa <handa@m17n.org>
parents: 43424
diff changeset
1057 (let ((encoded-new-name (encode-coding-string new-name
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1058 tar-file-name-coding-system))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1059 (descriptor (tar-current-descriptor))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1060 (prefix nil))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1061 (when (tar-header-header-start descriptor)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1062 ;; FIXME: Make it work for ././@LongLink.
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1063 (error "Rename with @LongLink format is not implemented"))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1064
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1065 (when (and (> (length encoded-new-name) 98)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1066 (string-match "/" encoded-new-name
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1067 (- (length encoded-new-name) 99))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1068 (< (match-beginning 0) 155))
101220
be5a7a68d09d (tar-rename-entry): Only test the magic string, without
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101136
diff changeset
1069 (unless (equal (tar-header-magic descriptor) "ustar\0")
be5a7a68d09d (tar-rename-entry): Only test the magic string, without
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101136
diff changeset
1070 (tar-alter-one-field tar-magic-offset (concat "ustar\0" "00")))
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1071 (setq prefix (substring encoded-new-name 0 (match-beginning 0)))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1072 (setq encoded-new-name (substring encoded-new-name (match-end 0))))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1073
88955
1d1275f5d5b7 (tar-file-name-coding-system): New variable. Make
Kenichi Handa <handa@m17n.org>
parents: 43424
diff changeset
1074 (if (> (length encoded-new-name) 98) (error "name too long"))
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1075 (setf (tar-header-name descriptor) new-name)
88955
1d1275f5d5b7 (tar-file-name-coding-system): New variable. Make
Kenichi Handa <handa@m17n.org>
parents: 43424
diff changeset
1076 (tar-alter-one-field 0
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1077 (substring (concat encoded-new-name (make-string 99 0)) 0 99))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1078 (if prefix
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1079 (tar-alter-one-field tar-prefix-offset
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1080 (substring (concat prefix (make-string 155 0)) 0 155)))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1081
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1082
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1083 (defun tar-chmod-entry (new-mode)
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
1084 "Change the protection bits associated with this entry in the tar file.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1085 This does not modify the disk image; you must save the tar file itself
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1086 for this to be permanent."
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1087 (interactive (list (tar-parse-octal-integer-safe
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1088 (read-string "New protection (octal): "))))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1089 (setf (tar-header-mode (tar-current-descriptor)) new-mode)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1090 (tar-alter-one-field tar-mode-offset
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1091 (concat (substring (format "%6o" new-mode) 0 6) "\000 ")))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1092
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1093
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1094 (defun tar-alter-one-field (data-position new-data-string &optional descriptor)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1095 (unless descriptor (setq descriptor (tar-current-descriptor)))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1096 ;;
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1097 ;; update the header-line.
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1098 (let ((col (current-column)))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1099 (delete-region (line-beginning-position)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1100 (prog2 (forward-line 1)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1101 (point)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1102 ;; Insert the new text after the old, before deleting,
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1103 ;; to preserve markers such as the window start.
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1104 (insert (tar-header-block-summarize descriptor) "\n")))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1105 (forward-line -1) (move-to-column col))
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47656
diff changeset
1106
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1107 (assert (tar-data-swapped-p))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1108 (with-current-buffer tar-data-buffer
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1109 (let* ((start (- (tar-header-data-start descriptor) 512)))
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1110 ;;
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1111 ;; delete the old field and insert a new one.
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1112 (goto-char (+ start data-position))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1113 (delete-region (point) (+ (point) (length new-data-string))) ; <--
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1114 (assert (not (or enable-multibyte-characters
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1115 (multibyte-string-p new-data-string))))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1116 (insert new-data-string)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1117 ;;
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1118 ;; compute a new checksum and insert it.
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1119 (let ((chk (tar-header-block-checksum
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1120 (buffer-substring start (+ start 512)))))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1121 (goto-char (+ start tar-chk-offset))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1122 (delete-region (point) (+ (point) 8))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1123 (insert (format "%6o\0 " chk))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1124 (setf (tar-header-checksum descriptor) chk)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1125 ;;
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1126 ;; ok, make sure we didn't botch it.
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1127 (tar-header-block-check-checksum
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1128 (buffer-substring start (+ start 512))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1129 chk (tar-header-name descriptor))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1130 ))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1131
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1132
880
52a05f4884a4 entered into RCS
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 840
diff changeset
1133 (defun tar-octal-time (timeval)
52a05f4884a4 entered into RCS
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 840
diff changeset
1134 ;; Format a timestamp as 11 octal digits. Ghod, I hope this works...
52a05f4884a4 entered into RCS
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 840
diff changeset
1135 (let ((hibits (car timeval)) (lobits (car (cdr timeval))))
45348
eed727396dd0 (tar-octal-time): Fix last change.
Eli Zaretskii <eliz@gnu.org>
parents: 45329
diff changeset
1136 (format "%05o%01o%05o"
eed727396dd0 (tar-octal-time): Fix last change.
Eli Zaretskii <eliz@gnu.org>
parents: 45329
diff changeset
1137 (lsh hibits -2)
eed727396dd0 (tar-octal-time): Fix last change.
Eli Zaretskii <eliz@gnu.org>
parents: 45329
diff changeset
1138 (logior (lsh (logand 3 hibits) 1)
eed727396dd0 (tar-octal-time): Fix last change.
Eli Zaretskii <eliz@gnu.org>
parents: 45329
diff changeset
1139 (if (> (logand lobits 32768) 0) 1 0))
eed727396dd0 (tar-octal-time): Fix last change.
Eli Zaretskii <eliz@gnu.org>
parents: 45329
diff changeset
1140 (logand 32767 lobits)
eed727396dd0 (tar-octal-time): Fix last change.
Eli Zaretskii <eliz@gnu.org>
parents: 45329
diff changeset
1141 )))
880
52a05f4884a4 entered into RCS
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 840
diff changeset
1142
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1143 (defun tar-subfile-save-buffer ()
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
1144 "In tar subfile mode, save this buffer into its parent tar-file buffer.
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
1145 This doesn't write anything to disk; you must save the parent tar-file buffer
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1146 to make your changes permanent."
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1147 (interactive)
2542
ae4176e2e8fa Add defvars to pacify the byte compiler, at RMS's request.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 880
diff changeset
1148 (if (not (and (boundp 'tar-superior-buffer) tar-superior-buffer))
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1149 (error "This buffer has no superior tar file buffer"))
2542
ae4176e2e8fa Add defvars to pacify the byte compiler, at RMS's request.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 880
diff changeset
1150 (if (not (and (boundp 'tar-superior-descriptor) tar-superior-descriptor))
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1151 (error "This buffer doesn't have an index into its superior tar file!"))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1152 (let ((subfile (current-buffer))
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1153 (coding buffer-file-coding-system)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1154 (descriptor tar-superior-descriptor)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1155 subfile-size)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1156 (with-current-buffer tar-superior-buffer
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1157 (let* ((start (tar-header-data-start descriptor))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1158 (name (tar-header-name descriptor))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1159 (size (tar-header-size descriptor))
95370
fafc513e04bc (tar-summarize-buffer): Fix reporter initialization.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95347
diff changeset
1160 (head (memq descriptor tar-parse-info)))
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1161 (if (not head)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1162 (error "Can't find this tar file entry in its parent tar file!"))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1163 (with-current-buffer tar-data-buffer
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1164 ;; delete the old data...
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1165 (let* ((data-start start)
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1166 (data-end (+ data-start (tar-roundup-512 size))))
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1167 (narrow-to-region data-start data-end)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1168 (delete-region (point-min) (point-max))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1169 ;; insert the new data...
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1170 (goto-char data-start)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1171 (let ((dest (current-buffer)))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1172 (with-current-buffer subfile
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1173 (save-restriction
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1174 (widen)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1175 (encode-coding-region (point-min) (point-max) coding dest))))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1176 (setq subfile-size (- (point-max) (point-min)))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1177 ;;
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1178 ;; pad the new data out to a multiple of 512...
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1179 (let ((subfile-size-pad (tar-roundup-512 subfile-size)))
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1180 (goto-char (point-max))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1181 (insert (make-string (- subfile-size-pad subfile-size) 0))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1182 ;;
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1183 ;; update the data of this files...
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1184 (setf (tar-header-size descriptor) subfile-size)
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1185 ;;
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1186 ;; Update the size field in the header block.
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1187 (widen))))
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1188 ;;
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1189 ;; alter the descriptor-line and header
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1190 ;;
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1191 (let ((position (- (length tar-parse-info) (length head))))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1192 (goto-char (point-min))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1193 (forward-line position)
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1194 (tar-alter-one-field tar-size-offset (format "%11o " subfile-size))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1195 ;;
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1196 ;; Maybe update the datestamp.
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1197 (when tar-update-datestamp
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1198 (tar-alter-one-field tar-time-offset
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1199 (concat (tar-octal-time (current-time)) " "))))
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1200 ;; After doing the insertion, add any necessary final padding.
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1201 (tar-pad-to-blocksize))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1202 (set-buffer-modified-p t) ; mark the tar file as modified
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1203 (tar-next-line 0))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1204 (set-buffer-modified-p nil) ; mark the tar subfile as unmodified
11450
aee30032f324 (tar-mode): Locally bind next-line-add-newlines to nil.
Richard M. Stallman <rms@gnu.org>
parents: 11431
diff changeset
1205 (message "Saved into tar-buffer `%s'. Be sure to save that buffer!"
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1206 (buffer-name tar-superior-buffer))
22181
dc8c3736ebea (tar-mode): Position point on the name of the first file.
Richard M. Stallman <rms@gnu.org>
parents: 22032
diff changeset
1207 ;; Prevent basic-save-buffer from changing our coding-system.
dc8c3736ebea (tar-mode): Position point on the name of the first file.
Richard M. Stallman <rms@gnu.org>
parents: 22032
diff changeset
1208 (setq last-coding-system-used buffer-file-coding-system)
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
1209 ;; Prevent ordinary saving from happening.
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1210 t))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1211
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1212
23716
d30ffa793626 (tar-header-block-tokenize): Decode codes of file
Kenichi Handa <handa@m17n.org>
parents: 23482
diff changeset
1213 ;; When this function is called, it is sure that the buffer is unibyte.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1214 (defun tar-pad-to-blocksize ()
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1215 "If we are being anal about tar file blocksizes, fix up the current buffer.
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1216 Leaves the region wide."
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1217 (if (null tar-anal-blocksize)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1218 nil
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1219 (let* ((last-desc (nth (1- (length tar-parse-info)) tar-parse-info))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1220 (start (tar-header-data-start last-desc))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1221 (link-p (tar-header-link-type last-desc))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1222 (size (if link-p 0 (tar-header-size last-desc)))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1223 (data-end (+ start size))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1224 (bbytes (ash tar-anal-blocksize 9))
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1225 (pad-to (+ bbytes (* bbytes (/ (- data-end (point-min)) bbytes)))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1226 ;; If the padding after the last data is too long, delete some;
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1227 ;; else insert some until we are padded out to the right number of blocks.
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1228 ;;
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1229 (with-current-buffer tar-data-buffer
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1230 (let ((goal-end (+ (point-min) pad-to)))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1231 (if (> (point-max) goal-end)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1232 (delete-region goal-end (point-max))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1233 (goto-char (point-max))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1234 (insert (make-string (- goal-end (point-max)) ?\0))))))))
100787
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
1235
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
1236
100935
e55ce6002e3d (tar-mode, tar-mode-write-contents)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100908
diff changeset
1237 ;; Used in write-region-annotate-functions to write tar-files out correctly.
e55ce6002e3d (tar-mode, tar-mode-write-contents)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100908
diff changeset
1238 (defun tar-write-region-annotate (start end)
e55ce6002e3d (tar-mode, tar-mode-write-contents)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100908
diff changeset
1239 ;; When called from write-file (and auto-save), `start' is nil.
e55ce6002e3d (tar-mode, tar-mode-write-contents)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100908
diff changeset
1240 ;; When called from M-x write-region, we assume the user wants to save
e55ce6002e3d (tar-mode, tar-mode-write-contents)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100908
diff changeset
1241 ;; (part of) the summary, not the tar data.
e55ce6002e3d (tar-mode, tar-mode-write-contents)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100908
diff changeset
1242 (unless (or start (not (tar-data-swapped-p)))
100801
da95fec1ae70 (tar-mode): Set write-contents-functions instead of
Andreas Schwab <schwab@suse.de>
parents: 100787
diff changeset
1243 (tar-clear-modification-flags)
100935
e55ce6002e3d (tar-mode, tar-mode-write-contents)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100908
diff changeset
1244 (set-buffer tar-data-buffer)
e55ce6002e3d (tar-mode, tar-mode-write-contents)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100908
diff changeset
1245 nil))
100787
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
1246
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1247 (provide 'tar-mode)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1248
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
1249 ;; arch-tag: 8a585a4a-340e-42c2-89e7-d3b1013a4b78
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 584
diff changeset
1250 ;;; tar-mode.el ends here