|
From: | GNU bug Tracking System |
Subject: | [debbugs-tracker] bug#25951: closed (26.0.50; Error when ediffing files that are visited using quoted file names) |
Date: | Sat, 06 May 2017 19:29:02 +0000 |
Your message dated Sat, 06 May 2017 19:27:48 +0000 with message-id <address@hidden> and subject line Re: [PATCH] Fix quoted files for 'verify-visited-file-modtime' has caused the debbugs.gnu.org bug report #25951, regarding 26.0.50; Error when ediffing files that are visited using quoted file names to be marked as done. (If you believe you have received this mail in error, please contact address@hidden) -- 25951: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=25951 GNU Bug Tracking System Contact address@hidden with problems
--- Begin Message ---Subject: 26.0.50; Error when ediffing files that are visited using quoted file names Date: Fri, 03 Mar 2017 14:56:48 +0100 Assuming /tmp/[ab].py are existing files. emacs -Q -f server-start /:/tmp/a.py Then: emacsclient --create-frame --eval '(ediff "/tmp/a.py" "/tmp/b.py")' will result un an error: *ERROR*: Wrong type argument: arrayp, nil Backtrace is Debugger entered--Lisp error: (wrong-type-argument arrayp nil) file-name-non-special(verify-visited-file-modtime #<buffer a.py>) verify-visited-file-modtime(#<buffer a.py>) apply(verify-visited-file-modtime #<buffer a.py>) tramp-run-real-handler(verify-visited-file-modtime (#<buffer a.py>)) tramp-file-name-handler(verify-visited-file-modtime #<buffer a.py>) verify-visited-file-modtime(#<buffer a.py>) find-file-noselect("/tmp/a.py") ediff-find-file(file-A buf-A ediff-last-dir-A startup-hooks) ediff-files-internal("/tmp/a.py" "/tmp/b.py" nil nil ediff-files) ediff("/tmp/a.py" "/tmp/b.py") eval((ediff "/tmp/a.py" "/tmp/b.py")) server-eval-and-print("(ediff \"/tmp/a.py\" \"/tmp/b.py\")" #<process server <3>>) (more uninteresting frames) In GNU Emacs 26.0.50 (build 10, x86_64-unknown-linux-gnu, GTK+ Version 3.10.8) of 2017-03-03 built on localhost Repository revision: 244de7b0ed3bb23e700c9edef51e413602d8720a Windowing system distributor 'The X.Org Foundation', version 11.0.11501000 System Description: Ubuntu 14.04 LTS Recent messages: For information about GNU Emacs and the GNU system, type C-h C-a. Configured using: 'configure --enable-checking --enable-check-lisp-object-type --with-modules 'CFLAGS=-O0 -ggdb3'' Configured features: XPM JPEG TIFF GIF PNG SOUND GSETTINGS NOTIFY GNUTLS FREETYPE XFT ZLIB TOOLKIT_SCROLL_BARS GTK3 X11 MODULES Important settings: value of $LANG: en_US.UTF-8 locale-coding-system: utf-8-unix Major mode: Lisp Interaction Minor modes in effect: tooltip-mode: t global-eldoc-mode: t electric-indent-mode: t mouse-wheel-mode: t tool-bar-mode: t menu-bar-mode: t file-name-shadow-mode: t global-font-lock-mode: t font-lock-mode: t blink-cursor-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t line-number-mode: t transient-mark-mode: t Load-path shadows: None found. Features: (shadow sort mail-extr emacsbug message puny seq byte-opt subr-x gv bytecomp byte-compile cl-extra help-mode cconv cl-loaddefs pcase cl-lib dired dired-loaddefs format-spec rfc822 mml easymenu mml-sec password-cache epa derived epg epg-config gnus-util rmail rmail-loaddefs mm-decode mm-bodies mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader sendmail rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mail-utils time-date mule-util tooltip eldoc electric uniquify ediff-hook vc-hooks lisp-float-type mwheel term/x-win x-win term/common-win x-dnd tool-bar dnd fontset image regexp-opt fringe tabulated-list replace newcomment text-mode elisp-mode lisp-mode prog-mode register page menu-bar rfn-eshadow isearch timer select scroll-bar mouse jit-lock font-lock syntax facemenu font-core term/tty-colors frame cl-generic cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese composite charscript case-table epa-hook jka-cmpr-hook help simple abbrev obarray minibuffer cl-preloaded nadvice loaddefs button faces cus-face macroexp files text-properties overlay sha1 md5 base64 format env code-pages mule custom widget hashtable-print-readable backquote inotify dynamic-setting system-font-setting font-render-setting move-toolbar gtk x-toolkit x multi-tty make-network-process emacs) Memory information: ((conses 16 96397 9305) (symbols 48 20188 1) (miscs 40 39 181) (strings 32 17669 3597) (string-bytes 1 574142) (vectors 16 14048) (vector-slots 8 483315 4785) (floats 8 48 68) (intervals 56 217 0) (buffers 976 12) (heap 1024 19322 1007)) -- Google Germany GmbH Erika-Mann-Straße 33 80636 München Registergericht und -nummer: Hamburg, HRB 86891 Sitz der Gesellschaft: Hamburg Geschäftsführer: Matthew Scott Sucherman, Paul Terence Manicle Diese E-Mail ist vertraulich. Wenn Sie nicht der richtige Adressat sind, leiten Sie diese bitte nicht weiter, informieren Sie den Absender und löschen Sie die E-Mail und alle Anhänge. Vielen Dank. This e-mail is confidential. If you are not the right addressee please do not forward it, please inform the sender, and please erase this e-mail including any attachments. Thanks.
--- End Message ---
--- Begin Message ---Subject: Re: [PATCH] Fix quoted files for 'verify-visited-file-modtime' Date: Sat, 06 May 2017 19:27:48 +0000 Philipp Stephani <address@hidden> schrieb am Sa., 29. Apr. 2017 um 14:20 Uhr:Fixes Bug#25951.
* lisp/files.el (file-name-non-special): Set the file name for the
correct buffer.
* test/lisp/files-tests.el (files-tests--file-name-non-special--buffers):
Add unit test.
(files-tests--with-advice, files-tests--with-temp-file): New helper
macros.
---
lisp/files.el | 9 ++++++-
test/lisp/files-tests.el | 64 +++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 71 insertions(+), 2 deletions(-)
diff --git a/lisp/files.el b/lisp/files.el
index 6848818cad..2e9ab1aad1 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -28,6 +28,8 @@
;;; Code:
+(eval-when-compile (require 'cl-lib))
+
(defvar font-lock-keywords)
(defgroup backup nil
@@ -6987,7 +6989,12 @@ file-name-non-special
(when (and visit buffer-file-name)
(setq buffer-file-name (concat "/:" buffer-file-name))))))
(`unquote-then-quote
- (let ((buffer-file-name (substring buffer-file-name 2)))
+ (cl-letf* ((buffer (or (car arguments) (current-buffer)))
+ ((buffer-local-value 'buffer-file-name buffer)
+ (substring (buffer-file-name buffer) 2)))
+ ;; `unquote-then-quote' is only used for the
+ ;; `verify-visited-file-modtime' action, which takes a buffer
+ ;; as only optional argument.
(apply operation arguments)))
(_
(apply operation arguments)))))
diff --git a/test/lisp/files-tests.el b/test/lisp/files-tests.el
index 80bbeb1bc5..4583b1af3c 100644
--- a/test/lisp/files-tests.el
+++ b/test/lisp/files-tests.el
@@ -1,4 +1,4 @@
-;;; files-tests.el --- tests for files.el.
+;;; files-tests.el --- tests for files.el. -*- lexical-binding: t; -*-
;; Copyright (C) 2012-2017 Free Software Foundation, Inc.
@@ -20,6 +20,7 @@
;;; Code:
(require 'ert)
+(require 'nadvice)
;; Set to t if the local variable was set, `query' if the query was
;; triggered.
@@ -251,5 +252,66 @@ files-test-bug-18141-file
(start-file-process "foo" nil "true"))))
(should (eq (let ((default-directory "/:/")) (shell-command "true")) 0)))
+(defmacro files-tests--with-advice (symbol where function &rest body)
+ (declare (indent 3))
+ (cl-check-type symbol symbol)
+ (cl-check-type where keyword)
+ (cl-check-type function function)
+ (macroexp-let2 nil function function
+ `(progn
+ (advice-add #',symbol ,where ,function)
+ (unwind-protect
+ (progn ,@body)
+ (advice-remove #',symbol ,function)))))
+
+(defmacro files-tests--with-temp-file (name &rest body)
+ (declare (indent 1))
+ (cl-check-type name symbol)
+ `(let ((,name (make-temp-file "emacs")))
+ (unwind-protect
+ (progn ,@body)
+ (delete-file ,name))))
+
+(ert-deftest files-tests--file-name-non-special--buffers ()
+ "Check that Bug#25951 is fixed.
+We call `verify-visited-file-modtime' on a buffer visiting a file
+with a quoted name. We use two different variants: first with
+the buffer current and a nil argument, second passing the buffer
+object explicitly. In both cases no error should be raised and
+the `file-name-non-special' handler for quoted file names should
+be invoked with the right arguments."
+ (files-tests--with-temp-file temp-file-name
+ (with-temp-buffer
+ (let* ((buffer-visiting-file (current-buffer))
+ (actual-args ())
+ (log (lambda (&rest args) (push args actual-args))))
+ (insert-file-contents (concat "/:" temp-file-name) :visit)
+ (should (stringp buffer-file-name))
+ (should (string-prefix-p "/:" buffer-file-name))
+ (should (consp (visited-file-modtime)))
+ (should (equal (find-file-name-handler buffer-file-name
+ #'verify-visited-file-modtime)
+ #'file-name-non-special))
+ (files-tests--with-advice file-name-non-special :before log
+ ;; This should call the file name handler with the right
+ ;; buffer and not signal an error. The file hasn't been
+ ;; modified, so `verify-visited-file-modtime' should return
+ ;; t.
+ (should (equal (verify-visited-file-modtime) t))
+ (with-temp-buffer
+ (should (stringp (buffer-file-name buffer-visiting-file)))
+ ;; This should call the file name handler with the right
+ ;; buffer and not signal an error. The file hasn't been
+ ;; modified, so `verify-visited-file-modtime' should return
+ ;; t.
+ (should (equal (verify-visited-file-modtime buffer-visiting-file)
+ t))))
+ ;; Verify that the handler was actually called. We called
+ ;; `verify-visited-file-modtime' twice, so both calls should be
+ ;; recorded in reverse order.
+ (should (equal actual-args
+ `((verify-visited-file-modtime ,buffer-visiting-file)
+ (verify-visited-file-modtime nil))))))))
+
(provide 'files-tests)
;;; files-tests.el ends here
--
2.12.2
No further comments, so I've pushed this as 5e47c2e52b.
--- End Message ---
[Prev in Thread] | Current Thread | [Next in Thread] |