annotate lisp/tar-mode.el @ 112119:48f5ac42611a

Reconcile with changes in line movement behavior for long text lines that cross more than a single physical window line, ie when truncate-lines is nil. (allout-next-visible-heading): Provide for change in line-move behavior on long lines when truncate-lines is nil. In that case, line-move can wind up on the same textual line when it moves to the next window line, and moving to the bullet position after the move yields zero advancement. Add logic to detect and compensate for the lack of progress. (allout-current-topic-collapsed-p): move-end-of-line respect for field boundaries is different when operating with body lines shorter than window width versus ones greater than window width, which can yield false negatives in this function. Avoid difference by applying move-end-of-line while field-text-motion is inhibited.
author Ken Manheimer <ken.manheimer@gmail.com>
date Tue, 04 Jan 2011 14:44:10 -0500
parents 6a7fb61524be
children 417b1e4d63cd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 584
diff changeset
1 ;;; tar-mode.el --- simple editing of tar files from GNU emacs
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2
64762
41bb365f41c4 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 64431
diff changeset
3 ;; Copyright (C) 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
106815
1d1d5d9bd884 Add 2010 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 105889
diff changeset
4 ;; 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
104823
68150c643e2e Use default-value rather than default-enable-multibyte-characters.
Glenn Morris <rgm@gnu.org>
parents: 103321
diff changeset
5 ;; Free Software Foundation, Inc.
840
113281b361ec *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 814
diff changeset
6
775
1ca26ccad38e *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
7 ;; Author: Jamie Zawinski <jwz@lucid.com>
21045
cc3f3c1ea725 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 20970
diff changeset
8 ;; Maintainer: FSF
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 775
diff changeset
9 ;; Created: 04 Apr 1990
814
38b2499cb3e9 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 807
diff changeset
10 ;; Keywords: unix
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
12 ;; This file is part of GNU Emacs.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
13
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94296
diff changeset
14 ;; GNU Emacs is free software: you can redistribute it and/or modify
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
15 ;; it under the terms of the GNU General Public License as published by
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94296
diff changeset
16 ;; the Free Software Foundation, either version 3 of the License, or
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94296
diff changeset
17 ;; (at your option) any later version.
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
18
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
19 ;; GNU Emacs is distributed in the hope that it will be useful,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
20 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
21 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
22 ;; GNU General Public License for more details.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
23
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
24 ;; You should have received a copy of the GNU General Public License
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94296
diff changeset
25 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
26
775
1ca26ccad38e *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
27 ;;; Commentary:
1ca26ccad38e *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
28
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
29 ;; This package attempts to make dealing with Unix 'tar' archives easier.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
30 ;; When this code is loaded, visiting a file whose name ends in '.tar' will
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
31 ;; cause the contents of that archive file to be displayed in a Dired-like
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
32 ;; listing. It is then possible to use the customary Dired keybindings to
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
33 ;; extract sub-files from that archive, either by reading them into their own
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
34 ;; editor buffers, or by copying them directly to arbitrary files on disk.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
35 ;; It is also possible to delete sub-files from within the tar file and write
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
36 ;; the modified archive back to disk, or to edit sub-files within the archive
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
37 ;; and re-insert the modified files into the archive. See the documentation
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
38 ;; string of tar-mode for more info.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
39
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
40 ;; This code now understands the extra fields that GNU tar adds to tar files.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
41
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
42 ;; This interacts correctly with "uncompress.el" in the Emacs library,
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47656
diff changeset
43 ;; which you get with
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
44 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
45 ;; (autoload 'uncompress-while-visiting "uncompress")
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
46 ;; (setq auto-mode-alist (cons '("\\.Z$" . uncompress-while-visiting)
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
47 ;; auto-mode-alist))
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
48 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
49 ;; Do not attempt to use tar-mode.el with crypt.el, you will lose.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
50
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47656
diff changeset
51 ;; *************** TO DO ***************
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
52 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
53 ;; o chmod should understand "a+x,og-w".
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
54 ;;
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47656
diff changeset
55 ;; o It's not possible to add a NEW file to a tar archive; not that
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
56 ;; important, but still...
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
57 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
58 ;; o The code is less efficient that it could be - in a lot of places, I
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
59 ;; pull a 512-character string out of the buffer and parse it, when I could
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
60 ;; be parsing it in place, not garbaging a string. Should redo that.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
61 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
62 ;; o I'd like a command that searches for a string/regexp in every subfile
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
63 ;; of an archive, where <esc> would leave you in a subfile-edit buffer.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
64 ;; (Like the Meta-R command of the Zmacs mail reader.)
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
65 ;;
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47656
diff changeset
66 ;; o Sometimes (but not always) reverting the tar-file buffer does not
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
67 ;; re-grind the listing, and you are staring at the binary tar data.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
68 ;; Typing 'g' again immediately after that will always revert and re-grind
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
69 ;; it, though. I have no idea why this happens.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
70 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
71 ;; o Tar-mode interacts poorly with crypt.el and zcat.el because the tar
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
72 ;; write-file-hook actually writes the file. Instead it should remove the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
73 ;; header (and conspire to put it back afterwards) so that other write-file
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
74 ;; hooks which frob the buffer have a chance to do their dirty work. There
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
75 ;; might be a problem if the tar write-file-hook does not come *first* on
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
76 ;; the list.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
77 ;;
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47656
diff changeset
78 ;; o Block files, sparse files, continuation files, and the various header
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
79 ;; types aren't editable. Actually I don't know that they work at all.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
80
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
81 ;; Rationale:
7103
b5fad00fa757 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 7090
diff changeset
82
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
83 ;; Why does tar-mode edit the file itself instead of using tar?
7103
b5fad00fa757 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 7090
diff changeset
84
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
85 ;; That means that you can edit tar files which you don't have room for
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
86 ;; on your local disk.
7103
b5fad00fa757 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 7090
diff changeset
87
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
88 ;; I don't know about recent features in gnu tar, but old versions of tar
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
89 ;; can't replace a file in the middle of a tar file with a new version.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
90 ;; Tar-mode can. I don't think tar can do things like chmod the subfiles.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
91 ;; An implementation which involved unpacking and repacking the file into
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
92 ;; some scratch directory would be very wasteful, and wouldn't be able to
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
93 ;; preserve the file owners.
7103
b5fad00fa757 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 7090
diff changeset
94
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
95 ;;; Bugs:
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
96
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
97 ;; - Rename on ././@LongLink files
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
98 ;; - Revert confirmation displays the raw data temporarily.
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
99
775
1ca26ccad38e *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
100 ;;; Code:
1ca26ccad38e *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
101
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
102 (eval-when-compile (require 'cl))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
103
20808
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
104 (defgroup tar nil
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
105 "Simple editing of tar files."
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
106 :prefix "tar-"
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
107 :group 'data)
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
108
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
109 (defcustom tar-anal-blocksize 20
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
110 "The blocksize of tar files written by Emacs, or nil, meaning don't care.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
111 The blocksize of a tar file is not really the size of the blocks; rather, it is
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47656
diff changeset
112 the number of blocks written with one system call. When tarring to a tape,
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
113 this is the size of the *tape* blocks, but when writing to a file, it doesn't
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
114 matter much. The only noticeable difference is that if a tar file does not
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
115 have a blocksize of 20, tar will tell you that; all this really controls is
20808
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
116 how many null padding bytes go on the end of the tar file."
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
117 :type '(choice integer (const nil))
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
118 :group 'tar)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
119
20808
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
120 (defcustom tar-update-datestamp nil
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
121 "Non-nil means Tar mode should play fast and loose with sub-file datestamps.
10843
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
122 If this is true, then editing and saving a tar file entry back into its
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
123 tar file will update its datestamp. If false, the datestamp is unchanged.
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
124 You may or may not want this - it is good in that you can tell when a file
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
125 in a tar archive has been changed, but it is bad for the same reason that
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47656
diff changeset
126 editing a file in the tar archive at all is bad - the changed version of
20808
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
127 the file never exists on disk."
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
128 :type 'boolean
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
129 :group 'tar)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
130
20808
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
131 (defcustom tar-mode-show-date nil
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
132 "Non-nil means Tar mode should show the date/time of each subfile.
20808
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
133 This information is useful, but it takes screen space away from file names."
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
134 :type 'boolean
e1e1f6fd72bd Customized.
Stephen Eglen <stephen@gnu.org>
parents: 20254
diff changeset
135 :group 'tar)
10843
2f2e5033b3bb (tar-header-block-tokenize): Parse 32-bit modtime
Richard M. Stallman <rms@gnu.org>
parents: 10271
diff changeset
136
2542
ae4176e2e8fa Add defvars to pacify the byte compiler, at RMS's request.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 880
diff changeset
137 (defvar tar-parse-info nil)
ae4176e2e8fa Add defvars to pacify the byte compiler, at RMS's request.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 880
diff changeset
138 (defvar tar-superior-buffer nil)
ae4176e2e8fa Add defvars to pacify the byte compiler, at RMS's request.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 880
diff changeset
139 (defvar tar-superior-descriptor nil)
88955
1d1275f5d5b7 (tar-file-name-coding-system): New variable. Make
Kenichi Handa <handa@m17n.org>
parents: 43424
diff changeset
140 (defvar tar-file-name-coding-system nil)
4260
e0713a13f2d7 (tar-parse-info, tar-header-offset, tar-superior-buffer)
Richard M. Stallman <rms@gnu.org>
parents: 4120
diff changeset
141
e0713a13f2d7 (tar-parse-info, tar-header-offset, tar-superior-buffer)
Richard M. Stallman <rms@gnu.org>
parents: 4120
diff changeset
142 (put 'tar-superior-buffer 'permanent-local t)
e0713a13f2d7 (tar-parse-info, tar-header-offset, tar-superior-buffer)
Richard M. Stallman <rms@gnu.org>
parents: 4120
diff changeset
143 (put 'tar-superior-descriptor 'permanent-local t)
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
144
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
145 ;; The Tar data is made up of bytes and better manipulated as bytes
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
146 ;; and can be very large, so insert/delete can be costly. The summary we
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
147 ;; want to display may contain non-ascci chars, of course, so we'd like it
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
148 ;; to be multibyte. We used to keep both in the same buffer and switch
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
149 ;; from/to uni/multibyte. But this had several downsides:
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
150 ;; - set-buffer-multibyte has an O(N^2) worst case that tends to be triggered
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
151 ;; here, so it gets atrociously slow on large Tar files.
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
152 ;; - need to widen/narrow the buffer to show/hide the raw data, and need to
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
153 ;; maintain a tar-header-offset that keeps track of the boundary between
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
154 ;; the two.
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
155 ;; - can't use markers because they're not preserved by set-buffer-multibyte.
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
156 ;; So instead, we now keep the two pieces of data in separate buffers, and
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
157 ;; use the new buffer-swap-text primitive when we need to change which data
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
158 ;; is associated with "the" buffer.
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
159 (defvar tar-data-buffer nil "Buffer that holds the actual raw tar bytes.")
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
160 (make-variable-buffer-local 'tar-data-buffer)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
161
100787
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
162 (defvar tar-data-swapped nil
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
163 "If non-nil, `tar-data-buffer' indeed holds raw tar bytes.")
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
164 (make-variable-buffer-local 'tar-data-swapped)
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
165
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
166 (defun tar-data-swapped-p ()
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
167 "Return non-nil if the tar-data is in `tar-data-buffer'."
100787
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
168 (and (buffer-live-p tar-data-buffer)
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
169 ;; Sanity check to try and make sure tar-data-swapped tracks the swap
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
170 ;; state correctly: the raw data is expected to be always larger than
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
171 ;; the summary.
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
172 (progn
105653
8177db6744a6 (tar-data-swapped-p): Make the assertion a bit more
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 104823
diff changeset
173 (assert (or (= (buffer-size tar-data-buffer) (buffer-size))
8177db6744a6 (tar-data-swapped-p): Make the assertion a bit more
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 104823
diff changeset
174 (eq tar-data-swapped
8177db6744a6 (tar-data-swapped-p): Make the assertion a bit more
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 104823
diff changeset
175 (> (buffer-size tar-data-buffer) (buffer-size)))))
100787
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
176 tar-data-swapped)))
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
177
100698
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
178 (defun tar-swap-data ()
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
179 "Swap buffer contents between current buffer and `tar-data-buffer'.
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
180 Preserve the modified states of the buffers and set `buffer-swapped-with'."
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
181 (let ((data-buffer-modified-p (buffer-modified-p tar-data-buffer))
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
182 (current-buffer-modified-p (buffer-modified-p)))
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
183 (buffer-swap-text tar-data-buffer)
100787
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
184 (setq tar-data-swapped (not tar-data-swapped))
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
185 (restore-buffer-modified-p data-buffer-modified-p)
100698
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
186 (with-current-buffer tar-data-buffer
100787
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
187 (restore-buffer-modified-p current-buffer-modified-p))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
188
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
189 ;;; down to business.
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
190
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
191 (defstruct (tar-header
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
192 (:constructor nil)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
193 (:type vector)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
194 :named
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
195 (:constructor
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
196 make-tar-header (data-start name mode uid gid size date checksum
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
197 link-type link-name magic uname gname dmaj dmin)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
198 data-start name mode uid gid size date checksum link-type link-name
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
199 magic uname gname dmaj dmin
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
200 ;; Start of the header can be nil (meaning it's 512 bytes before data-start)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
201 ;; or a marker (in case the header uses LongLink thingies).
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
202 header-start)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
203
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
204 (defconst tar-name-offset 0)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
205 (defconst tar-mode-offset (+ tar-name-offset 100))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
206 (defconst tar-uid-offset (+ tar-mode-offset 8))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
207 (defconst tar-gid-offset (+ tar-uid-offset 8))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
208 (defconst tar-size-offset (+ tar-gid-offset 8))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
209 (defconst tar-time-offset (+ tar-size-offset 12))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
210 (defconst tar-chk-offset (+ tar-time-offset 12))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
211 (defconst tar-linkp-offset (+ tar-chk-offset 8))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
212 (defconst tar-link-offset (+ tar-linkp-offset 1))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
213 ;;; GNU-tar specific slots.
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
214 (defconst tar-magic-offset (+ tar-link-offset 100))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
215 (defconst tar-uname-offset (+ tar-magic-offset 8))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
216 (defconst tar-gname-offset (+ tar-uname-offset 32))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
217 (defconst tar-dmaj-offset (+ tar-gname-offset 32))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
218 (defconst tar-dmin-offset (+ tar-dmaj-offset 8))
94270
e1d36e944ae0 (tar-prefix-offset): New constant.
Juri Linkov <juri@jurta.org>
parents: 93612
diff changeset
219 (defconst tar-prefix-offset (+ tar-dmin-offset 8))
e1d36e944ae0 (tar-prefix-offset): New constant.
Juri Linkov <juri@jurta.org>
parents: 93612
diff changeset
220 (defconst tar-end-offset (+ tar-prefix-offset 155))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
221
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
222 (defun tar-roundup-512 (s)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
223 "Round S up to the next multiple of 512."
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
224 (ash (ash (+ s 511) -9) 9))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
225
100698
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
226 (defun tar-header-block-tokenize (pos coding)
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
227 "Return a `tar-header' structure.
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47656
diff changeset
228 This is a list of name, mode, uid, gid, size,
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
229 write-date, checksum, link-type, and link-name."
102525
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
230 (if (> (+ pos 512) (point-max)) (error "Malformed Tar header"))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
231 (assert (zerop (mod (- pos (point-min)) 512)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
232 (assert (not enable-multibyte-characters))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
233 (let ((string (buffer-substring pos (setq pos (+ pos 512)))))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
234 (when ;(some 'plusp string) ; <-- oops, massive cycle hog!
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
235 (or (not (= 0 (aref string 0))) ; This will do.
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
236 (not (= 0 (aref string 101))))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
237 (let* ((name-end tar-mode-offset)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
238 (link-end (1- tar-magic-offset))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
239 (uname-end (1- tar-gname-offset))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
240 (gname-end (1- tar-dmaj-offset))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
241 (link-p (aref string tar-linkp-offset))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
242 (magic-str (substring string tar-magic-offset
101136
ef524a34d985 (tar-header-block-tokenize): Properly ignore the version
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100935
diff changeset
243 ;; The magic string is actually 6bytes
ef524a34d985 (tar-header-block-tokenize): Properly ignore the version
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100935
diff changeset
244 ;; of magic string plus 2bytes of version
ef524a34d985 (tar-header-block-tokenize): Properly ignore the version
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100935
diff changeset
245 ;; which we here ignore.
ef524a34d985 (tar-header-block-tokenize): Properly ignore the version
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100935
diff changeset
246 (- tar-uname-offset 2)))
ef524a34d985 (tar-header-block-tokenize): Properly ignore the version
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100935
diff changeset
247 ;; The magic string is "ustar\0" for POSIX format, and
ef524a34d985 (tar-header-block-tokenize): Properly ignore the version
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100935
diff changeset
248 ;; "ustar " for GNU Tar's format.
ef524a34d985 (tar-header-block-tokenize): Properly ignore the version
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100935
diff changeset
249 (uname-valid-p (car (member magic-str '("ustar " "ustar\0"))))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
250 name linkname
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
251 (nulsexp "[^\000]*\000"))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
252 (when (string-match nulsexp string tar-name-offset)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
253 (setq name-end (min name-end (1- (match-end 0)))))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
254 (when (string-match nulsexp string tar-link-offset)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
255 (setq link-end (min link-end (1- (match-end 0)))))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
256 (when (string-match nulsexp string tar-uname-offset)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
257 (setq uname-end (min uname-end (1- (match-end 0)))))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
258 (when (string-match nulsexp string tar-gname-offset)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
259 (setq gname-end (min gname-end (1- (match-end 0)))))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
260 (setq name (substring string tar-name-offset name-end)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
261 link-p (if (or (= link-p 0) (= link-p ?0))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
262 nil
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
263 (- link-p ?0)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
264 (setq linkname (substring string tar-link-offset link-end))
101136
ef524a34d985 (tar-header-block-tokenize): Properly ignore the version
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100935
diff changeset
265 (when (and (equal uname-valid-p "ustar\0")
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
266 (string-match nulsexp string tar-prefix-offset)
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
267 (> (match-end 0) (1+ tar-prefix-offset)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
268 (setq name (concat (substring string tar-prefix-offset
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
269 (1- (match-end 0)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
270 "/" name)))
104823
68150c643e2e Use default-value rather than default-enable-multibyte-characters.
Glenn Morris <rgm@gnu.org>
parents: 103321
diff changeset
271 (if (default-value 'enable-multibyte-characters)
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
272 (setq name
100698
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
273 (decode-coding-string name coding)
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
274 linkname
100698
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
275 (decode-coding-string linkname coding)))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
276 (if (and (null link-p) (string-match "/\\'" name))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
277 (setq link-p 5)) ; directory
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
278
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
279 (if (and (equal name "././@LongLink")
103321
f50defb23b3e (tar-header-block-tokenize): Obey @LongLink even for
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 102546
diff changeset
280 ;; Supposedly @LongLink is only used for GNUTAR
f50defb23b3e (tar-header-block-tokenize): Obey @LongLink even for
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 102546
diff changeset
281 ;; format (i.e. "ustar ") but some POSIX Tar files
f50defb23b3e (tar-header-block-tokenize): Obey @LongLink even for
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 102546
diff changeset
282 ;; (with "ustar\0") have been seen using it as well.
f50defb23b3e (tar-header-block-tokenize): Obey @LongLink even for
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 102546
diff changeset
283 (member magic-str '("ustar " "ustar\0")))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
284 ;; This is a GNU Tar long-file-name header.
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
285 (let* ((size (tar-parse-octal-integer
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
286 string tar-size-offset tar-time-offset))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
287 ;; -1 so as to strip the terminating 0 byte.
110620
cdab39f69698 tar-mode.el (tar-header-block-tokenize): Decode filenames in "ustar" format.
Kenichi Handa <handa@m17n.org>
parents: 106815
diff changeset
288 (name (decode-coding-string
cdab39f69698 tar-mode.el (tar-header-block-tokenize): Decode filenames in "ustar" format.
Kenichi Handa <handa@m17n.org>
parents: 106815
diff changeset
289 (buffer-substring pos (+ pos size -1)) coding))
95347
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
108220
0b37f86b040e Use define-minor-mode where applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107897
diff changeset
675 (define-minor-mode tar-subfile-mode
212
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."
108220
0b37f86b040e Use define-minor-mode where applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107897
diff changeset
680 ;; Don't do this, because it is redundant and wastes mode line space.
0b37f86b040e Use define-minor-mode where applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107897
diff changeset
681 ;; :lighter " TarFile"
0b37f86b040e Use define-minor-mode where applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107897
diff changeset
682 nil nil nil
2542
ae4176e2e8fa Add defvars to pacify the byte compiler, at RMS's request.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 880
diff changeset
683 (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
684 (error "This buffer is not an element of a tar file"))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
685 (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
686 (add-hook 'write-file-functions 'tar-subfile-save-buffer nil t)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
687 ;; turn off auto-save.
22032
e27e9e844efe (tar-subfile-mode): Call auto-save-mode with -1.
Dave Love <fx@gnu.org>
parents: 21851
diff changeset
688 (auto-save-mode -1)
108220
0b37f86b040e Use define-minor-mode where applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107897
diff changeset
689 (setq buffer-auto-save-file-name nil))
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
690 (t
46926
dd4d628efd2e (tar-subfile-mode): Use add-hook and remove-hook, and use
Richard M. Stallman <rms@gnu.org>
parents: 45348
diff changeset
691 (remove-hook 'write-file-functions 'tar-subfile-save-buffer t))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
692
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
693
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
694 ;; 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
695 (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
696 (unwind-protect
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
697 (let ((revert-buffer-function nil))
100698
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
698 (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
699 ;; 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
700 ;; 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
701 (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
702 ;; 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
703 (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
704 (tar-mode))
100698
2ff8670c7e9f (tar-swap-data): New function.
Andreas Schwab <schwab@suse.de>
parents: 95452
diff changeset
705 (unless (tar-data-swapped-p) (tar-swap-data))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
706
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
707
43424
444fb6708a66 (tar-next-line, tar-previous-line): Add doc string,
Pavel Janík <Pavel@Janik.cz>
parents: 41170
diff changeset
708 (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
709 "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
710 (interactive "p")
43424
444fb6708a66 (tar-next-line, tar-previous-line): Add doc string,
Pavel Janík <Pavel@Janik.cz>
parents: 41170
diff changeset
711 (forward-line arg)
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
712 (goto-char (or (next-single-property-change (point) 'mouse-face) (point))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
713
43424
444fb6708a66 (tar-next-line, tar-previous-line): Add doc string,
Pavel Janík <Pavel@Janik.cz>
parents: 41170
diff changeset
714 (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
715 "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
716 (interactive "p")
43424
444fb6708a66 (tar-next-line, tar-previous-line): Add doc string,
Pavel Janík <Pavel@Janik.cz>
parents: 41170
diff changeset
717 (tar-next-line (- arg)))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
718
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
719 (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
720 "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
721 ;; 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
722 (or (nth (count-lines (point-min) (line-beginning-position))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
723 tar-parse-info)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
724 (if noerror
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
725 nil
6611
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
726 (error "This line does not describe a tar-file entry"))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
727
6611
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
728 (defun tar-get-descriptor ()
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
729 (let* ((descriptor (tar-current-descriptor))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
730 (size (tar-header-size descriptor))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
731 (link-p (tar-header-link-type descriptor)))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
732 (if link-p
77925
3da77a559100 (tar-header-block-summarize, tar-summarize-buffer)
Chong Yidong <cyd@stupidchicken.com>
parents: 77788
diff changeset
733 (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
734 (cond ((eq link-p 5) "a directory")
3da77a559100 (tar-header-block-summarize, tar-summarize-buffer)
Chong Yidong <cyd@stupidchicken.com>
parents: 77788
diff changeset
735 ((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
736 ((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
737 ((eq link-p 29) "a multivolume-continuation")
3da77a559100 (tar-header-block-summarize, tar-summarize-buffer)
Chong Yidong <cyd@stupidchicken.com>
parents: 77788
diff changeset
738 ((eq link-p 35) "a sparse entry")
3da77a559100 (tar-header-block-summarize, tar-summarize-buffer)
Chong Yidong <cyd@stupidchicken.com>
parents: 77788
diff changeset
739 ((eq link-p 38) "a volume header")
3da77a559100 (tar-header-block-summarize, tar-summarize-buffer)
Chong Yidong <cyd@stupidchicken.com>
parents: 77788
diff changeset
740 ((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
741 (t "a link"))))
78128
aec26e5eba68 (tar-get-descriptor): No error for zero-length file.
Richard M. Stallman <rms@gnu.org>
parents: 77925
diff changeset
742 (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
743 descriptor))
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
744
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
745 (defun tar-mouse-extract (event)
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
746 "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
747 (interactive "e")
91801
8e06d480f634 Fix broken indentation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 91367
diff changeset
748 (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
749 (save-excursion
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
750 (goto-char (posn-point (event-end event)))
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
751 ;; Just make sure this doesn't get an error.
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
752 (tar-get-descriptor)))
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
753 (select-window (posn-window (event-end event)))
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
754 (goto-char (posn-point (event-end event)))
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
755 (tar-extract))
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
756
77788
b5a6f9693d00 (tar-file-name-handler): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 75347
diff changeset
757 (defun tar-file-name-handler (op &rest args)
b5a6f9693d00 (tar-file-name-handler): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 75347
diff changeset
758 "Helper function for `tar-extract'."
b5a6f9693d00 (tar-file-name-handler): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 75347
diff changeset
759 (or (eq op 'file-exists-p)
b5a6f9693d00 (tar-file-name-handler): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 75347
diff changeset
760 (let ((file-name-handler-alist nil))
b5a6f9693d00 (tar-file-name-handler): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 75347
diff changeset
761 (apply op args))))
b5a6f9693d00 (tar-file-name-handler): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 75347
diff changeset
762
6611
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
763 (defun tar-extract (&optional other-window-p)
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
764 "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
765 (interactive)
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
766 (let* ((view-p (eq other-window-p 'view))
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
767 (descriptor (tar-get-descriptor))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
768 (name (tar-header-name descriptor))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
769 (size (tar-header-size descriptor))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
770 (start (tar-header-data-start descriptor))
6611
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
771 (end (+ start size)))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
772 (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
773 (tarname (buffer-name))
38719
03376ff9ccfd (tar-extract): Avoid generating a new buffer
Gerd Moellmann <gerd@gnu.org>
parents: 38081
diff changeset
774 (bufname (concat (file-name-nondirectory name)
03376ff9ccfd (tar-extract): Avoid generating a new buffer
Gerd Moellmann <gerd@gnu.org>
parents: 38081
diff changeset
775 " ("
38053
3e512ad7ce98 (tar-extract): Call generate-new-buffer-name to
Eli Zaretskii <eliz@gnu.org>
parents: 37634
diff changeset
776 tarname
38719
03376ff9ccfd (tar-extract): Avoid generating a new buffer
Gerd Moellmann <gerd@gnu.org>
parents: 38081
diff changeset
777 ")"))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
778 (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
779 (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
780 ;; `:' 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
781 (concat tarname "!"
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
782 (if (string-match "/" name)
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
783 name
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
784 ;; Make sure `name' contains a /
438d27553e81 (tar-header-block-tokenize): Presume less, check more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101220
diff changeset
785 ;; 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
786 ;; 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
787 (concat "./" name)))))
38719
03376ff9ccfd (tar-extract): Avoid generating a new buffer
Gerd Moellmann <gerd@gnu.org>
parents: 38081
diff changeset
788 (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
789 (just-created nil)
90073
f02550ff43d0 (tar-extract): Adjust code merged from trunk for
Kenichi Handa <handa@m17n.org>
parents: 90043
diff changeset
790 undo-list)
38719
03376ff9ccfd (tar-extract): Avoid generating a new buffer
Gerd Moellmann <gerd@gnu.org>
parents: 38081
diff changeset
791 (unless buffer
34495
390a9f3dd80c (tar-extract): Base the name of the subfile buffer
Andreas Schwab <schwab@suse.de>
parents: 29646
diff changeset
792 (setq buffer (generate-new-buffer bufname))
91801
8e06d480f634 Fix broken indentation.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 91367
diff changeset
793 (with-current-buffer buffer
90073
f02550ff43d0 (tar-extract): Adjust code merged from trunk for
Kenichi Handa <handa@m17n.org>
parents: 90043
diff changeset
794 (setq undo-list buffer-undo-list
f02550ff43d0 (tar-extract): Adjust code merged from trunk for
Kenichi Handa <handa@m17n.org>
parents: 90043
diff changeset
795 buffer-undo-list t))
34495
390a9f3dd80c (tar-extract): Base the name of the subfile buffer
Andreas Schwab <schwab@suse.de>
parents: 29646
diff changeset
796 (setq bufname (buffer-name buffer))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
797 (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
798 (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
799 (let (coding)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
800 (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
801 (goto-char start)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
802 (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
803 (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
804 (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
805 name (- end start)))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
806 ;; 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
807 ;; 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
808 ;; (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
809 ;; 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
810 ;; 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
811 ;; 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
812 (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
813 '(("" . 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
814 (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
815 'insert-file-contents
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
816 (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
817 (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
818 (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
819 (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
820 (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
821 (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
822 (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
823 (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
824 (widen)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
825 (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
826 (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
827 (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
828 (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
829 (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
830 (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
831 ;; 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
832 ;; 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
833 (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
834 ;; 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
835 ;; superior buffer.
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
836 (setq default-directory
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
837 (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
838 default-directory))
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
839 (rename-buffer bufname)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
840 (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
841 (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
842 (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
843 (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
844 (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
845 (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
846 (tar-subfile-mode 1)))
107897
1721e4658521 Test for special mode-class in view-buffer instead of view-file (bug#5513).
Juri Linkov <juri@jurta.org>
parents: 106815
diff changeset
847 (cond
1721e4658521 Test for special mode-class in view-buffer instead of view-file (bug#5513).
Juri Linkov <juri@jurta.org>
parents: 106815
diff changeset
848 (view-p
1721e4658521 Test for special mode-class in view-buffer instead of view-file (bug#5513).
Juri Linkov <juri@jurta.org>
parents: 106815
diff changeset
849 (view-buffer buffer (and just-created 'kill-buffer-if-not-modified)))
1721e4658521 Test for special mode-class in view-buffer instead of view-file (bug#5513).
Juri Linkov <juri@jurta.org>
parents: 106815
diff changeset
850 ((eq other-window-p 'display) (display-buffer buffer))
1721e4658521 Test for special mode-class in view-buffer instead of view-file (bug#5513).
Juri Linkov <juri@jurta.org>
parents: 106815
diff changeset
851 (other-window-p (switch-to-buffer-other-window buffer))
1721e4658521 Test for special mode-class in view-buffer instead of view-file (bug#5513).
Juri Linkov <juri@jurta.org>
parents: 106815
diff changeset
852 (t (switch-to-buffer buffer))))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
853
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
854
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
855 (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
856 "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
857 (interactive)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
858 (tar-extract t))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
859
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
860 (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
861 "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
862 (interactive)
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
863 (tar-extract 'display))
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
864
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
865 (defun tar-view ()
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
866 "In Tar mode, view the tar file entry on this line."
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 'view))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
869
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
870
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
871 (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
872 "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
873 (or prompt (setq prompt "Copy to: "))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
874 (let* ((default-file (expand-file-name
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
875 (tar-header-name (tar-current-descriptor))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
876 (target (expand-file-name
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
877 (read-file-name prompt
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
878 (file-name-directory default-file)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
879 default-file nil))))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
880 (if (or (string= "" (file-name-nondirectory target))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
881 (file-directory-p target))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
882 (setq target (concat (if (string-match "/$" target)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
883 (substring target 0 (1- (match-end 0)))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
884 target)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
885 "/"
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
886 (file-name-nondirectory default-file))))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
887 target))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
888
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
889
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
890 (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
891 "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
892 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
893 the current tar-entry."
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
894 (interactive (list (tar-read-file-name)))
6611
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
895 (let* ((descriptor (tar-get-descriptor))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
896 (name (tar-header-name descriptor))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
897 (size (tar-header-size descriptor))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
898 (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
899 (end (+ start size))
07ba0f6e9ada (tar-copy): Inhibit use of jka-compr handler
Richard M. Stallman <rms@gnu.org>
parents: 12027
diff changeset
900 (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
901 (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
902 (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
903 (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
904 ;; 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
905 ;; 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
906 (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
907 '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
908 (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
909 'jka-compr-handler))
12662
07ba0f6e9ada (tar-copy): Inhibit use of jka-compr handler
Richard M. Stallman <rms@gnu.org>
parents: 12027
diff changeset
910 (setq inhibit-file-name-handlers
07ba0f6e9ada (tar-copy): Inhibit use of jka-compr handler
Richard M. Stallman <rms@gnu.org>
parents: 12027
diff changeset
911 (cons 'jka-compr-handler
07ba0f6e9ada (tar-copy): Inhibit use of jka-compr handler
Richard M. Stallman <rms@gnu.org>
parents: 12027
diff changeset
912 (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
913 inhibit-file-name-handlers))
07ba0f6e9ada (tar-copy): Inhibit use of jka-compr handler
Richard M. Stallman <rms@gnu.org>
parents: 12027
diff changeset
914 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
915 (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
916 (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
917 (message "Copied tar entry %s to %s" name to-file)))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
918
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
919 (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
920 "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
921 With a prefix argument, mark that many files."
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
922 (interactive "p")
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
923 (beginning-of-line)
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
924 (dotimes (i (abs p))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
925 (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
926 (progn
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
927 (delete-char 1)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
928 (insert (if unflag " " "D"))))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
929 (forward-line (if (< p 0) -1 1)))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
930 (if (eobp) nil (forward-char 36)))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
931
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
932 (defun tar-unflag (p)
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
933 "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
934 With a prefix argument, un-mark that many files forward."
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
935 (interactive "p")
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
936 (tar-flag-deleted p t))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
937
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
938 (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
939 "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
940 With a prefix argument, un-mark that many files backward."
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
941 (interactive "p")
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
942 (tar-flag-deleted (- p) t))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
943
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
944
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
945 (defun tar-expunge-internal ()
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
946 "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
947 (let ((descriptor (tar-current-descriptor)))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
948 ;;
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
949 ;; 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
950 (delete-region (line-beginning-position) (line-beginning-position 2))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
951 ;;
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
952 ;; delete the data pointer...
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
953 (setq tar-parse-info (delq descriptor tar-parse-info))
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 ;; 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
956 (with-current-buffer tar-data-buffer
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
957 (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
958 (- (tar-header-data-start descriptor) 512))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
959 (tar-header-data-end descriptor)))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
960
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
961
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
962 (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
963 "In Tar mode, delete all the archived files flagged for deletion.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
964 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
965 for this to be permanent."
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
966 (interactive)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
967 (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
968 (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
969 (let ((n 0))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
970 (save-excursion
29646
e57c6c814e3f (tar-extract): For goto-char, use (point-min), not
Kenichi Handa <handa@m17n.org>
parents: 29534
diff changeset
971 (goto-char (point-min))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
972 (while (not (eobp))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
973 (if (looking-at "D")
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
974 (progn (tar-expunge-internal)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
975 (setq n (1+ n)))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
976 (forward-line 1)))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
977 ;; 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
978 (tar-pad-to-blocksize))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
979 (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
980 (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
981 (message "%s files expunged. Be sure to save this buffer." n)))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
982
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
983
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
984 (defun tar-clear-modification-flags ()
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
985 "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
986 (interactive)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
987 (save-excursion
29646
e57c6c814e3f (tar-extract): For goto-char, use (point-min), not
Kenichi Handa <handa@m17n.org>
parents: 29534
diff changeset
988 (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
989 (while (not (eobp))
74243
b5548562a340 (tar-header-block-summarize, tar-clear-modification-flags): "?\ " -> "?\s".
Juanma Barranquero <lekktu@gmail.com>
parents: 70945
diff changeset
990 (if (not (eq (following-char) ?\s))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
991 (progn (delete-char 1) (insert " ")))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
992 (forward-line 1))))
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
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
995 (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
996 "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
997 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
998 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
999 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
1000 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
1001 for this to be permanent."
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1002 (interactive
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1003 (list
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1004 (let ((descriptor (tar-current-descriptor)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1005 (if (or current-prefix-arg
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1006 (not (tar-header-magic descriptor)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1007 (read-number
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1008 "New UID number: "
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1009 (format "%s" (tar-header-uid descriptor)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1010 (read-string "New UID string: " (tar-header-uname descriptor))))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1011 (cond ((stringp new-uid)
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1012 (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
1013 (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
1014 (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
1015 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
1016 "\000")))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1017 (t
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1018 (setf (tar-header-uid (tar-current-descriptor)) new-uid)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1019 (tar-alter-one-field tar-uid-offset
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1020 (concat (substring (format "%6o" new-uid) 0 6) "\000 ")))))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1021
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1022
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1023 (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
1024 "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
1025 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
1026 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
1027 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
1028 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
1029 for this to be permanent."
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1030 (interactive
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1031 (list
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1032 (let ((descriptor (tar-current-descriptor)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1033 (if (or current-prefix-arg
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1034 (not (tar-header-magic descriptor)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1035 (read-number
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1036 "New GID number: "
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1037 (format "%s" (tar-header-gid descriptor)))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1038 (read-string "New GID string: " (tar-header-gname descriptor))))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1039 (cond ((stringp new-gid)
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1040 (setf (tar-header-gname (tar-current-descriptor)) new-gid)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1041 (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
1042 (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
1043 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
1044 "\000")))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1045 (t
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1046 (setf (tar-header-gid (tar-current-descriptor)) new-gid)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1047 (tar-alter-one-field tar-gid-offset
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1048 (concat (substring (format "%6o" new-gid) 0 6) "\000 ")))))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1049
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1050 (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
1051 "Change the name associated with this entry in the tar file.
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1052 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
1053 for this to be permanent."
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1054 (interactive
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1055 (list (read-string "New name: "
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1056 (tar-header-name (tar-current-descriptor)))))
6611
a5f180172ff3 Fix error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 5821
diff changeset
1057 (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
1058 (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
1059 tar-file-name-coding-system))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1060 (descriptor (tar-current-descriptor))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1061 (prefix nil))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1062 (when (tar-header-header-start descriptor)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1063 ;; FIXME: Make it work for ././@LongLink.
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1064 (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
1065
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1066 (when (and (> (length encoded-new-name) 98)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1067 (string-match "/" encoded-new-name
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1068 (- (length encoded-new-name) 99))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1069 (< (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
1070 (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
1071 (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
1072 (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
1073 (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
1074
88955
1d1275f5d5b7 (tar-file-name-coding-system): New variable. Make
Kenichi Handa <handa@m17n.org>
parents: 43424
diff changeset
1075 (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
1076 (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
1077 (tar-alter-one-field 0
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1078 (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
1079 (if prefix
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1080 (tar-alter-one-field tar-prefix-offset
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1081 (substring (concat prefix (make-string 155 0)) 0 155)))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1082
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1083
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1084 (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
1085 "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
1086 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
1087 for this to be permanent."
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1088 (interactive (list (tar-parse-octal-integer-safe
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1089 (read-string "New protection (octal): "))))
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1090 (setf (tar-header-mode (tar-current-descriptor)) new-mode)
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1091 (tar-alter-one-field tar-mode-offset
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1092 (concat (substring (format "%6o" new-mode) 0 6) "\000 ")))
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
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1095 (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
1096 (unless descriptor (setq descriptor (tar-current-descriptor)))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1097 ;;
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1098 ;; update the header-line.
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1099 (let ((col (current-column)))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1100 (delete-region (line-beginning-position)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1101 (prog2 (forward-line 1)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1102 (point)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1103 ;; 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
1104 ;; 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
1105 (insert (tar-header-block-summarize descriptor) "\n")))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1106 (forward-line -1) (move-to-column col))
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47656
diff changeset
1107
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1108 (assert (tar-data-swapped-p))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1109 (with-current-buffer tar-data-buffer
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1110 (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
1111 ;;
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1112 ;; 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
1113 (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
1114 (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
1115 (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
1116 (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
1117 (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
1118 ;;
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1119 ;; 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
1120 (let ((chk (tar-header-block-checksum
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1121 (buffer-substring start (+ start 512)))))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1122 (goto-char (+ start tar-chk-offset))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1123 (delete-region (point) (+ (point) 8))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1124 (insert (format "%6o\0 " chk))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1125 (setf (tar-header-checksum descriptor) chk)
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1126 ;;
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1127 ;; 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
1128 (tar-header-block-check-checksum
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1129 (buffer-substring start (+ start 512))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1130 chk (tar-header-name descriptor))
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1131 ))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1132
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1133
880
52a05f4884a4 entered into RCS
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 840
diff changeset
1134 (defun tar-octal-time (timeval)
52a05f4884a4 entered into RCS
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 840
diff changeset
1135 ;; 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
1136 (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
1137 (format "%05o%01o%05o"
eed727396dd0 (tar-octal-time): Fix last change.
Eli Zaretskii <eliz@gnu.org>
parents: 45329
diff changeset
1138 (lsh hibits -2)
eed727396dd0 (tar-octal-time): Fix last change.
Eli Zaretskii <eliz@gnu.org>
parents: 45329
diff changeset
1139 (logior (lsh (logand 3 hibits) 1)
eed727396dd0 (tar-octal-time): Fix last change.
Eli Zaretskii <eliz@gnu.org>
parents: 45329
diff changeset
1140 (if (> (logand lobits 32768) 0) 1 0))
eed727396dd0 (tar-octal-time): Fix last change.
Eli Zaretskii <eliz@gnu.org>
parents: 45329
diff changeset
1141 (logand 32767 lobits)
eed727396dd0 (tar-octal-time): Fix last change.
Eli Zaretskii <eliz@gnu.org>
parents: 45329
diff changeset
1142 )))
880
52a05f4884a4 entered into RCS
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 840
diff changeset
1143
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1144 (defun tar-subfile-save-buffer ()
4387
3e18f6a1915b Fix doc strings and error message syntax.
Richard M. Stallman <rms@gnu.org>
parents: 4260
diff changeset
1145 "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
1146 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
1147 to make your changes permanent."
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1148 (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
1149 (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
1150 (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
1151 (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
1152 (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
1153 (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
1154 (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
1155 (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
1156 subfile-size)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1157 (with-current-buffer tar-superior-buffer
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1158 (let* ((start (tar-header-data-start descriptor))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1159 (name (tar-header-name descriptor))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1160 (size (tar-header-size descriptor))
95370
fafc513e04bc (tar-summarize-buffer): Fix reporter initialization.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95347
diff changeset
1161 (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
1162 (if (not head)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1163 (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
1164 (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
1165 ;; 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
1166 (let* ((data-start start)
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1167 (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
1168 (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
1169 (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
1170 ;; 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
1171 (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
1172 (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
1173 (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
1174 (save-restriction
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1175 (widen)
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1176 (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
1177 (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
1178 ;;
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1179 ;; 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
1180 (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
1181 (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
1182 (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
1183 ;;
95347
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1184 ;; update the data of this files...
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1185 (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
1186 ;;
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1187 ;; 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
1188 (widen))))
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1189 ;;
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1190 ;; 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
1191 ;;
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1192 (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
1193 (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
1194 (forward-line position)
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1195 (tar-alter-one-field tar-size-offset (format "%11o " subfile-size))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1196 ;;
95378
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1197 ;; Maybe update the datestamp.
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1198 (when tar-update-datestamp
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1199 (tar-alter-one-field tar-time-offset
4eddf6f13d89 (tar-header): New field `header-start'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95370
diff changeset
1200 (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
1201 ;; 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
1202 (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
1203 (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
1204 (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
1205 (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
1206 (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
1207 (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
1208 ;; 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
1209 (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
1210 ;; 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
1211 t))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1213
23716
d30ffa793626 (tar-header-block-tokenize): Decode codes of file
Kenichi Handa <handa@m17n.org>
parents: 23482
diff changeset
1214 ;; 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
1215 (defun tar-pad-to-blocksize ()
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1216 "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
1217 Leaves the region wide."
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1218 (if (null tar-anal-blocksize)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1219 nil
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1220 (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
1221 (start (tar-header-data-start last-desc))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1222 (link-p (tar-header-link-type last-desc))
8a8bad853798 Use defstruct and markers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95346
diff changeset
1223 (size (if link-p 0 (tar-header-size last-desc)))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1224 (data-end (+ start size))
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1225 (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
1226 (pad-to (+ bbytes (* bbytes (/ (- data-end (point-min)) bbytes)))))
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1227 ;; If the padding after the last data is too long, delete some;
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1228 ;; 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
1229 ;;
95346
29a62a8c830b Use buffer-swap-text to separate summary and raw data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 95309
diff changeset
1230 (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
1231 (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
1232 (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
1233 (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
1234 (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
1235 (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
1236
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
1237
100935
e55ce6002e3d (tar-mode, tar-mode-write-contents)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100908
diff changeset
1238 ;; 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
1239 (defun tar-write-region-annotate (start end)
e55ce6002e3d (tar-mode, tar-mode-write-contents)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100908
diff changeset
1240 ;; 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
1241 ;; 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
1242 ;; (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
1243 (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
1244 (tar-clear-modification-flags)
100935
e55ce6002e3d (tar-mode, tar-mode-write-contents)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100908
diff changeset
1245 (set-buffer tar-data-buffer)
e55ce6002e3d (tar-mode, tar-mode-write-contents)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100908
diff changeset
1246 nil))
100787
a001ee185900 (tar-data-swapped): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100698
diff changeset
1247
212
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1248 (provide 'tar-mode)
31304a63a872 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1249
66800
baa95d93b4e0 Remove spurious or unnecessary leading stars in docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66297
diff changeset
1250 ;; arch-tag: 8a585a4a-340e-42c2-89e7-d3b1013a4b78
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 584
diff changeset
1251 ;;; tar-mode.el ends here