Commit | Line | Data |
---|---|---|
55535639 | 1 | ;;; emacsbug.el --- command to report Emacs bugs to appropriate mailing list |
c0274f38 | 2 | |
e84b4b86 | 3 | ;; Copyright (C) 1985, 1994, 1997, 1998, 2000, 2001, 2002, 2003, |
d7a0267c | 4 | ;; 2004, 2005, 2006, 2007 Free Software Foundation, Inc. |
9750e079 | 5 | |
e5167999 | 6 | ;; Author: K. Shane Hartman |
2f14b48d | 7 | ;; Maintainer: FSF |
fbd410d6 | 8 | ;; Keywords: maint mail |
2f14b48d | 9 | |
a2535589 | 10 | ;; Not fully installed because it can work only on Internet hosts. |
a2535589 JA |
11 | ;; This file is part of GNU Emacs. |
12 | ||
13 | ;; GNU Emacs is free software; you can redistribute it and/or modify | |
14 | ;; it under the terms of the GNU General Public License as published by | |
ceaeecb0 | 15 | ;; the Free Software Foundation; either version 3, or (at your option) |
a2535589 JA |
16 | ;; any later version. |
17 | ||
18 | ;; GNU Emacs is distributed in the hope that it will be useful, | |
19 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
20 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
21 | ;; GNU General Public License for more details. | |
22 | ||
23 | ;; You should have received a copy of the GNU General Public License | |
b578f267 | 24 | ;; along with GNU Emacs; see the file COPYING. If not, write to the |
3a35cf56 LK |
25 | ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
26 | ;; Boston, MA 02110-1301, USA. | |
a2535589 | 27 | |
e41b2db1 ER |
28 | ;;; Commentary: |
29 | ||
b92a07e0 | 30 | ;; `M-x report-emacs-bug' starts an email note to the Emacs maintainers |
e41b2db1 ER |
31 | ;; describing a problem. Here's how it's done... |
32 | ||
2f14b48d | 33 | ;;; Code: |
a2535589 JA |
34 | |
35 | ;; >> This should be an address which is accessible to your machine, | |
36 | ;; >> otherwise you can't use this file. It will only work on the | |
37 | ;; >> internet with this address. | |
38 | ||
f9f9cd92 KH |
39 | (require 'sendmail) |
40 | ||
fbd410d6 RS |
41 | (defgroup emacsbug nil |
42 | "Sending Emacs bug reports." | |
43 | :group 'maint | |
44 | :group 'mail) | |
45 | ||
9b4e41ac | 46 | (defcustom report-emacs-bug-address "bug-gnu-emacs@gnu.org" |
7b27eb53 RS |
47 | "*Address of mailing list for GNU Emacs bugs." |
48 | :group 'emacsbug | |
49 | :type 'string) | |
a85a468e | 50 | |
9b4e41ac | 51 | (defcustom report-emacs-bug-pretest-address "emacs-pretest-bug@gnu.org" |
7b27eb53 RS |
52 | "*Address of mailing list for GNU Emacs pretest bugs." |
53 | :group 'emacsbug | |
54 | :type 'string) | |
a2535589 | 55 | |
e24ec555 RS |
56 | (defvar report-emacs-bug-orig-text nil |
57 | "The automatically-created initial text of bug report.") | |
58 | ||
fbd410d6 RS |
59 | (defcustom report-emacs-bug-no-confirmation nil |
60 | "*If non-nil, suppress the confirmations asked for the sake of novice users." | |
61 | :group 'emacsbug | |
62 | :type 'boolean) | |
63 | ||
64 | (defcustom report-emacs-bug-no-explanations nil | |
65 | "*If non-nil, suppress the explanations given for the sake of novice users." | |
66 | :group 'emacsbug | |
67 | :type 'boolean) | |
fe1d8b33 | 68 | |
aa228418 | 69 | ;;;###autoload |
01753e63 | 70 | (defun report-emacs-bug (topic &optional recent-keys) |
aa228418 | 71 | "Report a bug in GNU Emacs. |
a2535589 | 72 | Prompts for bug subject. Leaves you in a mail buffer." |
01753e63 EN |
73 | ;; This strange form ensures that (recent-keys) is the value before |
74 | ;; the bug subject string is read. | |
75 | (interactive (reverse (list (recent-keys) (read-string "Bug Subject: ")))) | |
a722966c MC |
76 | ;; The syntax `version;' is preferred to `[version]' because the |
77 | ;; latter could be mistakenly stripped by mailing software. | |
ef77dde4 MC |
78 | (if (eq system-type 'ms-dos) |
79 | (setq topic (concat emacs-version "; " topic)) | |
80 | (when (string-match "^\\(\\([.0-9]+\\)*\\)\\.[0-9]+$" emacs-version) | |
81 | (setq topic (concat (match-string 1 emacs-version) "; " topic)))) | |
82 | ;; If there are four numbers in emacs-version (three for MS-DOS), | |
83 | ;; this is a pretest version. | |
84 | (let* ((pretest-p (string-match (if (eq system-type 'ms-dos) | |
85 | "\\..*\\." | |
86 | "\\..*\\..*\\.") | |
87 | emacs-version)) | |
a722966c MC |
88 | (from-buffer (current-buffer)) |
89 | (reporting-address (if pretest-p | |
90 | report-emacs-bug-pretest-address | |
91 | report-emacs-bug-address)) | |
92 | ;; Put these properties on semantically-void text. | |
93 | (prompt-properties '(field emacsbug-prompt | |
94 | intangible but-helpful | |
95 | rear-nonsticky t)) | |
96 | user-point message-end-point) | |
0a18209b | 97 | (setq message-end-point |
5e11c425 | 98 | (with-current-buffer (get-buffer-create "*Messages*") |
0a18209b | 99 | (point-max-marker))) |
53dab082 | 100 | (compose-mail reporting-address |
0a18209b KH |
101 | topic) |
102 | ;; The rest of this does not execute | |
103 | ;; if the user was asked to confirm and said no. | |
9e68869b RS |
104 | (rfc822-goto-eoh) |
105 | (forward-line 1) | |
106 | ||
107 | (let ((signature (buffer-substring (point) (point-max)))) | |
9e68869b | 108 | (delete-region (point) (point-max)) |
518adca2 RS |
109 | (insert signature) |
110 | (backward-char (length signature))) | |
fbd410d6 RS |
111 | (unless report-emacs-bug-no-explanations |
112 | ;; Insert warnings for novice users. | |
53dab082 EZ |
113 | (when (string-match "@gnu\\.org^" reporting-address) |
114 | (insert "This bug report will be sent to the Free Software Foundation,\n") | |
115 | (let ((pos (point))) | |
116 | (insert "not to your local site managers!") | |
117 | (put-text-property pos (point) 'face 'highlight))) | |
a722966c | 118 | (insert "\nPlease write in ") |
fbd410d6 RS |
119 | (let ((pos (point))) |
120 | (insert "English") | |
121 | (put-text-property pos (point) 'face 'highlight)) | |
9210027b RS |
122 | (insert " if possible, because the Emacs maintainers |
123 | usually do not have translators to read other languages for them.\n\n") | |
8ab5d35a | 124 | (insert (format "Your bug report will be posted to the %s mailing list" |
53dab082 | 125 | reporting-address)) |
8ab5d35a EZ |
126 | (if pretest-p |
127 | (insert ".\n\n") | |
128 | (insert ",\nand to the gnu.emacs.bug news group.\n\n"))) | |
fe1d8b33 | 129 | |
515ced27 | 130 | (insert "Please describe exactly what actions triggered the bug\n" |
9888f112 TTN |
131 | "and the precise symptoms of the bug:\n\n") |
132 | (add-text-properties (point) (save-excursion (mail-text) (point)) | |
133 | prompt-properties) | |
515ced27 | 134 | |
515ced27 | 135 | (setq user-point (point)) |
3a7f4c18 KS |
136 | (insert "\n\n") |
137 | ||
fca615d5 | 138 | (insert "If Emacs crashed, and you have the Emacs process in the gdb debugger,\n" |
3a7f4c18 KS |
139 | "please include the output from the following gdb commands:\n" |
140 | " `bt full' and `xbacktrace'.\n") | |
141 | ||
142 | (let ((debug-file (expand-file-name "DEBUG" data-directory))) | |
143 | (if (file-readable-p debug-file) | |
a722966c MC |
144 | (insert "If you would like to further debug the crash, please read the file\n" |
145 | debug-file " for instructions.\n"))) | |
9888f112 | 146 | (add-text-properties (1+ user-point) (point) prompt-properties) |
515ced27 | 147 | |
3a7f4c18 | 148 | (insert "\n\nIn " (emacs-version) "\n") |
f4982064 | 149 | (if (fboundp 'x-server-vendor) |
6f8a2742 | 150 | (condition-case nil |
951c155f SM |
151 | ;; This is used not only for X11 but also W32 and others. |
152 | (insert "Windowing system distributor `" (x-server-vendor) | |
153 | "', version " | |
6f8a2742 JD |
154 | (mapconcat 'number-to-string (x-server-version) ".") "\n") |
155 | (error t))) | |
0a18209b KH |
156 | (if (and system-configuration-options |
157 | (not (equal system-configuration-options ""))) | |
158 | (insert "configured using `configure " | |
515ced27 | 159 | system-configuration-options "'\n\n")) |
dc81f8a2 | 160 | (insert "Important settings:\n") |
1daad47d | 161 | (mapc |
249dd409 EZ |
162 | '(lambda (var) |
163 | (insert (format " value of $%s: %s\n" var (getenv var)))) | |
164 | '("LC_ALL" "LC_COLLATE" "LC_CTYPE" "LC_MESSAGES" | |
165 | "LC_MONETARY" "LC_NUMERIC" "LC_TIME" "LANG")) | |
dc81f8a2 EZ |
166 | (insert (format " locale-coding-system: %s\n" locale-coding-system)) |
167 | (insert (format " default-enable-multibyte-characters: %s\n" | |
168 | default-enable-multibyte-characters)) | |
0a18209b | 169 | (insert "\n") |
3c3ba27b RS |
170 | (insert (format "Major mode: %s\n" |
171 | (buffer-local-value 'mode-name from-buffer))) | |
e927088b RS |
172 | (insert "\n") |
173 | (insert "Minor modes in effect:\n") | |
174 | (dolist (mode minor-mode-list) | |
3c3ba27b RS |
175 | (and (boundp mode) (buffer-local-value mode from-buffer) |
176 | (insert (format " %s: %s\n" mode | |
177 | (buffer-local-value mode from-buffer))))) | |
e927088b | 178 | (insert "\n") |
515ced27 | 179 | (insert "Recent input:\n") |
0a18209b KH |
180 | (let ((before-keys (point))) |
181 | (insert (mapconcat (lambda (key) | |
182 | (if (or (integerp key) | |
183 | (symbolp key) | |
184 | (listp key)) | |
185 | (single-key-description key) | |
186 | (prin1-to-string key nil))) | |
187 | (or recent-keys (recent-keys)) | |
188 | " ")) | |
189 | (save-restriction | |
190 | (narrow-to-region before-keys (point)) | |
191 | (goto-char before-keys) | |
192 | (while (progn (move-to-column 50) (not (eobp))) | |
193 | (search-forward " " nil t) | |
194 | (insert "\n")))) | |
195 | (let ((message-buf (get-buffer "*Messages*"))) | |
196 | (if message-buf | |
197 | (let (beg-pos | |
198 | (end-pos message-end-point)) | |
199 | (with-current-buffer message-buf | |
200 | (goto-char end-pos) | |
201 | (forward-line -10) | |
202 | (setq beg-pos (point))) | |
203 | (insert "\n\nRecent messages:\n") | |
204 | (insert-buffer-substring message-buf beg-pos end-pos)))) | |
205 | ;; This is so the user has to type something | |
206 | ;; in order to send easily. | |
207 | (use-local-map (nconc (make-sparse-keymap) (current-local-map))) | |
208 | (define-key (current-local-map) "\C-c\C-i" 'report-emacs-bug-info) | |
e9227982 RS |
209 | (unless report-emacs-bug-no-explanations |
210 | (with-output-to-temp-buffer "*Bug Help*" | |
211 | (if (eq mail-user-agent 'sendmail-user-agent) | |
212 | (princ (substitute-command-keys | |
213 | "Type \\[mail-send-and-exit] to send the bug report.\n"))) | |
214 | (princ (substitute-command-keys | |
215 | "Type \\[kill-buffer] RET to cancel (don't send it).\n")) | |
216 | (terpri) | |
217 | (princ (substitute-command-keys | |
218 | "Type \\[report-emacs-bug-info] to visit in Info the Emacs Manual section | |
1628adc6 KH |
219 | about when and how to write a bug report, |
220 | and what information to supply so that the bug can be fixed. | |
e9227982 | 221 | Type SPC to scroll through this section and its subsections.")))) |
0a18209b KH |
222 | ;; Make it less likely people will send empty messages. |
223 | (make-local-variable 'mail-send-hook) | |
224 | (add-hook 'mail-send-hook 'report-emacs-bug-hook) | |
0a18209b KH |
225 | (save-excursion |
226 | (goto-char (point-max)) | |
227 | (skip-chars-backward " \t\n") | |
228 | (make-local-variable 'report-emacs-bug-orig-text) | |
229 | (setq report-emacs-bug-orig-text (buffer-substring (point-min) (point)))) | |
230 | (goto-char user-point))) | |
e24ec555 | 231 | |
e8ffb999 DN |
232 | (declare-function Info-menu "../info" (menu-item &optional fork)) |
233 | (declare-function Info-goto-node "../info" (nodename &optional fork)) | |
6d00e226 | 234 | |
1628adc6 KH |
235 | (defun report-emacs-bug-info () |
236 | "Go to the Info node on reporting Emacs bugs." | |
237 | (interactive) | |
238 | (info) | |
239 | (Info-directory) | |
240 | (Info-menu "emacs") | |
241 | (Info-goto-node "Bugs")) | |
242 | ||
e24ec555 RS |
243 | (defun report-emacs-bug-hook () |
244 | (save-excursion | |
c7127655 MR |
245 | (save-excursion |
246 | (goto-char (point-max)) | |
247 | (skip-chars-backward " \t\n") | |
248 | (if (and (= (- (point) (point-min)) | |
249 | (length report-emacs-bug-orig-text)) | |
250 | (equal (buffer-substring (point-min) (point)) | |
251 | report-emacs-bug-orig-text)) | |
252 | (error "No text entered in bug report"))) | |
fe1d8b33 KH |
253 | |
254 | ;; Check the buffer contents and reject non-English letters. | |
9b4e41ac RS |
255 | (save-excursion |
256 | (goto-char (point-min)) | |
257 | (skip-chars-forward "\0-\177") | |
258 | (if (not (eobp)) | |
fbd410d6 | 259 | (if (or report-emacs-bug-no-confirmation |
02f6b354 | 260 | (y-or-n-p "Convert non-ASCII letters to hexadecimal? ")) |
9b4e41ac RS |
261 | (while (progn (skip-chars-forward "\0-\177") |
262 | (not (eobp))) | |
263 | (let ((ch (following-char))) | |
264 | (delete-char 1) | |
22ad9937 | 265 | (insert (format "=%02x" ch))))))) |
fe1d8b33 KH |
266 | |
267 | ;; The last warning for novice users. | |
fbd410d6 | 268 | (if (or report-emacs-bug-no-confirmation |
fe1d8b33 | 269 | (yes-or-no-p |
02f6b354 | 270 | "Send this bug report to the Emacs maintainers? ")) |
fe1d8b33 KH |
271 | ;; Just send the current mail. |
272 | nil | |
273 | (goto-char (point-min)) | |
274 | (if (search-forward "To: ") | |
275 | (let ((pos (point))) | |
276 | (end-of-line) | |
277 | (delete-region pos (point)))) | |
278 | (kill-local-variable 'mail-send-hook) | |
279 | (with-output-to-temp-buffer "*Bug Help*" | |
280 | (princ (substitute-command-keys "\ | |
02f6b354 RS |
281 | You invoked the command M-x report-emacs-bug, |
282 | but you decided not to mail the bug report to the Emacs maintainers. | |
fe1d8b33 | 283 | |
02f6b354 RS |
284 | If you want to mail it to someone else instead, |
285 | please insert the proper e-mail address after \"To: \", | |
286 | and send the mail again using \\[mail-send-and-exit]."))) | |
287 | (error "M-x report-emacs-bug was cancelled, please read *Bug Help* buffer")) | |
ea33ba73 TTN |
288 | |
289 | ;; Unclutter | |
290 | (mail-text) | |
9888f112 TTN |
291 | (let ((pos (1- (point)))) |
292 | (while (setq pos (text-property-any pos (point-max) | |
293 | 'field 'emacsbug-prompt)) | |
294 | (delete-region pos (field-end (1+ pos))))))) | |
a2535589 | 295 | |
8e0ff8c8 ER |
296 | (provide 'emacsbug) |
297 | ||
951c155f | 298 | ;; arch-tag: 248b6523-c3b5-4fec-9a3f-0411fafa7d49 |
c0274f38 | 299 | ;;; emacsbug.el ends here |