bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#33005: 27.0.50; Data loss with Gnus registry


From: Michael Heerdegen
Subject: bug#33005: 27.0.50; Data loss with Gnus registry
Date: Fri, 18 Oct 2019 11:18:54 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/27.0.50 (gnu/linux)

Eric Abrahamsen <eric@ericabrahamsen.net> writes:

> 1. Put a breakpoint or edebug or otherwise slow the function down, and
> after the data directory has been copied to /tmp, make sure that it
> belongs to your user and you have the right permissions?

That's the case.

> 2. Try this version of gnus-mock-start and see if it works:

I did something different.  Seems that so-long is to blame:

| Debugger entered--entering a function:
| * hack-local-variables(no-mode)
|   run-mode-hooks(so-long-mode-hook)
|   #f(compiled-function () (interactive nil) #<bytecode 0x156db2ff061d>)()
|   apply(#f(compiled-function () (interactive nil) #<bytecode 0x156db2ff061d>) 
nil)
|   so-long-mode()
|   so-long()
|   so-long--set-auto-mode((closure (t) (&optional keep-mode-if-same) "Select 
major mode appropriate for current buffer.\n..." (let ((try-locals (not 
(inhibit-local-variables-p))) end done mode modes) (save-excursion (goto-char 
(point-min)) (skip-chars-forward " \11\n") (and enable-local-variables 
try-locals (setq end (set-auto-mode-1)) (if (save-excursion (search-forward ":" 
end t)) (while (let ... ...) (skip-chars-forward " \11") (let ... ... ... ...)) 
(setq modes (cons ... modes))))) (if modes (catch 'nop (let ((--dolist-tail-- 
...)) (while --dolist-tail-- (let ... ... ...))))) (and (not done) 
enable-local-variables local-enable-local-variables try-locals (setq mode 
(hack-local-variables t)) (not (memq mode modes)) (if (not (functionp mode)) 
(message "Ignoring unknown mode `%s'" mode) (setq done t) (set-auto-mode-0 mode 
keep-mode-if-same))) (and (not done) (setq mode (save-excursion (goto-char 
(point-min)) (if (looking-at auto-mode-interpreter-regexp) (match-string 2)))) 
(setq done (assoc-default (file-name-nondirectory mode) (mapcar #'... 
interpreter-mode-alist) #'string-match-p)) (set-auto-mode-0 done 
keep-mode-if-same)) (if done nil (if (setq done (save-excursion (goto-char ...) 
(save-restriction ... ...))) (set-auto-mode-0 done keep-mode-if-same))) (if 
done nil (if buffer-file-name (let ((name buffer-file-name) (remote-id ...) 
(case-insensitive-p ...)) (setq name (file-name-sans-versions name)) (if (and 
... ...) (progn ...)) (while name (setq mode ...) (if ... ... ...) (if mode 
...))))) (if done nil (if (setq done (save-excursion (goto-char ...) 
(save-restriction ... ...))) (set-auto-mode-0 done keep-mode-if-same))) (if 
done nil (set-buffer-major-mode (current-buffer))))) t)
|   apply(so-long--set-auto-mode (closure (t) (&optional keep-mode-if-same) 
"Select major mode appropriate for current buffer.\n..." (let ((try-locals (not 
(inhibit-local-variables-p))) end done mode modes) (save-excursion (goto-char 
(point-min)) (skip-chars-forward " \11\n") (and enable-local-variables 
try-locals (setq end (set-auto-mode-1)) (if (save-excursion (search-forward ":" 
end t)) (while (let ... ...) (skip-chars-forward " \11") (let ... ... ... ...)) 
(setq modes (cons ... modes))))) (if modes (catch 'nop (let ((--dolist-tail-- 
...)) (while --dolist-tail-- (let ... ... ...))))) (and (not done) 
enable-local-variables local-enable-local-variables try-locals (setq mode 
(hack-local-variables t)) (not (memq mode modes)) (if (not (functionp mode)) 
(message "Ignoring unknown mode `%s'" mode) (setq done t) (set-auto-mode-0 mode 
keep-mode-if-same))) (and (not done) (setq mode (save-excursion (goto-char 
(point-min)) (if (looking-at auto-mode-interpreter-regexp) (match-string 2)))) 
(setq done (assoc-default (file-name-nondirectory mode) (mapcar #'... 
interpreter-mode-alist) #'string-match-p)) (set-auto-mode-0 done 
keep-mode-if-same)) (if done nil (if (setq done (save-excursion (goto-char ...) 
(save-restriction ... ...))) (set-auto-mode-0 done keep-mode-if-same))) (if 
done nil (if buffer-file-name (let ((name buffer-file-name) (remote-id ...) 
(case-insensitive-p ...)) (setq name (file-name-sans-versions name)) (if (and 
... ...) (progn ...)) (while name (setq mode ...) (if ... ... ...) (if mode 
...))))) (if done nil (if (setq done (save-excursion (goto-char ...) 
(save-restriction ... ...))) (set-auto-mode-0 done keep-mode-if-same))) (if 
done nil (set-buffer-major-mode (current-buffer))))) t)
|   #f(advice-wrapper :around (closure (t) (&optional keep-mode-if-same) 
"Select major mode appropriate for current buffer.\n\nTo find the right major 
mode, this function checks for a -*- mode tag\nchecks for a `mode:' entry in 
the Local Variables section of the file,\nchecks if it uses an interpreter 
listed in `interpreter-mode-alist',\nmatches the buffer beginning against 
`magic-mode-alist',\ncompares the filename against the entries in 
`auto-mode-alist',\nthen matches the buffer beginning against 
`magic-fallback-mode-alist'.\n\nIf `enable-local-variables' is nil, or if the 
file name matches\n`inhibit-local-variables-regexps', this function does not 
check\nfor any mode: tag anywhere in the file.  If 
`local-enable-local-variables'\nis nil, then the only mode: tag that can be 
relevant is a -*- one.\n\nIf the optional argument KEEP-MODE-IF-SAME is 
non-nil, then we\nset the major mode only if that would change it.  In other 
words\nwe don't actually set it to the same mode the buffer already has." (let 
((try-locals (not (inhibit-local-variables-p))) end done mode modes) 
(save-excursion (goto-char (point-min)) (skip-chars-forward " \11\n") (and 
enable-local-variables try-locals (setq end (set-auto-mode-1)) (if 
(save-excursion (search-forward ":" end t)) (while (let ((case-fold-search t)) 
(or (and (looking-at "mode:") (goto-char (match-end 0))) (re-search-forward "[ 
\11;]mode:" end t))) (skip-chars-forward " \11") (let ((beg (point))) (if 
(search-forward ";" end t) (forward-char -1) (goto-char end)) 
(skip-chars-backward " \11") (setq modes (cons (intern (concat (downcase 
(buffer-substring beg (point))) "-mode")) modes)))) (setq modes (cons (intern 
(concat (downcase (buffer-substring (point) end)) "-mode")) modes))))) (if 
modes (catch 'nop (let ((--dolist-tail-- (nreverse modes))) (while 
--dolist-tail-- (let ((mode (car --dolist-tail--))) (if (not (functionp mode)) 
(message "Ignoring unknown mode `%s'" mode) (setq done t) (or (set-auto-mode-0 
mode keep-mode-if-same) (throw 'nop nil))) (setq --dolist-tail-- (cdr 
--dolist-tail--))))))) (and (not done) enable-local-variables 
local-enable-local-variables try-locals (setq mode (hack-local-variables t)) 
(not (memq mode modes)) (if (not (functionp mode)) (message "Ignoring unknown 
mode `%s'" mode) (setq done t) (set-auto-mode-0 mode keep-mode-if-same))) (and 
(not done) (setq mode (save-excursion (goto-char (point-min)) (if (looking-at 
auto-mode-interpreter-regexp) (match-string 2)))) (setq done (assoc-default 
(file-name-nondirectory mode) (mapcar #'(lambda (e) (cons (format "\\`%s\\'" 
(car e)) (cdr e))) interpreter-mode-alist) #'string-match-p)) (set-auto-mode-0 
done keep-mode-if-same)) (if done nil (if (setq done (save-excursion (goto-char 
(point-min)) (save-restriction (narrow-to-region (point-min) (min (point-max) 
(+ (point-min) magic-mode-regexp-match-limit))) (assoc-default nil 
magic-mode-alist #'(lambda (re _dummy) (cond ((functionp re) (funcall re)) 
((stringp re) (let ((case-fold-search nil)) (looking-at re))) (t (error 
"Problem in magic-mode-alist with element %s" re)))))))) (set-auto-mode-0 done 
keep-mode-if-same))) (if done nil (if buffer-file-name (let ((name 
buffer-file-name) (remote-id (file-remote-p buffer-file-name)) 
(case-insensitive-p (file-name-case-insensitive-p buffer-file-name))) (setq 
name (file-name-sans-versions name)) (if (and (stringp remote-id) (string-match 
(regexp-quote remote-id) name)) (progn (setq name (substring name (match-end 
0))))) (while name (setq mode (if case-insensitive-p (let ((case-fold-search 
t)) (assoc-default name auto-mode-alist 'string-match)) (or (let 
((case-fold-search nil)) (assoc-default name auto-mode-alist 'string-match)) 
(and auto-mode-case-fold (let ((case-fold-search t)) (assoc-default name 
auto-mode-alist 'string-match)))))) (if (and mode (consp mode) (car (cdr 
mode))) (setq mode (car mode) name (substring name 0 (match-beginning 0))) 
(setq name nil)) (if mode (progn (set-auto-mode-0 mode keep-mode-if-same) (setq 
done t))))))) (if done nil (if (setq done (save-excursion (goto-char 
(point-min)) (save-restriction (narrow-to-region (point-min) (min (point-max) 
(+ (point-min) magic-mode-regexp-match-limit))) (assoc-default nil 
magic-fallback-mode-alist #'(lambda (re _dummy) (cond ((functionp re) (funcall 
re)) ((stringp re) (let ((case-fold-search nil)) (looking-at re))) (t (error 
"Problem with magic-fallback-mode-alist element: %s" re)))))))) 
(set-auto-mode-0 done keep-mode-if-same))) (if done nil (set-buffer-major-mode 
(current-buffer))))) so-long--set-auto-mode)(t)
|   apply(#f(advice-wrapper :around (closure (t) (&optional keep-mode-if-same) 
"Select major mode appropriate for current buffer.\n..." (let ((try-locals (not 
(inhibit-local-variables-p))) end done mode modes) (save-excursion (goto-char 
(point-min)) (skip-chars-forward " \11\n") (and enable-local-variables 
try-locals (setq end (set-auto-mode-1)) (if (save-excursion ...) (while ... ... 
...) (setq modes ...)))) (if modes (catch 'nop (let (...) (while 
--dolist-tail-- ...)))) (and (not done) enable-local-variables 
local-enable-local-variables try-locals (setq mode (hack-local-variables t)) 
(not (memq mode modes)) (if (not (functionp mode)) (message "Ignoring unknown 
mode `%s'" mode) (setq done t) (set-auto-mode-0 mode keep-mode-if-same))) (and 
(not done) (setq mode (save-excursion (goto-char ...) (if ... ...))) (setq done 
(assoc-default (file-name-nondirectory mode) (mapcar ... 
interpreter-mode-alist) #'string-match-p)) (set-auto-mode-0 done 
keep-mode-if-same)) (if done nil (if (setq done (save-excursion ... ...)) 
(set-auto-mode-0 done keep-mode-if-same))) (if done nil (if buffer-file-name 
(let (... ... ...) (setq name ...) (if ... ...) (while name ... ... ...)))) (if 
done nil (if (setq done (save-excursion ... ...)) (set-auto-mode-0 done 
keep-mode-if-same))) (if done nil (set-buffer-major-mode (current-buffer))))) 
so-long--set-auto-mode) t)
|   set-auto-mode(t)
|   (let ((old major-mode)) (set-auto-mode t) (or (eq old major-mode) 
(hack-local-variables)))
|   (or (not change-major-mode-with-file-name) (get major-mode 'mode-class) 
(and old-try-locals (not (inhibit-local-variables-p)) (hack-local-variables t)) 
(let ((old major-mode)) (set-auto-mode t) (or (eq old major-mode) 
(hack-local-variables))))
|   (condition-case nil (or (not change-major-mode-with-file-name) (get 
major-mode 'mode-class) (and old-try-locals (not (inhibit-local-variables-p)) 
(hack-local-variables t)) (let ((old major-mode)) (set-auto-mode t) (or (eq old 
major-mode) (hack-local-variables)))) (error nil))
|   (let (truename old-try-locals) (if filename (setq filename (if 
(string-equal filename "") nil (expand-file-name filename)))) (if filename 
(progn (setq truename (file-truename filename)) (if find-file-visit-truename 
(setq filename truename)))) (if filename (let ((new-name 
(file-name-nondirectory filename))) (if (string= new-name "") (error "Empty 
file name")))) (let ((buffer (and filename (find-buffer-visiting filename)))) 
(and buffer (not (eq buffer (current-buffer))) (not no-query) (not (y-or-n-p 
(format "A buffer is visiting %s; proceed? " filename))) (user-error 
"Aborted"))) (or (equal filename buffer-file-name) (progn (and filename 
(lock-buffer filename)) (unlock-buffer))) (setq old-try-locals (not 
(inhibit-local-variables-p)) buffer-file-name filename) (if filename (let 
((new-name (file-name-nondirectory buffer-file-name))) (setq default-directory 
(file-name-directory buffer-file-name)) (or (string= new-name (buffer-name)) 
(rename-buffer new-name t)))) (setq buffer-backed-up nil) (or along-with-file 
(clear-visited-file-modtime)) (if truename (progn (setq buffer-file-truename 
(abbreviate-file-name truename)) (if find-file-visit-truename (setq 
buffer-file-name truename)))) (setq buffer-file-number (if filename (nthcdr 10 
(file-attributes buffer-file-name)) nil)) (kill-local-variable 
'write-file-functions) (kill-local-variable 'local-write-file-hooks) 
(kill-local-variable 'revert-buffer-function) (kill-local-variable 
'backup-inhibited) (if vc-mode (setq buffer-read-only nil)) 
(kill-local-variable 'vc-mode) (and buffer-file-name backup-enable-predicate 
(not (funcall backup-enable-predicate buffer-file-name)) (progn 
(make-local-variable 'backup-inhibited) (setq backup-inhibited t))) (let 
((oauto buffer-auto-save-file-name)) (cond ((null filename) (setq 
buffer-auto-save-file-name nil)) ((not buffer-auto-save-file-name) (and 
buffer-file-name auto-save-default (auto-save-mode t))) (t (setq 
buffer-auto-save-file-name (make-auto-save-file-name)))) (and oauto 
buffer-auto-save-file-name (file-exists-p oauto) (rename-file oauto 
buffer-auto-save-file-name t))) (and buffer-file-name (not along-with-file) 
(set-buffer-modified-p t)) (condition-case nil (or (not 
change-major-mode-with-file-name) (get major-mode 'mode-class) (and 
old-try-locals (not (inhibit-local-variables-p)) (hack-local-variables t)) (let 
((old major-mode)) (set-auto-mode t) (or (eq old major-mode) 
(hack-local-variables)))) (error nil)) (run-hooks 
'after-set-visited-file-name-hook))
|   (closure (t) (filename &optional no-query along-with-file) "Change name of 
file visited in current buff..." (interactive "FSet visited file name: ") (if 
(buffer-base-buffer) (error "An indirect buffer cannot visit a file")) (let 
(truename old-try-locals) (if filename (setq filename (if (string-equal 
filename "") nil (expand-file-name filename)))) (if filename (progn (setq 
truename (file-truename filename)) (if find-file-visit-truename (setq filename 
truename)))) (if filename (let ((new-name ...)) (if (string= new-name "") 
(error "Empty file name")))) (let ((buffer (and filename ...))) (and buffer 
(not (eq buffer ...)) (not no-query) (not (y-or-n-p ...)) (user-error 
"Aborted"))) (or (equal filename buffer-file-name) (progn (and filename 
(lock-buffer filename)) (unlock-buffer))) (setq old-try-locals (not 
(inhibit-local-variables-p)) buffer-file-name filename) (if filename (let 
((new-name ...)) (setq default-directory (file-name-directory 
buffer-file-name)) (or (string= new-name ...) (rename-buffer new-name t)))) 
(setq buffer-backed-up nil) (or along-with-file (clear-visited-file-modtime)) 
(if truename (progn (setq buffer-file-truename (abbreviate-file-name truename)) 
(if find-file-visit-truename (setq buffer-file-name truename)))) (setq 
buffer-file-number (if filename (nthcdr 10 (file-attributes buffer-file-name)) 
nil)) (kill-local-variable 'write-file-functions) (kill-local-variable 
'local-write-file-hooks) (kill-local-variable 'revert-buffer-function) 
(kill-local-variable 'backup-inhibited) (if vc-mode (setq buffer-read-only 
nil)) (kill-local-variable 'vc-mode) (and buffer-file-name 
backup-enable-predicate (not (funcall backup-enable-predicate 
buffer-file-name)) (progn (make-local-variable 'backup-inhibited) (setq 
backup-inhibited t))) (let ((oauto buffer-auto-save-file-name)) (cond ((null 
filename) (setq buffer-auto-save-file-name nil)) ((not 
buffer-auto-save-file-name) (and buffer-file-name auto-save-default ...)) (t 
(setq buffer-auto-save-file-name ...))) (and oauto buffer-auto-save-file-name 
(file-exists-p oauto) (rename-file oauto buffer-auto-save-file-name t))) (and 
buffer-file-name (not along-with-file) (set-buffer-modified-p t)) 
(condition-case nil (or (not change-major-mode-with-file-name) (get major-mode 
'mode-class) (and old-try-locals (not ...) (hack-local-variables t)) (let (...) 
(set-auto-mode t) (or ... ...))) (error nil)) (run-hooks 
'after-set-visited-file-name-hook)))("/tmp/emacs-gnus-mock-WDzPUE/init.el" t)
|   apply((closure (t) (filename &optional no-query along-with-file) "Change 
name of file visited in current buffer to F..." (interactive "FSet visited file 
name: ") (if (buffer-base-buffer) (error "An indirect buffer cannot visit a 
file")) (let (truename old-try-locals) (if filename (setq filename (if 
(string-equal filename "") nil (expand-file-name filename)))) (if filename 
(progn (setq truename (file-truename filename)) (if find-file-visit-truename 
(setq filename truename)))) (if filename (let ((new-name 
(file-name-nondirectory filename))) (if (string= new-name "") (error "Empty 
file name")))) (let ((buffer (and filename (find-buffer-visiting filename)))) 
(and buffer (not (eq buffer (current-buffer))) (not no-query) (not (y-or-n-p 
(format "A buffer is visiting %s; proceed? " filename))) (user-error 
"Aborted"))) (or (equal filename buffer-file-name) (progn (and filename 
(lock-buffer filename)) (unlock-buffer))) (setq old-try-locals (not 
(inhibit-local-variables-p)) buffer-file-name filename) (if filename (let 
((new-name (file-name-nondirectory buffer-file-name))) (setq default-directory 
(file-name-directory buffer-file-name)) (or (string= new-name (buffer-name)) 
(rename-buffer new-name t)))) (setq buffer-backed-up nil) (or along-with-file 
(clear-visited-file-modtime)) (if truename (progn (setq buffer-file-truename 
(abbreviate-file-name truename)) (if find-file-visit-truename (setq 
buffer-file-name truename)))) (setq buffer-file-number (if filename (nthcdr 10 
(file-attributes buffer-file-name)) nil)) (kill-local-variable 
'write-file-functions) (kill-local-variable 'local-write-file-hooks) 
(kill-local-variable 'revert-buffer-function) (kill-local-variable 
'backup-inhibited) (if vc-mode (setq buffer-read-only nil)) 
(kill-local-variable 'vc-mode) (and buffer-file-name backup-enable-predicate 
(not (funcall backup-enable-predicate buffer-file-name)) (progn 
(make-local-variable 'backup-inhibited) (setq backup-inhibited t))) (let 
((oauto buffer-auto-save-file-name)) (cond ((null filename) (setq 
buffer-auto-save-file-name nil)) ((not buffer-auto-save-file-name) (and 
buffer-file-name auto-save-default (auto-save-mode t))) (t (setq 
buffer-auto-save-file-name (make-auto-save-file-name)))) (and oauto 
buffer-auto-save-file-name (file-exists-p oauto) (rename-file oauto 
buffer-auto-save-file-name t))) (and buffer-file-name (not along-with-file) 
(set-buffer-modified-p t)) (condition-case nil (or (not 
change-major-mode-with-file-name) (get major-mode 'mode-class) (and 
old-try-locals (not (inhibit-local-variables-p)) (hack-local-variables t)) (let 
((old major-mode)) (set-auto-mode t) (or (eq old major-mode) 
(hack-local-variables)))) (error nil)) (run-hooks 
'after-set-visited-file-name-hook))) ("/tmp/emacs-gnus-mock-WDzPUE/init.el" t))
|   set-visited-file-name("/tmp/emacs-gnus-mock-WDzPUE/init.el" t)
|   (progn (if (directory-name-p filename) (setq filename (concat filename 
(file-name-nondirectory (or buffer-file-name (buffer-name)))))) (and confirm 
(file-exists-p filename) (not (and (eq (framep-on-display) 'ns) (listp 
last-nonmenu-event) use-dialog-box)) (or (y-or-n-p (format-message "File `%s' 
exists; overwrite? " filename)) (user-error "Canceled"))) 
(set-visited-file-name filename (not confirm)))
|   (or (null filename) (string-equal filename "") (progn (if (directory-name-p 
filename) (setq filename (concat filename (file-name-nondirectory (or 
buffer-file-name (buffer-name)))))) (and confirm (file-exists-p filename) (not 
(and (eq (framep-on-display) 'ns) (listp last-nonmenu-event) use-dialog-box)) 
(or (y-or-n-p (format-message "File `%s' exists; overwrite? " filename)) 
(user-error "Canceled"))) (set-visited-file-name filename (not confirm))))
|   (closure (t) (filename &optional confirm) "Write current buffer into file 
FILENAME.\nThis make..." (interactive (list (if buffer-file-name 
(read-file-name "Write file: " nil nil nil nil) (read-file-name "Write file: " 
default-directory (expand-file-name (file-name-nondirectory ...) 
default-directory) nil nil)) (not current-prefix-arg))) (or (null filename) 
(string-equal filename "") (progn (if (directory-name-p filename) (setq 
filename (concat filename (file-name-nondirectory ...)))) (and confirm 
(file-exists-p filename) (not (and (eq ... ...) (listp last-nonmenu-event) 
use-dialog-box)) (or (y-or-n-p (format-message "File `%s' exists; overwrite? " 
filename)) (user-error "Canceled"))) (set-visited-file-name filename (not 
confirm)))) (set-buffer-modified-p t) (and buffer-file-name (file-writable-p 
buffer-file-name) (setq buffer-read-only nil)) (save-buffer) 
(vc-refresh-state))("/tmp/emacs-gnus-mock-WDzPUE/init.el")
|   apply((closure (t) (filename &optional confirm) "Write current buffer into 
file FILENAME.\nThis make..." (interactive (list (if buffer-file-name 
(read-file-name "Write file: " nil nil nil nil) (read-file-name "Write file: " 
default-directory (expand-file-name (file-name-nondirectory ...) 
default-directory) nil nil)) (not current-prefix-arg))) (or (null filename) 
(string-equal filename "") (progn (if (directory-name-p filename) (setq 
filename (concat filename (file-name-nondirectory ...)))) (and confirm 
(file-exists-p filename) (not (and (eq ... ...) (listp last-nonmenu-event) 
use-dialog-box)) (or (y-or-n-p (format-message "File `%s' exists; overwrite? " 
filename)) (user-error "Canceled"))) (set-visited-file-name filename (not 
confirm)))) (set-buffer-modified-p t) (and buffer-file-name (file-writable-p 
buffer-file-name) (setq buffer-read-only nil)) (save-buffer) 
(vc-refresh-state)) "/tmp/emacs-gnus-mock-WDzPUE/init.el")
|   write-file("/tmp/emacs-gnus-mock-WDzPUE/init.el")
|   gnus-mock-start()
|   funcall-interactively(gnus-mock-start)
|   call-interactively(gnus-mock-start record nil)
|   command-execute(gnus-mock-start record)

When I delete the (buffer-read-only . t) association from
`so-long-variable-overrides' the problem is fixed.  The only so-long
thing in my init file is (global-so-long-mode 1).  Since some people
will do this and the default behavior breaks gnus-mock I guess you will
want to handle this somehow.


Regards,

Michael.





reply via email to

[Prev in Thread] Current Thread [Next in Thread]