annotate lisp/tar-mode.el @ 107189:a48b193e3b5f

(tramp-handle-insert-file-contents): Set always the permissions of the temporary file to "0600". In case the remote file has no read permissions for the owner, there might be problems otherwise. Reported by Ole Laursen <olau@iola.dk>.
author Michael Albinus <michael.albinus@gmx.de>
date Thu, 18 Feb 2010 11:03:12 +0100
parents 1d1d5d9bd884
children 1721e4658521 cdab39f69698
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)
ae4176e2e8fa Add defvars to pacify the byte compiler, at RMS's request.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 880
diff changeset
140 (defvar tar-subfile-mode nil)
88955
1d1275f5d5b7 (tar-file-name-coding-system): New variable. Make
Kenichi Handa <handa@m17n.org>
parents: 43424
diff changeset
141 (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
142
e0713a13f2d7 (tar-parse-info, tar-header-offset, tar-superior-buffer)
Richard M. Stallman <rms@gnu.org>
parents: 4120
diff changeset
143 (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
144 (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
145
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
146 ;; 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
147 ;; 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
148 ;; 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
149 ;; 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
150 ;; 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
151 ;; - 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
152 ;; 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
153 ;; - 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
154 ;; 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
155 ;; the two.
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
156 ;; - 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
157 ;; 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
158 ;; 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
159 ;; 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
160 (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
161 (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
162
100787
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
163 (defvar tar-data-swapped nil
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
164 "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
165 (make-variable-buffer-local 'tar-data-swapped)
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
166
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
167 (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
168 "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
169 (and (buffer-live-p tar-data-buffer)
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
170 ;; 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
171 ;; 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
172 ;; the summary.
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
173 (progn
105653
8177db6744a6 (tar-data-swapped-p): Make the assertion a bit more
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 104823
diff changeset
174 (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
175 (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
176 (> (buffer-size tar-data-buffer) (buffer-size)))))
100787
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
177 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
178
100698
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
179 (defun tar-swap-data ()
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
180 "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
181 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
182 (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
183 (current-buffer-modified-p (buffer-modified-p)))
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
184 (buffer-swap-text tar-data-buffer)
100787
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
185 (setq tar-data-swapped (not tar-data-swapped))
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
186 (restore-buffer-modified-p data-buffer-modified-p)
100698
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
187 (with-current-buffer tar-data-buffer
100787
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
188 (restore-buffer-modified-p current-buffer-modified-p))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
189
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
190 ;;; down to business.
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
191
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
192 (defstruct (tar-header
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
193 (:constructor nil)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
194 (:type vector)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
195 :named
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
196 (:constructor
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
197 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
198 link-type link-name magic uname gname dmaj dmin)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
199 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
200 magic uname gname dmaj dmin
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
201 ;; 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
202 ;; 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
203 header-start)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
204
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
205 (defconst tar-name-offset 0)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
206 (defconst tar-mode-offset (+ tar-name-offset 100))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
207 (defconst tar-uid-offset (+ tar-mode-offset 8))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
208 (defconst tar-gid-offset (+ tar-uid-offset 8))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
209 (defconst tar-size-offset (+ tar-gid-offset 8))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
210 (defconst tar-time-offset (+ tar-size-offset 12))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
211 (defconst tar-chk-offset (+ tar-time-offset 12))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
212 (defconst tar-linkp-offset (+ tar-chk-offset 8))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
213 (defconst tar-link-offset (+ tar-linkp-offset 1))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
214 ;;; GNU-tar specific slots.
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
215 (defconst tar-magic-offset (+ tar-link-offset 100))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
216 (defconst tar-uname-offset (+ tar-magic-offset 8))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
217 (defconst tar-gname-offset (+ tar-uname-offset 32))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
218 (defconst tar-dmaj-offset (+ tar-gname-offset 32))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
219 (defconst tar-dmin-offset (+ tar-dmaj-offset 8))
94270
e1d36e944ae0 (tar-prefix-offset): New constant.
Juri Linkov <juri@jurta.org>
parents: 93612
diff changeset
220 (defconst tar-prefix-offset (+ tar-dmin-offset 8))
e1d36e944ae0 (tar-prefix-offset): New constant.
Juri Linkov <juri@jurta.org>
parents: 93612
diff changeset
221 (defconst tar-end-offset (+ tar-prefix-offset 155))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
222
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
223 (defun tar-roundup-512 (s)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
224 "Round S up to the next multiple of 512."
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
225 (ash (ash (+ s 511) -9) 9))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
226
100698
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
227 (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
228 "Return a `tar-header' structure.
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47656
diff changeset
229 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
230 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
231 (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
232 (assert (zerop (mod (- pos (point-min)) 512)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
233 (assert (not enable-multibyte-characters))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
234 (let ((string (buffer-substring pos (setq pos (+ pos 512)))))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
235 (when ;(some 'plusp string) ; <-- oops, massive cycle hog!
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
236 (or (not (= 0 (aref string 0))) ; This will do.
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
237 (not (= 0 (aref string 101))))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
238 (let* ((name-end tar-mode-offset)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
239 (link-end (1- tar-magic-offset))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
240 (uname-end (1- tar-gname-offset))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
241 (gname-end (1- tar-dmaj-offset))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
242 (link-p (aref string tar-linkp-offset))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
243 (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
244 ;; 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
245 ;; 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
246 ;; which we here ignore.
ef524a34d985 (tar-header-block-tokenize): Properly ignore the version
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100935
diff changeset
247 (- tar-uname-offset 2)))
ef524a34d985 (tar-header-block-tokenize): Properly ignore the version
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100935
diff changeset
248 ;; 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
249 ;; "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
250 (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
251 name linkname
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
252 (nulsexp "[^\000]*\000"))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
253 (when (string-match nulsexp string tar-name-offset)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
254 (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
255 (when (string-match nulsexp string tar-link-offset)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
256 (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
257 (when (string-match nulsexp string tar-uname-offset)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
258 (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
259 (when (string-match nulsexp string tar-gname-offset)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
260 (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
261 (setq name (substring string tar-name-offset name-end)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
262 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
263 nil
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
264 (- link-p ?0)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
265 (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
266 (when (and (equal uname-valid-p "ustar\0")
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
267 (string-match nulsexp string tar-prefix-offset)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
268 (> (match-end 0) (1+ tar-prefix-offset)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
269 (setq name (concat (substring string tar-prefix-offset
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
270 (1- (match-end 0)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
271 "/" name)))
104823
68150c643e2e Use default-value rather than default-enable-multibyte-characters.
Glenn Morris <rgm@gnu.org>
parents: 103321
diff changeset
272 (if (default-value 'enable-multibyte-characters)
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
273 (setq name
100698
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
274 (decode-coding-string name coding)
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
275 linkname
100698
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
276 (decode-coding-string linkname coding)))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
277 (if (and (null link-p) (string-match "/\\'" name))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
278 (setq link-p 5)) ; directory
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
279
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
280 (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
281 ;; 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
282 ;; 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
283 ;; (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
284 (member magic-str '("ustar " "ustar\0")))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
285 ;; This is a GNU Tar long-file-name header.
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
286 (let* ((size (tar-parse-octal-integer
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
287 string tar-size-offset tar-time-offset))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
288 ;; -1 so as to strip the terminating 0 byte.
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
289 (name (buffer-substring pos (+ pos size -1)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
290 (descriptor (tar-header-block-tokenize
100787
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
291 (+ pos (tar-roundup-512 size))
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
292 coding)))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
293 (cond
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
294 ((eq link-p (- ?L ?0)) ;GNUTYPE_LONGNAME.
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
295 (setf (tar-header-name descriptor) name))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
296 ((eq link-p (- ?K ?0)) ;GNUTYPE_LONGLINK.
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
297 (setf (tar-header-link-name descriptor) name))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
298 (t
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
299 (message "Unrecognized GNU Tar @LongLink format")))
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
300 (setf (tar-header-header-start descriptor)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
301 (copy-marker (- pos 512) t))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
302 descriptor)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
303
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
304 (make-tar-header
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
305 (copy-marker pos nil)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
306 name
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
307 (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
308 (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
309 (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
310 (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
311 (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
312 (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
313 link-p
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
314 linkname
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
315 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
316 (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
317 (decode-coding-string
8177db6744a6 (tar-data-swapped-p): Make the assertion a bit more
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 104823
diff changeset
318 (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
319 (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
320 (decode-coding-string
8177db6744a6 (tar-data-swapped-p): Make the assertion a bit more
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 104823
diff changeset
321 (substring string tar-gname-offset gname-end) coding))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
322 (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
323 (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
324 ))))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
325
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
326 ;; Pseudo-field.
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
327 (defun tar-header-data-end (descriptor)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
328 (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
329 (link-type (tar-header-link-type descriptor))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
330 (size (tar-header-size descriptor))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
331 (fudge (cond
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
332 ;; 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
333 ((memq link-type '(20 55)) 512)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
334 (t 0))))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
335 (+ data-start fudge
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
336 (if (and (null link-type) (> size 0))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
337 (tar-roundup-512 size)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
338 0))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
339
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
340 (defun tar-parse-octal-integer (string &optional start end)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
341 (if (null start) (setq start 0))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
342 (if (null end) (setq end (length string)))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
343 (if (= (aref string start) 0)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
344 0
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
345 (let ((n 0))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
346 (while (< start end)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
347 (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
348 (+ (* n 8) (- (aref string start) ?0)))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
349 start (1+ start)))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
350 n)))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
351
10843
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
352 (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
353 (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
354 (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
355 (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
356 (list 0 0)
10843
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
357 (let ((lo 0)
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
358 (hi 0))
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
359 (while (< start end)
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
360 (if (>= (aref string start) ?0)
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
361 (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
362 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
363 lo (logand lo 65535)))
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
364 (setq start (1+ start)))
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
365 (list hi lo))))
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
366
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
367 (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
368 (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
369 (mapc (lambda (c)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
370 (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
371 (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
372 string)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
373 (tar-parse-octal-integer string))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
374
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
375
8023
f29df49c6e53 (tar-extract): Set file name by hand before calling
Richard M. Stallman <rms@gnu.org>
parents: 7497
diff changeset
376 (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
377 "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
378 (assert (not (multibyte-string-p string)))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
379 (let* ((chk-field-start tar-chk-offset)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
380 (chk-field-end (+ chk-field-start 8))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
381 (sum 0)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
382 (i 0))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
383 ;; 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
384 ;; Add that field as if it were filled with spaces.
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
385 (while (< i chk-field-start)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
386 (setq sum (+ sum (aref string i))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
387 i (1+ i)))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
388 (setq i chk-field-end)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
389 (while (< i 512)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
390 (setq sum (+ sum (aref string i))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
391 i (1+ i)))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
392 (+ sum (* 32 8))))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
393
8023
f29df49c6e53 (tar-extract): Set file name by hand before calling
Richard M. Stallman <rms@gnu.org>
parents: 7497
diff changeset
394 (defun tar-header-block-check-checksum (hblock desired-checksum file-name)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
395 "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
396 (if (not (= desired-checksum (tar-header-block-checksum hblock)))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
397 (progn (beep) (message "Invalid checksum for file %s!" file-name))))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
398
10843
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
399 (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
400 (let ((str (current-time-string time)))
29424
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
401 (concat " " (substring str 4 16) (substring str 19 24))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
402
29424
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
403 (defun tar-grind-file-mode (mode)
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
404 "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
405 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
406 (string
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
407 (if (zerop (logand 256 mode)) ?- ?r)
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
408 (if (zerop (logand 128 mode)) ?- ?w)
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
409 (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
410 (if (zerop (logand 32 mode)) ?- ?r)
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
411 (if (zerop (logand 16 mode)) ?- ?w)
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
412 (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
413 (if (zerop (logand 4 mode)) ?- ?r)
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
414 (if (zerop (logand 2 mode)) ?- ?w)
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
415 (if (zerop (logand 1 mode)) ?- ?x)))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
416
8023
f29df49c6e53 (tar-extract): Set file name by hand before calling
Richard M. Stallman <rms@gnu.org>
parents: 7497
diff changeset
417 (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
418 "Return a line similar to the output of `tar -vtf'."
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
419 (let ((name (tar-header-name tar-hblock))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
420 (mode (tar-header-mode tar-hblock))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
421 (uid (tar-header-uid tar-hblock))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
422 (gid (tar-header-gid tar-hblock))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
423 (uname (tar-header-uname tar-hblock))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
424 (gname (tar-header-gname tar-hblock))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
425 (size (tar-header-size tar-hblock))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
426 (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
427 ;; (ck (tar-header-checksum tar-hblock))
29424
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
428 (type (tar-header-link-type tar-hblock))
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
429 (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
430 (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
431 (if mod-p ?* ? )
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
432 (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
433 ((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
434 ((eq type 2) ?l) ; symlink
29424
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
435 ((eq type 3) ?c) ; char special
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
436 ((eq type 4) ?b) ; block special
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
437 ((eq type 5) ?d) ; directory
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
438 ((eq type 6) ?p) ; FIFO/pipe
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
439 ((eq type 20) ?*) ; directory listing
44204
c9cbe448711d (tar-header-block-summarize, tar-get-descriptor):
Richard M. Stallman <rms@gnu.org>
parents: 43777
diff changeset
440 ((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
441 ((eq type 29) ?M) ; multivolume continuation
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
442 ((eq type 35) ?S) ; sparse
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
443 ((eq type 38) ?V) ; volume header
77925
3da77a559100 (tar-header-block-summarize, tar-summarize-buffer)
Chong Yidong <cyd@stupidchicken.com>
parents: 77788
diff changeset
444 ((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
445 (t ?\s)
29424
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
446 )
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
447 (tar-grind-file-mode mode)
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
448 (if (= 0 (length uname)) uid uname)
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
449 (if (= 0 (length gname)) gid gname)
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
450 size
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
451 (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
452 (propertize name
fecdcc18b027 (tar-header-block-summarize): Add help-echo to mouse-highlighted text.
Eli Zaretskii <eliz@gnu.org>
parents: 38062
diff changeset
453 'mouse-face 'highlight
fecdcc18b027 (tar-header-block-summarize): Add help-echo to mouse-highlighted text.
Eli Zaretskii <eliz@gnu.org>
parents: 38062
diff changeset
454 '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
455 (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
456 (concat (if (= type 1) " ==> " " --> ") link-name)
5fe4cd1c83ba (tar-header-block-recompute-checksum): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27598
diff changeset
457 ""))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
458
43777
c62ae85e0f7b (tar-untar-buffer): New function.
Richard M. Stallman <rms@gnu.org>
parents: 43424
diff changeset
459 (defun tar-untar-buffer ()
47656
940195447c9f (tar-untar-buffer): Handle dir-entries.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46926
diff changeset
460 "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
461 (interactive)
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
462 ;; 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
463 (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
464 (with-current-buffer
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
465 (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
466 (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
467 (dolist (descriptor descriptors)
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
468 (let* ((name (tar-header-name descriptor))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
469 (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
470 name
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
471 (file-name-directory name)))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
472 (start (tar-header-data-start descriptor))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
473 (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
474 (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
475 (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
476 (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
477 (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
478 (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
479 (write-region start end name))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
480 (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
481
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
482 (defun tar-summarize-buffer ()
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
483 "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
484 (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
485 (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
486 (result '())
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
487 (pos (point-min))
100698
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
488 (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
489 (progress-reporter
95370
fafc513e04bc (tar-summarize-buffer): Fix reporter initialization.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95347
diff changeset
490 (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
491 (make-progress-reporter "Parsing tar file..."
95370
fafc513e04bc (tar-summarize-buffer): Fix reporter initialization.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95347
diff changeset
492 (point-min) (point-max))))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
493 descriptor)
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
494 (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
495 (while (and (< pos (point-max))
100698
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
496 (setq descriptor (tar-header-block-tokenize pos coding)))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
497 (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
498 (if (< size 0)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
499 (error "%s has size %s - corrupted"
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
500 (tar-header-name descriptor) size)))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
501 ;;
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
502 ;; 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
503 ;;(tar-header-block-check-checksum
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
504 ;; hblock (tar-header-block-checksum hblock)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
505 ;; (tar-header-name descriptor))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
506
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
507 (push descriptor result)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
508 (setq pos (tar-header-data-end descriptor))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
509 (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
510
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
511 (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
512 ;; 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
513 ;; 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
514 (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
515 (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
516 (message "Warning: premature EOF parsing tar file"))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
517 (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
518 (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
519 (total-summaries
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
520 (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
521 (insert total-summaries "\n"))
9970a9645ad9 Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-4
Miles Bader <miles@gnu.org>
parents: 90261
diff changeset
522 (goto-char (point-min))
9970a9645ad9 Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-4
Miles Bader <miles@gnu.org>
parents: 90261
diff changeset
523 (restore-buffer-modified-p modified)))
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
524
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
525 (defvar tar-mode-map
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
526 (let ((map (make-keymap)))
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
527 (suppress-keymap map)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
528 (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
529 (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
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 "\^D" 'tar-flag-deleted)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
532 (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
533 (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
534 (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
535 (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
536 (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
537 (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
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 "\^N" '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 [down] 'tar-next-line)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
541 (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
542 (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
543 (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
544 (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
545 (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
546 (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
547 (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
548 (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
549 (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
550 (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
551 (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
552 (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
553 (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
554 (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
555 ;; 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
556 (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
557
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
558 ;; Make menu bar items.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
559
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
560 ;; 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
561 (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
562
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
563 (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
564 (cons "Immediate" (make-sparse-keymap "Immediate")))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
565
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
566 (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
567 '("View This File" . tar-view))
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
568 (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
569 '("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
570 (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
571 '("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
572 (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
573 '("Find This File" . tar-extract))
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
574
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
575 (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
576 (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
577
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
578 (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
579 '("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
580 (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
581 '("Flag" . tar-flag-deleted))
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
582 (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
583 '("Unflag" . tar-unflag))
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
584
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
585 (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
586 (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
587
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
588 (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
589 '("Change Owner..." . tar-chown-entry))
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
590 (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
591 '("Change Group..." . tar-chgrp-entry))
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
592 (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
593 '("Change Mode..." . tar-chmod-entry))
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
594 (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
595 '("Rename to..." . tar-rename-entry))
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
596 (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
597 '("Copy to..." . tar-copy))
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
598 (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
599 '("Expunge Marked Files" . tar-expunge))
91801
8e06d480f634 Fix broken indentation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 91367
diff changeset
600
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
601 map)
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
602 "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
603
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
604
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
605 ;; tar mode is suitable only for specially formatted data.
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
606 (put 'tar-mode 'mode-class 'special)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
607 (put 'tar-subfile-mode 'mode-class 'special)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
608
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
609 (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
610 ;; 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
611 (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
612 ;; 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
613 (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
614
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
615 (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
616 (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
617
3419
97205883b02d Typo in autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 3365
diff changeset
618 ;;;###autoload
41170
e4b5d4e63bd3 (tar-mode): Use define-derived-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39471
diff changeset
619 (define-derived-mode tar-mode nil "Tar"
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
620 "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
621 You can move around using the usual cursor motion commands.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
622 Letters no longer insert themselves.
6611
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
623 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
624 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
625 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
626
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47656
diff changeset
627 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
628 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
629 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
630 inside of a tar archive without extracting it and re-archiving it.
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
631
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
632 See also: variables `tar-update-datestamp' and `tar-anal-blocksize'.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
633 \\{tar-mode-map}"
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
634 (make-local-variable 'tar-parse-info)
41170
e4b5d4e63bd3 (tar-mode): Use define-derived-mode.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39471
diff changeset
635 (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
636 (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
637 (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
638 (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
639 (or file-name-coding-system
1d1275f5d5b7 (tar-file-name-coding-system): New variable. Make
Kenichi Handa <handa@m17n.org>
parents: 43424
diff changeset
640 default-file-name-coding-system
1d1275f5d5b7 (tar-file-name-coding-system): New variable. Make
Kenichi Handa <handa@m17n.org>
parents: 43424
diff changeset
641 locale-coding-system))
23482
43849bed4a16 (tar-mode): Locally set file-precious-flag.
Richard M. Stallman <rms@gnu.org>
parents: 23380
diff changeset
642 ;; 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
643 (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
644 (buffer-disable-undo)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
645 (widen)
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
646 ;; 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
647 ;; 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
648 (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
649 (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
650 ;; 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
651 ;; 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
652 ;; 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
653 (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
654 (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
655 (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
656 ;; 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
657 (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
658 (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
659 (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
660 (file-name-nondirectory
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
661 (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
662 (condition-case err
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
663 (progn
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
664 (tar-swap-data)
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
665 (tar-summarize-buffer)
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
666 (tar-next-line 0))
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
667 (error
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
668 ;; 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
669 ;; 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
670 ;; revert to fundamental-mode.
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
671 (fundamental-mode)
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
672 (signal (car err) (cdr err)))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
673
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
674
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
675 (defun tar-subfile-mode (p)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
676 "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
677 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
678 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
679 appear on disk when you save the tar-file's buffer."
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
680 (interactive "P")
2542
ae4176e2e8fa Add defvars to pacify the byte compiler, at RMS's request.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 880
diff changeset
681 (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
682 (error "This buffer is not an element of a tar file"))
47656
940195447c9f (tar-untar-buffer): Handle dir-entries.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46926
diff changeset
683 ;; Don't do this, because it is redundant and wastes mode line space.
940195447c9f (tar-untar-buffer): Handle dir-entries.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46926
diff changeset
684 ;; (or (assq 'tar-subfile-mode minor-mode-alist)
940195447c9f (tar-untar-buffer): Handle dir-entries.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46926
diff changeset
685 ;; (setq minor-mode-alist (append minor-mode-alist
940195447c9f (tar-untar-buffer): Handle dir-entries.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46926
diff changeset
686 ;; (list '(tar-subfile-mode " TarFile")))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
687 (make-local-variable 'tar-subfile-mode)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
688 (setq tar-subfile-mode
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
689 (if (null p)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
690 (not tar-subfile-mode)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
691 (> (prefix-numeric-value p) 0)))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
692 (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
693 (add-hook 'write-file-functions 'tar-subfile-save-buffer nil t)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
694 ;; turn off auto-save.
22032
e27e9e844efe (tar-subfile-mode): Call auto-save-mode with -1.
Dave Love <fx@gnu.org>
parents: 21851
diff changeset
695 (auto-save-mode -1)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
696 (setq buffer-auto-save-file-name nil)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
697 (run-hooks 'tar-subfile-mode-hook))
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
698 (t
46926
dd4d628efd2e (tar-subfile-mode): Use add-hook and remove-hook, and use
Richard M. Stallman <rms@gnu.org>
parents: 45348
diff changeset
699 (remove-hook 'write-file-functions 'tar-subfile-save-buffer t))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
700
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
701
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
702 ;; 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
703 (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
704 (unwind-protect
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
705 (let ((revert-buffer-function nil))
100698
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
706 (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
707 ;; 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
708 ;; 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
709 (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
710 ;; 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
711 (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
712 (tar-mode))
100698
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
713 (unless (tar-data-swapped-p) (tar-swap-data))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
714
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
715
43424
444fb6708a66 (tar-next-line, tar-previous-line): Add doc string,
Pavel Janík <Pavel@Janik.cz>
parents: 41170
diff changeset
716 (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
717 "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
718 (interactive "p")
43424
444fb6708a66 (tar-next-line, tar-previous-line): Add doc string,
Pavel Janík <Pavel@Janik.cz>
parents: 41170
diff changeset
719 (forward-line arg)
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
720 (goto-char (or (next-single-property-change (point) 'mouse-face) (point))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
721
43424
444fb6708a66 (tar-next-line, tar-previous-line): Add doc string,
Pavel Janík <Pavel@Janik.cz>
parents: 41170
diff changeset
722 (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
723 "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
724 (interactive "p")
43424
444fb6708a66 (tar-next-line, tar-previous-line): Add doc string,
Pavel Janík <Pavel@Janik.cz>
parents: 41170
diff changeset
725 (tar-next-line (- arg)))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
726
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
727 (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
728 "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
729 ;; 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
730 (or (nth (count-lines (point-min) (line-beginning-position))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
731 tar-parse-info)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
732 (if noerror
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
733 nil
6611
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
734 (error "This line does not describe a tar-file entry"))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
735
6611
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
736 (defun tar-get-descriptor ()
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
737 (let* ((descriptor (tar-current-descriptor))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
738 (size (tar-header-size descriptor))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
739 (link-p (tar-header-link-type descriptor)))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
740 (if link-p
77925
3da77a559100 (tar-header-block-summarize, tar-summarize-buffer)
Chong Yidong <cyd@stupidchicken.com>
parents: 77788
diff changeset
741 (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
742 (cond ((eq link-p 5) "a directory")
3da77a559100 (tar-header-block-summarize, tar-summarize-buffer)
Chong Yidong <cyd@stupidchicken.com>
parents: 77788
diff changeset
743 ((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
744 ((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
745 ((eq link-p 29) "a multivolume-continuation")
3da77a559100 (tar-header-block-summarize, tar-summarize-buffer)
Chong Yidong <cyd@stupidchicken.com>
parents: 77788
diff changeset
746 ((eq link-p 35) "a sparse entry")
3da77a559100 (tar-header-block-summarize, tar-summarize-buffer)
Chong Yidong <cyd@stupidchicken.com>
parents: 77788
diff changeset
747 ((eq link-p 38) "a volume header")
3da77a559100 (tar-header-block-summarize, tar-summarize-buffer)
Chong Yidong <cyd@stupidchicken.com>
parents: 77788
diff changeset
748 ((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
749 (t "a link"))))
78128
aec26e5eba68 (tar-get-descriptor): No error for zero-length file.
Richard M. Stallman <rms@gnu.org>
parents: 77925
diff changeset
750 (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
751 descriptor))
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
752
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
753 (defun tar-mouse-extract (event)
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
754 "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
755 (interactive "e")
91801
8e06d480f634 Fix broken indentation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 91367
diff changeset
756 (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
757 (save-excursion
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
758 (goto-char (posn-point (event-end event)))
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
759 ;; Just make sure this doesn't get an error.
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
760 (tar-get-descriptor)))
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
761 (select-window (posn-window (event-end event)))
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
762 (goto-char (posn-point (event-end event)))
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
763 (tar-extract))
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
764
77788
b5a6f9693d00 (tar-file-name-handler): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 75347
diff changeset
765 (defun tar-file-name-handler (op &rest args)
b5a6f9693d00 (tar-file-name-handler): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 75347
diff changeset
766 "Helper function for `tar-extract'."
b5a6f9693d00 (tar-file-name-handler): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 75347
diff changeset
767 (or (eq op 'file-exists-p)
b5a6f9693d00 (tar-file-name-handler): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 75347
diff changeset
768 (let ((file-name-handler-alist nil))
b5a6f9693d00 (tar-file-name-handler): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 75347
diff changeset
769 (apply op args))))
b5a6f9693d00 (tar-file-name-handler): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 75347
diff changeset
770
6611
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
771 (defun tar-extract (&optional other-window-p)
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
772 "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
773 (interactive)
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
774 (let* ((view-p (eq other-window-p 'view))
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
775 (descriptor (tar-get-descriptor))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
776 (name (tar-header-name descriptor))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
777 (size (tar-header-size descriptor))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
778 (start (tar-header-data-start descriptor))
6611
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
779 (end (+ start size)))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
780 (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
781 (tarname (buffer-name))
38719
03376ff9ccfd (tar-extract): Avoid generating a new buffer
Gerd Moellmann <gerd@gnu.org>
parents: 38081
diff changeset
782 (bufname (concat (file-name-nondirectory name)
03376ff9ccfd (tar-extract): Avoid generating a new buffer
Gerd Moellmann <gerd@gnu.org>
parents: 38081
diff changeset
783 " ("
38053
3e512ad7ce98 (tar-extract): Call generate-new-buffer-name to
Eli Zaretskii <eliz@gnu.org>
parents: 37634
diff changeset
784 tarname
38719
03376ff9ccfd (tar-extract): Avoid generating a new buffer
Gerd Moellmann <gerd@gnu.org>
parents: 38081
diff changeset
785 ")"))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
786 (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
787 (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
788 ;; `:' 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
789 (concat tarname "!"
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
790 (if (string-match "/" name)
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
791 name
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
792 ;; Make sure `name' contains a /
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
793 ;; 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
794 ;; 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
795 (concat "./" name)))))
38719
03376ff9ccfd (tar-extract): Avoid generating a new buffer
Gerd Moellmann <gerd@gnu.org>
parents: 38081
diff changeset
796 (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
797 (just-created nil)
90073
f02550ff43d0 (tar-extract): Adjust code merged from trunk for
Kenichi Handa <handa@m17n.org>
parents: 90043
diff changeset
798 undo-list)
38719
03376ff9ccfd (tar-extract): Avoid generating a new buffer
Gerd Moellmann <gerd@gnu.org>
parents: 38081
diff changeset
799 (unless buffer
34495
390a9f3dd80c (tar-extract): Base the name of the subfile buffer
Andreas Schwab <schwab@suse.de>
parents: 29646
diff changeset
800 (setq buffer (generate-new-buffer bufname))
91801
8e06d480f634 Fix broken indentation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 91367
diff changeset
801 (with-current-buffer buffer
90073
f02550ff43d0 (tar-extract): Adjust code merged from trunk for
Kenichi Handa <handa@m17n.org>
parents: 90043
diff changeset
802 (setq undo-list buffer-undo-list
f02550ff43d0 (tar-extract): Adjust code merged from trunk for
Kenichi Handa <handa@m17n.org>
parents: 90043
diff changeset
803 buffer-undo-list t))
34495
390a9f3dd80c (tar-extract): Base the name of the subfile buffer
Andreas Schwab <schwab@suse.de>
parents: 29646
diff changeset
804 (setq bufname (buffer-name buffer))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
805 (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
806 (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
807 (let (coding)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
808 (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
809 (goto-char start)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
810 (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
811 (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
812 (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
813 name (- end start)))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
814 ;; 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
815 ;; 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
816 ;; (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
817 ;; 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
818 ;; 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
819 ;; 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
820 (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
821 '(("" . 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
822 (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
823 'insert-file-contents
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
824 (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
825 (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
826 (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
827 (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
828 (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
829 (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
830 (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
831 (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
832 (widen)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
833 (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
834 (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
835 (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
836 (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
837 (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
838 (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
839 ;; 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
840 ;; 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
841 (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
842 ;; 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
843 ;; superior buffer.
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
844 (setq default-directory
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
845 (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
846 default-directory))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
847 (rename-buffer bufname)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
848 (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
849 (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
850 (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
851 (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
852 (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
853 (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
854 (tar-subfile-mode 1)))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
855 (if view-p
88040
5f0db12a78bd (tar-extract): Use kill-buffer-if-not-modified as
Martin Rudalics <rudalics@gmx.at>
parents: 87649
diff changeset
856 (view-buffer
5f0db12a78bd (tar-extract): Use kill-buffer-if-not-modified as
Martin Rudalics <rudalics@gmx.at>
parents: 87649
diff changeset
857 buffer (and just-created 'kill-buffer-if-not-modified))
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
858 (if (eq other-window-p 'display)
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
859 (display-buffer buffer)
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
860 (if other-window-p
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
861 (switch-to-buffer-other-window buffer)
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
862 (switch-to-buffer buffer)))))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
863
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
864
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
865 (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
866 "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
867 (interactive)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
868 (tar-extract t))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
869
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
870 (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
871 "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
872 (interactive)
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
873 (tar-extract 'display))
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
874
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
875 (defun tar-view ()
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
876 "In Tar mode, view the tar file entry on this line."
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
877 (interactive)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
878 (tar-extract 'view))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
879
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
880
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
881 (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
882 "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
883 (or prompt (setq prompt "Copy to: "))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
884 (let* ((default-file (expand-file-name
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
885 (tar-header-name (tar-current-descriptor))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
886 (target (expand-file-name
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
887 (read-file-name prompt
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
888 (file-name-directory default-file)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
889 default-file nil))))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
890 (if (or (string= "" (file-name-nondirectory target))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
891 (file-directory-p target))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
892 (setq target (concat (if (string-match "/$" target)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
893 (substring target 0 (1- (match-end 0)))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
894 target)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
895 "/"
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
896 (file-name-nondirectory default-file))))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
897 target))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
898
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
899
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
900 (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
901 "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
902 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
903 the current tar-entry."
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
904 (interactive (list (tar-read-file-name)))
6611
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
905 (let* ((descriptor (tar-get-descriptor))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
906 (name (tar-header-name descriptor))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
907 (size (tar-header-size descriptor))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
908 (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
909 (end (+ start size))
07ba0f6e9ada (tar-copy): Inhibit use of jka-compr handler
Richard M. Stallman <rms@gnu.org>
parents: 12027
diff changeset
910 (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
911 (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
912 (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
913 (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
914 ;; 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
915 ;; 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
916 (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
917 '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
918 (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
919 'jka-compr-handler))
12662
07ba0f6e9ada (tar-copy): Inhibit use of jka-compr handler
Richard M. Stallman <rms@gnu.org>
parents: 12027
diff changeset
920 (setq inhibit-file-name-handlers
07ba0f6e9ada (tar-copy): Inhibit use of jka-compr handler
Richard M. Stallman <rms@gnu.org>
parents: 12027
diff changeset
921 (cons 'jka-compr-handler
07ba0f6e9ada (tar-copy): Inhibit use of jka-compr handler
Richard M. Stallman <rms@gnu.org>
parents: 12027
diff changeset
922 (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
923 inhibit-file-name-handlers))
07ba0f6e9ada (tar-copy): Inhibit use of jka-compr handler
Richard M. Stallman <rms@gnu.org>
parents: 12027
diff changeset
924 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
925 (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
926 (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
927 (message "Copied tar entry %s to %s" name to-file)))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
928
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
929 (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
930 "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
931 With a prefix argument, mark that many files."
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
932 (interactive "p")
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
933 (beginning-of-line)
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
934 (dotimes (i (abs p))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
935 (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
936 (progn
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
937 (delete-char 1)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
938 (insert (if unflag " " "D"))))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
939 (forward-line (if (< p 0) -1 1)))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
940 (if (eobp) nil (forward-char 36)))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
941
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
942 (defun tar-unflag (p)
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
943 "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
944 With a prefix argument, un-mark that many files forward."
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
945 (interactive "p")
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
946 (tar-flag-deleted p t))
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 (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
949 "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
950 With a prefix argument, un-mark that many files backward."
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
951 (interactive "p")
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
952 (tar-flag-deleted (- p) t))
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
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
955 (defun tar-expunge-internal ()
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
956 "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
957 (let ((descriptor (tar-current-descriptor)))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
958 ;;
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
959 ;; 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
960 (delete-region (line-beginning-position) (line-beginning-position 2))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
961 ;;
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
962 ;; delete the data pointer...
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
963 (setq tar-parse-info (delq descriptor tar-parse-info))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
964 ;;
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
965 ;; 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
966 (with-current-buffer tar-data-buffer
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
967 (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
968 (- (tar-header-data-start descriptor) 512))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
969 (tar-header-data-end descriptor)))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
970
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
971
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
972 (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
973 "In Tar mode, delete all the archived files flagged for deletion.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
974 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
975 for this to be permanent."
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
976 (interactive)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
977 (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
978 (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
979 (let ((n 0))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
980 (save-excursion
29646
e57c6c814e3f (tar-extract): For goto-char, use (point-min), not
Kenichi Handa <handa@m17n.org>
parents: 29534
diff changeset
981 (goto-char (point-min))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
982 (while (not (eobp))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
983 (if (looking-at "D")
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
984 (progn (tar-expunge-internal)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
985 (setq n (1+ n)))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
986 (forward-line 1)))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
987 ;; 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
988 (tar-pad-to-blocksize))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
989 (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
990 (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
991 (message "%s files expunged. Be sure to save this buffer." n)))))
212
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-clear-modification-flags ()
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
995 "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
996 (interactive)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
997 (save-excursion
29646
e57c6c814e3f (tar-extract): For goto-char, use (point-min), not
Kenichi Handa <handa@m17n.org>
parents: 29534
diff changeset
998 (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
999 (while (not (eobp))
74243
b5548562a340 (tar-header-block-summarize, tar-clear-modification-flags): "?\ " -> "?\s".
Juanma Barranquero <lekktu@gmail.com>
parents: 70945
diff changeset
1000 (if (not (eq (following-char) ?\s))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1001 (progn (delete-char 1) (insert " ")))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1002 (forward-line 1))))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1003
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1004
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1005 (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
1006 "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
1007 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
1008 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
1009 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
1010 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
1011 for this to be permanent."
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1012 (interactive
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1013 (list
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1014 (let ((descriptor (tar-current-descriptor)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1015 (if (or current-prefix-arg
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1016 (not (tar-header-magic descriptor)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1017 (read-number
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1018 "New UID number: "
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1019 (format "%s" (tar-header-uid descriptor)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1020 (read-string "New UID string: " (tar-header-uname descriptor))))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1021 (cond ((stringp new-uid)
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1022 (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
1023 (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
1024 (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
1025 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
1026 "\000")))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1027 (t
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1028 (setf (tar-header-uid (tar-current-descriptor)) new-uid)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1029 (tar-alter-one-field tar-uid-offset
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1030 (concat (substring (format "%6o" new-uid) 0 6) "\000 ")))))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1031
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1032
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1033 (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
1034 "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
1035 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
1036 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
1037 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
1038 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
1039 for this to be permanent."
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1040 (interactive
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1041 (list
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1042 (let ((descriptor (tar-current-descriptor)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1043 (if (or current-prefix-arg
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1044 (not (tar-header-magic descriptor)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1045 (read-number
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1046 "New GID number: "
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1047 (format "%s" (tar-header-gid descriptor)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1048 (read-string "New GID string: " (tar-header-gname descriptor))))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1049 (cond ((stringp new-gid)
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1050 (setf (tar-header-gname (tar-current-descriptor)) new-gid)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1051 (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
1052 (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
1053 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
1054 "\000")))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1055 (t
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1056 (setf (tar-header-gid (tar-current-descriptor)) new-gid)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1057 (tar-alter-one-field tar-gid-offset
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1058 (concat (substring (format "%6o" new-gid) 0 6) "\000 ")))))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1059
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1060 (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
1061 "Change the name associated with this entry in the tar file.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1062 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
1063 for this to be permanent."
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1064 (interactive
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1065 (list (read-string "New name: "
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1066 (tar-header-name (tar-current-descriptor)))))
6611
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
1067 (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
1068 (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
1069 tar-file-name-coding-system))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1070 (descriptor (tar-current-descriptor))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1071 (prefix nil))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1072 (when (tar-header-header-start descriptor)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1073 ;; FIXME: Make it work for ././@LongLink.
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1074 (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
1075
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1076 (when (and (> (length encoded-new-name) 98)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1077 (string-match "/" encoded-new-name
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1078 (- (length encoded-new-name) 99))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1079 (< (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
1080 (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
1081 (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
1082 (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
1083 (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
1084
88955
1d1275f5d5b7 (tar-file-name-coding-system): New variable. Make
Kenichi Handa <handa@m17n.org>
parents: 43424
diff changeset
1085 (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
1086 (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
1087 (tar-alter-one-field 0
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1088 (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
1089 (if prefix
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1090 (tar-alter-one-field tar-prefix-offset
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1091 (substring (concat prefix (make-string 155 0)) 0 155)))))
212
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
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1094 (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
1095 "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
1096 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
1097 for this to be permanent."
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1098 (interactive (list (tar-parse-octal-integer-safe
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1099 (read-string "New protection (octal): "))))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1100 (setf (tar-header-mode (tar-current-descriptor)) new-mode)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1101 (tar-alter-one-field tar-mode-offset
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1102 (concat (substring (format "%6o" new-mode) 0 6) "\000 ")))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1103
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1104
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1105 (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
1106 (unless descriptor (setq descriptor (tar-current-descriptor)))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1107 ;;
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1108 ;; update the header-line.
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1109 (let ((col (current-column)))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1110 (delete-region (line-beginning-position)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1111 (prog2 (forward-line 1)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1112 (point)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1113 ;; 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
1114 ;; 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
1115 (insert (tar-header-block-summarize descriptor) "\n")))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1116 (forward-line -1) (move-to-column col))
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47656
diff changeset
1117
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1118 (assert (tar-data-swapped-p))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1119 (with-current-buffer tar-data-buffer
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1120 (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
1121 ;;
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1122 ;; 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
1123 (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
1124 (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
1125 (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
1126 (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
1127 (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
1128 ;;
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1129 ;; 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
1130 (let ((chk (tar-header-block-checksum
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1131 (buffer-substring start (+ start 512)))))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1132 (goto-char (+ start tar-chk-offset))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1133 (delete-region (point) (+ (point) 8))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1134 (insert (format "%6o\0 " chk))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1135 (setf (tar-header-checksum descriptor) chk)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1136 ;;
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1137 ;; 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
1138 (tar-header-block-check-checksum
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1139 (buffer-substring start (+ start 512))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1140 chk (tar-header-name descriptor))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1141 ))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1142
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1143
880
52a05f4884a4 entered into RCS
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 840
diff changeset
1144 (defun tar-octal-time (timeval)
52a05f4884a4 entered into RCS
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 840
diff changeset
1145 ;; 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
1146 (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
1147 (format "%05o%01o%05o"
eed727396dd0 (tar-octal-time): Fix last change.
Eli Zaretskii <eliz@gnu.org>
parents: 45329
diff changeset
1148 (lsh hibits -2)
eed727396dd0 (tar-octal-time): Fix last change.
Eli Zaretskii <eliz@gnu.org>
parents: 45329
diff changeset
1149 (logior (lsh (logand 3 hibits) 1)
eed727396dd0 (tar-octal-time): Fix last change.
Eli Zaretskii <eliz@gnu.org>
parents: 45329
diff changeset
1150 (if (> (logand lobits 32768) 0) 1 0))
eed727396dd0 (tar-octal-time): Fix last change.
Eli Zaretskii <eliz@gnu.org>
parents: 45329
diff changeset
1151 (logand 32767 lobits)
eed727396dd0 (tar-octal-time): Fix last change.
Eli Zaretskii <eliz@gnu.org>
parents: 45329
diff changeset
1152 )))
880
52a05f4884a4 entered into RCS
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 840
diff changeset
1153
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1154 (defun tar-subfile-save-buffer ()
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
1155 "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
1156 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
1157 to make your changes permanent."
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1158 (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
1159 (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
1160 (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
1161 (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
1162 (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
1163 (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
1164 (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
1165 (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
1166 subfile-size)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1167 (with-current-buffer tar-superior-buffer
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1168 (let* ((start (tar-header-data-start descriptor))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1169 (name (tar-header-name descriptor))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1170 (size (tar-header-size descriptor))
95370
fafc513e04bc (tar-summarize-buffer): Fix reporter initialization.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95347
diff changeset
1171 (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
1172 (if (not head)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1173 (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
1174 (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
1175 ;; 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
1176 (let* ((data-start start)
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1177 (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
1178 (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
1179 (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
1180 ;; 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
1181 (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
1182 (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
1183 (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
1184 (save-restriction
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1185 (widen)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1186 (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
1187 (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
1188 ;;
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1189 ;; 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
1190 (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
1191 (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
1192 (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
1193 ;;
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1194 ;; update the data of this files...
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1195 (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
1196 ;;
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1197 ;; 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
1198 (widen))))
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1199 ;;
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1200 ;; 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
1201 ;;
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1202 (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
1203 (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
1204 (forward-line position)
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1205 (tar-alter-one-field tar-size-offset (format "%11o " subfile-size))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1206 ;;
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1207 ;; Maybe update the datestamp.
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1208 (when tar-update-datestamp
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1209 (tar-alter-one-field tar-time-offset
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1210 (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
1211 ;; 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
1212 (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
1213 (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
1214 (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
1215 (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
1216 (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
1217 (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
1218 ;; 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
1219 (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
1220 ;; 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
1221 t))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1222
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1223
23716
d30ffa793626 (tar-header-block-tokenize): Decode codes of file
Kenichi Handa <handa@m17n.org>
parents: 23482
diff changeset
1224 ;; 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
1225 (defun tar-pad-to-blocksize ()
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1226 "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
1227 Leaves the region wide."
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1228 (if (null tar-anal-blocksize)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1229 nil
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1230 (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
1231 (start (tar-header-data-start last-desc))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1232 (link-p (tar-header-link-type last-desc))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1233 (size (if link-p 0 (tar-header-size last-desc)))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1234 (data-end (+ start size))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1235 (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
1236 (pad-to (+ bbytes (* bbytes (/ (- data-end (point-min)) bbytes)))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1237 ;; If the padding after the last data is too long, delete some;
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1238 ;; 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
1239 ;;
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1240 (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
1241 (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
1242 (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
1243 (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
1244 (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
1245 (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
1246
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
1247
100935
e55ce6002e3d (tar-mode, tar-mode-write-contents)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100908
diff changeset
1248 ;; 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
1249 (defun tar-write-region-annotate (start end)
e55ce6002e3d (tar-mode, tar-mode-write-contents)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100908
diff changeset
1250 ;; 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
1251 ;; 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
1252 ;; (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
1253 (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
1254 (tar-clear-modification-flags)
100935
e55ce6002e3d (tar-mode, tar-mode-write-contents)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100908
diff changeset
1255 (set-buffer tar-data-buffer)
e55ce6002e3d (tar-mode, tar-mode-write-contents)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100908
diff changeset
1256 nil))
100787
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
1257
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1258 (provide 'tar-mode)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1259
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
1260 ;; arch-tag: 8a585a4a-340e-42c2-89e7-d3b1013a4b78
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 584
diff changeset
1261 ;;; tar-mode.el ends here