From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Glenn Morris Newsgroups: gmane.emacs.bugs Subject: bug#18344: Archive (e.g. tarball) file buffers are editable, but have no undo information Date: Thu, 28 Aug 2014 13:44:15 -0400 Message-ID: References: NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: ger.gmane.org 1409247918 9887 80.91.229.3 (28 Aug 2014 17:45:18 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 28 Aug 2014 17:45:18 +0000 (UTC) Cc: dan@haxney.org, 18344@debbugs.gnu.org To: Paul Pogonyshev Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Thu Aug 28 19:45:10 2014 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1XN3ky-0005Sq-UH for geb-bug-gnu-emacs@m.gmane.org; Thu, 28 Aug 2014 19:45:09 +0200 Original-Received: from localhost ([::1]:38366 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XN3ky-0002kp-G0 for geb-bug-gnu-emacs@m.gmane.org; Thu, 28 Aug 2014 13:45:08 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:46756) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XN3ku-0002jS-LV for bug-gnu-emacs@gnu.org; Thu, 28 Aug 2014 13:45:06 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XN3ks-0001uJ-FO for bug-gnu-emacs@gnu.org; Thu, 28 Aug 2014 13:45:04 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:47655) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XN3ks-0001st-BV for bug-gnu-emacs@gnu.org; Thu, 28 Aug 2014 13:45:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1XN3kr-0004Dn-KZ for bug-gnu-emacs@gnu.org; Thu, 28 Aug 2014 13:45:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Glenn Morris Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 28 Aug 2014 17:45:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 18344 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 18344-submit@debbugs.gnu.org id=B18344.140924786016157 (code B ref 18344); Thu, 28 Aug 2014 17:45:01 +0000 Original-Received: (at 18344) by debbugs.gnu.org; 28 Aug 2014 17:44:20 +0000 Original-Received: from localhost ([127.0.0.1]:54598 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1XN3kA-0004CW-I3 for submit@debbugs.gnu.org; Thu, 28 Aug 2014 13:44:19 -0400 Original-Received: from fencepost.gnu.org ([208.118.235.10]:53813 ident=Debian-exim) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1XN3k8-0004CO-7d for 18344@debbugs.gnu.org; Thu, 28 Aug 2014 13:44:16 -0400 Original-Received: from rgm by fencepost.gnu.org with local (Exim 4.71) (envelope-from ) id 1XN3k7-0004zX-5O; Thu, 28 Aug 2014 13:44:15 -0400 X-Spook: asset espionage pre-emptive FBI Bellcore Qaddafi 22nd SAS X-Ran: 3FP"a`f|cxArvC??'/~^jxOi45tI].M3.NHP+;7L%I6{zoV|EpX"j?BLK?gUE X-Hue: red X-Attribution: GM In-Reply-To: (Paul Pogonyshev's message of "Thu, 28 Aug 2014 19:11:29 +0200") User-Agent: Gnus (www.gnus.org), GNU Emacs (www.gnu.org/software/emacs/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 140.186.70.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:92776 Archived-At: Paul Pogonyshev wrote: > 1) Visit any '.tar.gz' archve; > 2) Open any contained file within that archive; > 3) Press 'x' or any other self-inserting key; > 4) Buffer is now in 'modified' state, but you cannot undo your modification. Please at least say what version of Emacs your bug reports are about. Anyway, by experiment, this is new since after 24.3. The cause seems to be: revno: 113108 committer: Stefan Monnier timestamp: Thu 2013-06-20 23:08:47 -0400 message: * lisp/emacs-lisp/package.el: Use tar-mode rather than tar executable. which removes previously existing code in tar-mode.el that did a little dance with buffer-undo-list. Now it just sets it to t. *** lisp/tar-mode.el 2013-05-09 01:42:00 +0000 --- lisp/tar-mode.el 2013-06-21 03:08:47 +0000 *************** *** 740,749 **** nil (error "This line does not describe a tar-file entry")))) ! (defun tar-get-descriptor () ! (let* ((descriptor (tar-current-descriptor)) ! (size (tar-header-size descriptor)) ! (link-p (tar-header-link-type descriptor))) (if link-p (error "This is %s, not a real file" (cond ((eq link-p 5) "a directory") --- 740,747 ---- nil (error "This line does not describe a tar-file entry")))) ! (defun tar--check-descriptor (descriptor) ! (let ((link-p (tar-header-link-type descriptor))) (if link-p (error "This is %s, not a real file" (cond ((eq link-p 5) "a directory") *************** *** 754,763 **** ((eq link-p 38) "a volume header") ((eq link-p 55) "a pax global extended header") ((eq link-p 72) "a pax extended header") ! (t "a link")))) (if (zerop size) (message "This is a zero-length file")) descriptor)) (defun tar-mouse-extract (event) "Extract a file whose tar directory line you click on." (interactive "e") --- 752,775 ---- ((eq link-p 38) "a volume header") ((eq link-p 55) "a pax global extended header") ((eq link-p 72) "a pax extended header") ! (t "a link")))))) ! ! (defun tar-get-descriptor () ! (let* ((descriptor (tar-current-descriptor)) ! (size (tar-header-size descriptor))) ! (tar--check-descriptor descriptor) (if (zerop size) (message "This is a zero-length file")) descriptor)) + (defun tar-get-file-descriptor (file) + ;; Used by package.el. + (let ((desc ())) + (dolist (hdr tar-parse-info) + (when (equal file (tar-header-name hdr)) + (setq desc hdr))) + (tar--check-descriptor desc) + desc)) + (defun tar-mouse-extract (event) "Extract a file whose tar directory line you click on." (interactive "e") *************** *** 776,816 **** (let ((file-name-handler-alist nil)) (apply op args)))) ! (defun tar-extract (&optional other-window-p) ! "In Tar mode, extract this entry of the tar file into its own buffer." ! (interactive) ! (let* ((view-p (eq other-window-p 'view)) ! (descriptor (tar-get-descriptor)) ! (name (tar-header-name descriptor)) (size (tar-header-size descriptor)) (start (tar-header-data-start descriptor)) ! (end (+ start size))) ! (let* ((tar-buffer (current-buffer)) (tarname (buffer-name)) (bufname (concat (file-name-nondirectory name) " (" tarname ")")) ! (read-only-p (or buffer-read-only view-p)) ! (new-buffer-file-name (expand-file-name ! ;; `:' is not allowed on Windows ! (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) ! (unless buffer ! (setq buffer (generate-new-buffer bufname)) (with-current-buffer buffer ! (setq undo-list buffer-undo-list ! buffer-undo-list t)) ! (setq bufname (buffer-name buffer)) ! (setq just-created t) (with-current-buffer tar-data-buffer (let (coding) (narrow-to-region start end) --- 788,807 ---- (let ((file-name-handler-alist nil)) (apply op args)))) ! (defun tar--extract (descriptor) ! "Extract this entry of the tar file into its own buffer." ! (let* ((name (tar-header-name descriptor)) (size (tar-header-size descriptor)) (start (tar-header-data-start descriptor)) ! (end (+ start size)) (tarname (buffer-name)) (bufname (concat (file-name-nondirectory name) " (" tarname ")")) ! (buffer (generate-new-buffer bufname))) (with-current-buffer buffer ! (setq buffer-undo-list t)) (with-current-buffer tar-data-buffer (let (coding) (narrow-to-region start end) *************** *** 839,844 **** --- 830,860 ---- (set-buffer-multibyte nil))) (widen) (decode-coding-region start end coding buffer))) + buffer)) + + (defun tar-extract (&optional other-window-p) + "In Tar mode, extract this entry of the tar file into its own buffer." + (interactive) + (let* ((view-p (eq other-window-p 'view)) + (descriptor (tar-get-descriptor)) + (name (tar-header-name descriptor)) + (tar-buffer (current-buffer)) + (tarname (buffer-name)) + (read-only-p (or buffer-read-only view-p)) + (new-buffer-file-name (expand-file-name + ;; `:' is not allowed on Windows + (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)) + (unless buffer + (setq buffer (tar--extract descriptor)) + (setq just-created t) (with-current-buffer buffer (goto-char (point-min)) (setq buffer-file-name new-buffer-file-name) *************** *** 852,860 **** (setq default-directory (with-current-buffer tar-buffer default-directory)) - (rename-buffer bufname) (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) --- 868,875 ---- (setq default-directory (with-current-buffer tar-buffer default-directory)) (set-buffer-modified-p nil) ! (setq buffer-undo-list t) (normal-mode) ; pick a mode. (set (make-local-variable 'tar-superior-buffer) tar-buffer) (set (make-local-variable 'tar-superior-descriptor) descriptor) *************** *** 865,871 **** (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 () --- 880,886 ---- (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 ()