mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-15 10:30:25 -08:00
Fix quoted files for 'verify-visited-file-modtime'
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.
This commit is contained in:
parent
26c71bfe8c
commit
5e47c2e52b
2 changed files with 70 additions and 2 deletions
|
|
@ -29,6 +29,7 @@
|
|||
;;; Code:
|
||||
|
||||
(eval-when-compile
|
||||
(require 'cl-lib)
|
||||
(require 'pcase)
|
||||
(require 'easy-mmode)) ; For `define-minor-mode'.
|
||||
|
||||
|
|
@ -7031,7 +7032,12 @@ only these files will be asked to be saved."
|
|||
(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)))))
|
||||
|
|
|
|||
|
|
@ -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 @@ be $HOME."
|
|||
(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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue