X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/c1473b4cfeb477ced05d457868c5e1eb97a58eb0..abef340a0c5304054a2a5e6d95e1d825501f0e7a:/lisp/tar-mode.el diff --git a/lisp/tar-mode.el b/lisp/tar-mode.el index 4d05746a34..10ea1ac23c 100644 --- a/lisp/tar-mode.el +++ b/lisp/tar-mode.el @@ -1,7 +1,6 @@ ;;; tar-mode.el --- simple editing of tar files from GNU emacs -;; Copyright (C) 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -;; 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +;; Copyright (C) 1990-1991, 1993-2011 Free Software Foundation, Inc. ;; Author: Jamie Zawinski ;; Maintainer: FSF @@ -136,7 +135,6 @@ This information is useful, but it takes screen space away from file names." (defvar tar-parse-info nil) (defvar tar-superior-buffer nil) (defvar tar-superior-descriptor nil) -(defvar tar-subfile-mode nil) (defvar tar-file-name-coding-system nil) (put 'tar-superior-buffer 'permanent-local t) @@ -159,16 +157,32 @@ This information is useful, but it takes screen space away from file names." (defvar tar-data-buffer nil "Buffer that holds the actual raw tar bytes.") (make-variable-buffer-local 'tar-data-buffer) +(defvar tar-data-swapped nil + "If non-nil, `tar-data-buffer' indeed holds raw tar bytes.") +(make-variable-buffer-local 'tar-data-swapped) + (defun tar-data-swapped-p () "Return non-nil if the tar-data is in `tar-data-buffer'." - ;; We need to be careful to keep track of which buffer holds the tar-data, - ;; since we swap them back and forth. Since the user may make the summary - ;; buffer unibyte, we can't rely on the multibyteness of the buffers. - ;; We could try and recognize the tar-format signature, but instead - ;; I decided to go for something simpler. (and (buffer-live-p tar-data-buffer) - (> (buffer-size tar-data-buffer) (buffer-size)))) - + ;; Sanity check to try and make sure tar-data-swapped tracks the swap + ;; state correctly: the raw data is expected to be always larger than + ;; the summary. + (progn + (assert (or (= (buffer-size tar-data-buffer) (buffer-size)) + (eq tar-data-swapped + (> (buffer-size tar-data-buffer) (buffer-size))))) + tar-data-swapped))) + +(defun tar-swap-data () + "Swap buffer contents between current buffer and `tar-data-buffer'. +Preserve the modified states of the buffers and set `buffer-swapped-with'." + (let ((data-buffer-modified-p (buffer-modified-p tar-data-buffer)) + (current-buffer-modified-p (buffer-modified-p))) + (buffer-swap-text tar-data-buffer) + (setq tar-data-swapped (not tar-data-swapped)) + (restore-buffer-modified-p data-buffer-modified-p) + (with-current-buffer tar-data-buffer + (restore-buffer-modified-p current-buffer-modified-p)))) ;;; down to business. @@ -206,12 +220,12 @@ This information is useful, but it takes screen space away from file names." (defun tar-roundup-512 (s) "Round S up to the next multiple of 512." (ash (ash (+ s 511) -9) 9)) - -(defun tar-header-block-tokenize (pos) + +(defun tar-header-block-tokenize (pos coding) "Return a `tar-header' structure. This is a list of name, mode, uid, gid, size, write-date, checksum, link-type, and link-name." - (assert (<= (+ pos 512) (point-max))) + (if (> (+ pos 512) (point-max)) (error "Malformed Tar header")) (assert (zerop (mod (- pos (point-min)) 512))) (assert (not enable-multibyte-characters)) (let ((string (buffer-substring pos (setq pos (+ pos 512))))) @@ -224,8 +238,13 @@ write-date, checksum, link-type, and link-name." (gname-end (1- tar-dmaj-offset)) (link-p (aref string tar-linkp-offset)) (magic-str (substring string tar-magic-offset - (1- tar-uname-offset))) - (uname-valid-p (car (member magic-str '("ustar " "ustar\0\0")))) + ;; The magic string is actually 6bytes + ;; of magic string plus 2bytes of version + ;; which we here ignore. + (- tar-uname-offset 2))) + ;; The magic string is "ustar\0" for POSIX format, and + ;; "ustar " for GNU Tar's format. + (uname-valid-p (car (member magic-str '("ustar " "ustar\0")))) name linkname (nulsexp "[^\000]*\000")) (when (string-match nulsexp string tar-name-offset) @@ -241,30 +260,34 @@ write-date, checksum, link-type, and link-name." nil (- link-p ?0))) (setq linkname (substring string tar-link-offset link-end)) - (when (and (equal uname-valid-p "ustar\0\0") + (when (and (equal uname-valid-p "ustar\0") (string-match nulsexp string tar-prefix-offset) (> (match-end 0) (1+ tar-prefix-offset))) (setq name (concat (substring string tar-prefix-offset (1- (match-end 0))) "/" name))) - (if default-enable-multibyte-characters + (if (default-value 'enable-multibyte-characters) (setq name - (decode-coding-string name tar-file-name-coding-system) + (decode-coding-string name coding) linkname - (decode-coding-string linkname - tar-file-name-coding-system))) + (decode-coding-string linkname coding))) (if (and (null link-p) (string-match "/\\'" name)) (setq link-p 5)) ; directory (if (and (equal name "././@LongLink") - (equal magic-str "ustar ")) ;OLDGNU_MAGIC. + ;; Supposedly @LongLink is only used for GNUTAR + ;; format (i.e. "ustar ") but some POSIX Tar files + ;; (with "ustar\0") have been seen using it as well. + (member magic-str '("ustar " "ustar\0"))) ;; This is a GNU Tar long-file-name header. (let* ((size (tar-parse-octal-integer string tar-size-offset tar-time-offset)) ;; -1 so as to strip the terminating 0 byte. - (name (buffer-substring pos (+ pos size -1))) + (name (decode-coding-string + (buffer-substring pos (+ pos size -1)) coding)) (descriptor (tar-header-block-tokenize - (+ pos (tar-roundup-512 size))))) + (+ pos (tar-roundup-512 size)) + coding))) (cond ((eq link-p (- ?L ?0)) ;GNUTYPE_LONGNAME. (setf (tar-header-name descriptor) name)) @@ -275,7 +298,7 @@ write-date, checksum, link-type, and link-name." (setf (tar-header-header-start descriptor) (copy-marker (- pos 512) t)) descriptor) - + (make-tar-header (copy-marker pos nil) name @@ -288,8 +311,12 @@ write-date, checksum, link-type, and link-name." link-p linkname uname-valid-p - (and uname-valid-p (substring string tar-uname-offset uname-end)) - (and uname-valid-p (substring string tar-gname-offset gname-end)) + (when uname-valid-p + (decode-coding-string + (substring string tar-uname-offset uname-end) coding)) + (when uname-valid-p + (decode-coding-string + (substring string tar-gname-offset gname-end) coding)) (tar-parse-octal-integer string tar-dmaj-offset tar-dmin-offset) (tar-parse-octal-integer string tar-dmin-offset tar-prefix-offset) )))))) @@ -456,14 +483,15 @@ MODE should be an integer which is a file mode value." (let* ((modified (buffer-modified-p)) (result '()) (pos (point-min)) + (coding tar-file-name-coding-system) (progress-reporter (with-current-buffer tar-data-buffer (make-progress-reporter "Parsing tar file..." (point-min) (point-max)))) descriptor) (with-current-buffer tar-data-buffer - (while (and (<= (+ pos 512) (point-max)) - (setq descriptor (tar-header-block-tokenize pos))) + (while (and (< pos (point-max)) + (setq descriptor (tar-header-block-tokenize pos coding))) (let ((size (tar-header-size descriptor))) (if (< size 0) (error "%s has size %s - corrupted" @@ -473,7 +501,7 @@ MODE should be an integer which is a file mode value." ;;(tar-header-block-check-checksum ;; hblock (tar-header-block-checksum hblock) ;; (tar-header-name descriptor)) - + (push descriptor result) (setq pos (tar-header-data-end descriptor)) (progress-reporter-update progress-reporter pos))) @@ -492,93 +520,14 @@ MODE should be an integer which is a file mode value." (goto-char (point-min)) (restore-buffer-modified-p modified))) -(defvar tar-mode-map - (let ((map (make-keymap))) - (suppress-keymap map) - (define-key map " " 'tar-next-line) - (define-key map "C" 'tar-copy) - (define-key map "d" 'tar-flag-deleted) - (define-key map "\^D" 'tar-flag-deleted) - (define-key map "e" 'tar-extract) - (define-key map "f" 'tar-extract) - (define-key map "\C-m" 'tar-extract) - (define-key map [mouse-2] 'tar-mouse-extract) - (define-key map "g" 'revert-buffer) - (define-key map "h" 'describe-mode) - (define-key map "n" 'tar-next-line) - (define-key map "\^N" 'tar-next-line) - (define-key map [down] 'tar-next-line) - (define-key map "o" 'tar-extract-other-window) - (define-key map "p" 'tar-previous-line) - (define-key map "q" 'quit-window) - (define-key map "\^P" 'tar-previous-line) - (define-key map [up] 'tar-previous-line) - (define-key map "R" 'tar-rename-entry) - (define-key map "u" 'tar-unflag) - (define-key map "v" 'tar-view) - (define-key map "x" 'tar-expunge) - (define-key map "\177" 'tar-unflag-backwards) - (define-key map "E" 'tar-extract-other-window) - (define-key map "M" 'tar-chmod-entry) - (define-key map "G" 'tar-chgrp-entry) - (define-key map "O" 'tar-chown-entry) - ;; Let mouse-1 follow the link. - (define-key map [follow-link] 'mouse-face) - - ;; Make menu bar items. - - ;; Get rid of the Edit menu bar item to save space. - (define-key map [menu-bar edit] 'undefined) - - (define-key map [menu-bar immediate] - (cons "Immediate" (make-sparse-keymap "Immediate"))) - - (define-key map [menu-bar immediate view] - '("View This File" . tar-view)) - (define-key map [menu-bar immediate display] - '("Display in Other Window" . tar-display-other-window)) - (define-key map [menu-bar immediate find-file-other-window] - '("Find in Other Window" . tar-extract-other-window)) - (define-key map [menu-bar immediate find-file] - '("Find This File" . tar-extract)) - - (define-key map [menu-bar mark] - (cons "Mark" (make-sparse-keymap "Mark"))) - - (define-key map [menu-bar mark unmark-all] - '("Unmark All" . tar-clear-modification-flags)) - (define-key map [menu-bar mark deletion] - '("Flag" . tar-flag-deleted)) - (define-key map [menu-bar mark unmark] - '("Unflag" . tar-unflag)) - - (define-key map [menu-bar operate] - (cons "Operate" (make-sparse-keymap "Operate"))) - - (define-key map [menu-bar operate chown] - '("Change Owner..." . tar-chown-entry)) - (define-key map [menu-bar operate chgrp] - '("Change Group..." . tar-chgrp-entry)) - (define-key map [menu-bar operate chmod] - '("Change Mode..." . tar-chmod-entry)) - (define-key map [menu-bar operate rename] - '("Rename to..." . tar-rename-entry)) - (define-key map [menu-bar operate copy] - '("Copy to..." . tar-copy)) - (define-key map [menu-bar operate expunge] - '("Expunge Marked Files" . tar-expunge)) - - map) - "Local keymap for Tar mode listings.") - ;; tar mode is suitable only for specially formatted data. (put 'tar-mode 'mode-class 'special) (put 'tar-subfile-mode 'mode-class 'special) (defun tar-change-major-mode-hook () ;; Bring the actual Tar data back into the main buffer. - (when (tar-data-swapped-p) (buffer-swap-text tar-data-buffer)) + (when (tar-data-swapped-p) (tar-swap-data)) ;; Throw away the summary. (when (buffer-live-p tar-data-buffer) (kill-buffer tar-data-buffer))) @@ -586,7 +535,7 @@ MODE should be an integer which is a file mode value." (if (buffer-live-p tar-data-buffer) (kill-buffer tar-data-buffer))) ;;;###autoload -(define-derived-mode tar-mode nil "Tar" +(define-derived-mode tar-mode special-mode "Tar" "Major mode for viewing a tar file as a dired-like listing of its contents. You can move around using the usual cursor motion commands. Letters no longer insert themselves. @@ -601,10 +550,6 @@ inside of a tar archive without extracting it and re-archiving it. See also: variables `tar-update-datestamp' and `tar-anal-blocksize'. \\{tar-mode-map}" - ;; this is not interactive because you shouldn't be turning this - ;; mode on and off. You can corrupt things that way. - ;; rms: with permanent locals, it should now be possible to make this work - ;; interactively in some reasonable fashion. (make-local-variable 'tar-parse-info) (set (make-local-variable 'require-final-newline) nil) ; binary data, dude... (set (make-local-variable 'local-enable-local-variables) nil) @@ -621,6 +566,9 @@ See also: variables `tar-update-datestamp' and `tar-anal-blocksize'. ;; buffer for the summary. (assert (not (tar-data-swapped-p))) (set (make-local-variable 'revert-buffer-function) 'tar-mode-revert) + ;; We started using write-contents-functions, but this hook is not + ;; used during auto-save, so we now use + ;; write-region-annotate-functions which hooks at a lower-level. (add-hook 'write-region-annotate-functions 'tar-write-region-annotate nil t) (add-hook 'kill-buffer-hook 'tar-mode-kill-buffer-hook nil t) (add-hook 'change-major-mode-hook 'tar-change-major-mode-hook nil t) @@ -630,34 +578,105 @@ See also: variables `tar-update-datestamp' and `tar-anal-blocksize'. (generate-new-buffer (format " *tar-data %s*" (file-name-nondirectory (or buffer-file-name (buffer-name)))))) - (buffer-swap-text tar-data-buffer) - (tar-summarize-buffer) - (tar-next-line 0)) - - -(defun tar-subfile-mode (p) + (condition-case err + (progn + (tar-swap-data) + (tar-summarize-buffer) + (tar-next-line 0)) + (error + ;; If summarizing caused an error, then maybe the buffer doesn't contain + ;; tar data. Rather than show a mysterious empty buffer, let's + ;; revert to fundamental-mode. + (fundamental-mode) + (signal (car err) (cdr err))))) + +(define-key tar-mode-map " " 'tar-next-line) +(define-key tar-mode-map "C" 'tar-copy) +(define-key tar-mode-map "d" 'tar-flag-deleted) +(define-key tar-mode-map "\^D" 'tar-flag-deleted) +(define-key tar-mode-map "e" 'tar-extract) +(define-key tar-mode-map "f" 'tar-extract) +(define-key tar-mode-map "\C-m" 'tar-extract) +(define-key tar-mode-map [mouse-2] 'tar-mouse-extract) +(define-key tar-mode-map "g" 'revert-buffer) +(define-key tar-mode-map "h" 'describe-mode) +(define-key tar-mode-map "n" 'tar-next-line) +(define-key tar-mode-map "\^N" 'tar-next-line) +(define-key tar-mode-map [down] 'tar-next-line) +(define-key tar-mode-map "o" 'tar-extract-other-window) +(define-key tar-mode-map "p" 'tar-previous-line) +(define-key tar-mode-map "\^P" 'tar-previous-line) +(define-key tar-mode-map [up] 'tar-previous-line) +(define-key tar-mode-map "R" 'tar-rename-entry) +(define-key tar-mode-map "u" 'tar-unflag) +(define-key tar-mode-map "v" 'tar-view) +(define-key tar-mode-map "x" 'tar-expunge) +(define-key tar-mode-map "\177" 'tar-unflag-backwards) +(define-key tar-mode-map "E" 'tar-extract-other-window) +(define-key tar-mode-map "M" 'tar-chmod-entry) +(define-key tar-mode-map "G" 'tar-chgrp-entry) +(define-key tar-mode-map "O" 'tar-chown-entry) +;; Let mouse-1 follow the link. +(define-key tar-mode-map [follow-link] 'mouse-face) + +;; Make menu bar items. + +;; Get rid of the Edit menu bar item to save space. +(define-key tar-mode-map [menu-bar edit] 'undefined) + +(define-key tar-mode-map [menu-bar immediate] + (cons "Immediate" (make-sparse-keymap "Immediate"))) + +(define-key tar-mode-map [menu-bar immediate view] + '("View This File" . tar-view)) +(define-key tar-mode-map [menu-bar immediate display] + '("Display in Other Window" . tar-display-other-window)) +(define-key tar-mode-map [menu-bar immediate find-file-other-window] + '("Find in Other Window" . tar-extract-other-window)) +(define-key tar-mode-map [menu-bar immediate find-file] + '("Find This File" . tar-extract)) + +(define-key tar-mode-map [menu-bar mark] + (cons "Mark" (make-sparse-keymap "Mark"))) + +(define-key tar-mode-map [menu-bar mark unmark-all] + '("Unmark All" . tar-clear-modification-flags)) +(define-key tar-mode-map [menu-bar mark deletion] + '("Flag" . tar-flag-deleted)) +(define-key tar-mode-map [menu-bar mark unmark] + '("Unflag" . tar-unflag)) + +(define-key tar-mode-map [menu-bar operate] + (cons "Operate" (make-sparse-keymap "Operate"))) + +(define-key tar-mode-map [menu-bar operate chown] + '("Change Owner..." . tar-chown-entry)) +(define-key tar-mode-map [menu-bar operate chgrp] + '("Change Group..." . tar-chgrp-entry)) +(define-key tar-mode-map [menu-bar operate chmod] + '("Change Mode..." . tar-chmod-entry)) +(define-key tar-mode-map [menu-bar operate rename] + '("Rename to..." . tar-rename-entry)) +(define-key tar-mode-map [menu-bar operate copy] + '("Copy to..." . tar-copy)) +(define-key tar-mode-map [menu-bar operate expunge] + '("Expunge Marked Files" . tar-expunge)) + +(define-minor-mode tar-subfile-mode "Minor mode for editing an element of a tar-file. This mode arranges for \"saving\" this buffer to write the data into the tar-file buffer that it came from. The changes will actually appear on disk when you save the tar-file's buffer." - (interactive "P") + ;; Don't do this, because it is redundant and wastes mode line space. + ;; :lighter " TarFile" + nil nil nil (or (and (boundp 'tar-superior-buffer) tar-superior-buffer) (error "This buffer is not an element of a tar file")) - ;; Don't do this, because it is redundant and wastes mode line space. - ;; (or (assq 'tar-subfile-mode minor-mode-alist) - ;; (setq minor-mode-alist (append minor-mode-alist - ;; (list '(tar-subfile-mode " TarFile"))))) - (make-local-variable 'tar-subfile-mode) - (setq tar-subfile-mode - (if (null p) - (not tar-subfile-mode) - (> (prefix-numeric-value p) 0))) (cond (tar-subfile-mode (add-hook 'write-file-functions 'tar-subfile-save-buffer nil t) ;; turn off auto-save. (auto-save-mode -1) - (setq buffer-auto-save-file-name nil) - (run-hooks 'tar-subfile-mode-hook)) + (setq buffer-auto-save-file-name nil)) (t (remove-hook 'write-file-functions 'tar-subfile-save-buffer t)))) @@ -666,16 +685,14 @@ appear on disk when you save the tar-file's buffer." (defun tar-mode-revert (&optional no-auto-save no-confirm) (unwind-protect (let ((revert-buffer-function nil)) - (if (tar-data-swapped-p) (buffer-swap-text tar-data-buffer)) + (if (tar-data-swapped-p) (tar-swap-data)) ;; FIXME: If we ask for confirmation, the user will be temporarily ;; looking at the raw data. (revert-buffer no-auto-save no-confirm 'preserve-modes) - ;; The new raw data may be smaller than the old summary, so let's - ;; make sure tar-data-swapped-p doesn't get confused. - (if (buffer-live-p tar-data-buffer) (kill-buffer tar-data-buffer)) ;; Recompute the summary. + (if (buffer-live-p tar-data-buffer) (kill-buffer tar-data-buffer)) (tar-mode)) - (unless (tar-data-swapped-p) (buffer-swap-text tar-data-buffer)))) + (unless (tar-data-swapped-p) (tar-swap-data)))) (defun tar-next-line (arg) @@ -751,7 +768,13 @@ appear on disk when you save the tar-file's buffer." (read-only-p (or buffer-read-only view-p)) (new-buffer-file-name (expand-file-name ;; `:' is not allowed on Windows - (concat tarname "!" name))) + (concat tarname "!" + (if (string-match "/" name) + name + ;; Make sure `name' contains a / + ;; so set-auto-mode doesn't try + ;; to look at `tarname' for hints. + (concat "./" name))))) (buffer (get-file-buffer new-buffer-file-name)) (just-created nil) undo-list) @@ -784,7 +807,7 @@ appear on disk when you save the tar-file's buffer." (if (or (not coding) (eq (coding-system-type coding) 'undecided)) (setq coding (detect-coding-region start end t))) - (if (and default-enable-multibyte-characters + (if (and (default-value 'enable-multibyte-characters) (coding-system-get coding :for-unibyte)) (with-current-buffer buffer (set-buffer-multibyte nil))) @@ -803,24 +826,20 @@ appear on disk when you save the tar-file's buffer." (setq default-directory (with-current-buffer tar-buffer default-directory)) - (normal-mode) ; pick a mode. (rename-buffer bufname) - (make-local-variable 'tar-superior-buffer) - (make-local-variable 'tar-superior-descriptor) - (setq tar-superior-buffer tar-buffer) - (setq tar-superior-descriptor descriptor) - (setq buffer-read-only read-only-p) (set-buffer-modified-p nil) (setq buffer-undo-list undo-list) + (normal-mode) ; pick a mode. + (set (make-local-variable 'tar-superior-buffer) tar-buffer) + (set (make-local-variable 'tar-superior-descriptor) descriptor) + (setq buffer-read-only read-only-p) (tar-subfile-mode 1))) - (if view-p - (view-buffer - buffer (and just-created 'kill-buffer-if-not-modified)) - (if (eq other-window-p 'display) - (display-buffer buffer) - (if other-window-p - (switch-to-buffer-other-window buffer) - (switch-to-buffer buffer))))))) + (cond + (view-p + (view-buffer buffer (and just-created 'kill-buffer-if-not-modified))) + ((eq other-window-p 'display) (display-buffer buffer)) + (other-window-p (switch-to-buffer-other-window buffer)) + (t (switch-to-buffer buffer)))))) (defun tar-extract-other-window () @@ -870,12 +889,14 @@ the current tar-entry." (end (+ start size)) (inhibit-file-name-handlers inhibit-file-name-handlers) (inhibit-file-name-operation inhibit-file-name-operation)) - (save-restriction - (widen) + (with-current-buffer + (if (tar-data-swapped-p) tar-data-buffer (current-buffer)) ;; Inhibit compressing a subfile again if *both* name and ;; to-file are handled by jka-compr - (if (and (eq (find-file-name-handler name 'write-region) 'jka-compr-handler) - (eq (find-file-name-handler to-file 'write-region) 'jka-compr-handler)) + (if (and (eq (find-file-name-handler name 'write-region) + 'jka-compr-handler) + (eq (find-file-name-handler to-file 'write-region) + 'jka-compr-handler)) (setq inhibit-file-name-handlers (cons 'jka-compr-handler (and (eq inhibit-file-name-operation 'write-region) @@ -979,7 +1000,10 @@ for this to be permanent." (read-string "New UID string: " (tar-header-uname descriptor)))))) (cond ((stringp new-uid) (setf (tar-header-uname (tar-current-descriptor)) new-uid) - (tar-alter-one-field tar-uname-offset (concat new-uid "\000"))) + (tar-alter-one-field tar-uname-offset + (concat (encode-coding-string + new-uid tar-file-name-coding-system) + "\000"))) (t (setf (tar-header-uid (tar-current-descriptor)) new-uid) (tar-alter-one-field tar-uid-offset @@ -1005,7 +1029,9 @@ for this to be permanent." (cond ((stringp new-gid) (setf (tar-header-gname (tar-current-descriptor)) new-gid) (tar-alter-one-field tar-gname-offset - (concat new-gid "\000"))) + (concat (encode-coding-string + new-gid tar-file-name-coding-system) + "\000"))) (t (setf (tar-header-gid (tar-current-descriptor)) new-gid) (tar-alter-one-field tar-gid-offset @@ -1031,8 +1057,8 @@ for this to be permanent." (string-match "/" encoded-new-name (- (length encoded-new-name) 99)) (< (match-beginning 0) 155)) - (unless (equal (tar-header-magic descriptor) "ustar\0\0") - (tar-alter-one-field tar-magic-offset "ustar\0\0")) + (unless (equal (tar-header-magic descriptor) "ustar\0") + (tar-alter-one-field tar-magic-offset (concat "ustar\0" "00"))) (setq prefix (substring encoded-new-name 0 (match-beginning 0))) (setq encoded-new-name (substring encoded-new-name (match-end 0)))) @@ -1205,11 +1231,10 @@ Leaves the region wide." ;; When called from M-x write-region, we assume the user wants to save ;; (part of) the summary, not the tar data. (unless (or start (not (tar-data-swapped-p))) - (tar-clear-modification-flags) + (tar-clear-modification-flags) (set-buffer tar-data-buffer) nil)) - + (provide 'tar-mode) -;; arch-tag: 8a585a4a-340e-42c2-89e7-d3b1013a4b78 ;;; tar-mode.el ends here