* message.el (message-expand-group): Pass the common
[bpt/emacs.git] / lisp / mail / emacsbug.el
CommitLineData
55535639 1;;; emacsbug.el --- command to report Emacs bugs to appropriate mailing list
c0274f38 2
e84b4b86
TTN
3;; Copyright (C) 1985, 1994, 1997, 1998, 2000, 2001, 2002, 2003,
4;; 2004, 2005 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
e5167999 15;; the Free Software Foundation; either version 2, 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
515ced27
MR
59(defvar report-emacs-bug-text-prompt nil
60 "The automatically-created initial prompt of bug report.")
61
fbd410d6
RS
62(defcustom report-emacs-bug-no-confirmation nil
63 "*If non-nil, suppress the confirmations asked for the sake of novice users."
64 :group 'emacsbug
65 :type 'boolean)
66
67(defcustom report-emacs-bug-no-explanations nil
68 "*If non-nil, suppress the explanations given for the sake of novice users."
69 :group 'emacsbug
70 :type 'boolean)
fe1d8b33 71
aa228418 72;;;###autoload
01753e63 73(defun report-emacs-bug (topic &optional recent-keys)
aa228418 74 "Report a bug in GNU Emacs.
a2535589 75Prompts for bug subject. Leaves you in a mail buffer."
01753e63
EN
76 ;; This strange form ensures that (recent-keys) is the value before
77 ;; the bug subject string is read.
78 (interactive (reverse (list (recent-keys) (read-string "Bug Subject: "))))
8ab5d35a
EZ
79 ;; If there are four numbers in emacs-version, this is a pretest
80 ;; version.
81 (let ((pretest-p (string-match "\\..*\\..*\\." emacs-version))
3c3ba27b 82 (from-buffer (current-buffer))
515ced27 83 user-point prompt-beg-point message-end-point)
0a18209b 84 (setq message-end-point
5e11c425 85 (with-current-buffer (get-buffer-create "*Messages*")
0a18209b 86 (point-max-marker)))
8ab5d35a 87 (compose-mail (if pretest-p
0a18209b 88 report-emacs-bug-pretest-address
7b27eb53 89 report-emacs-bug-address)
0a18209b
KH
90 topic)
91 ;; The rest of this does not execute
92 ;; if the user was asked to confirm and said no.
9e68869b
RS
93 (rfc822-goto-eoh)
94 (forward-line 1)
95
96 (let ((signature (buffer-substring (point) (point-max))))
9e68869b 97 (delete-region (point) (point-max))
518adca2
RS
98 (insert signature)
99 (backward-char (length signature)))
515ced27 100 (setq prompt-beg-point (point))
fbd410d6
RS
101 (unless report-emacs-bug-no-explanations
102 ;; Insert warnings for novice users.
103 (insert "This bug report will be sent to the Free Software Foundation,\n")
104 (let ((pos (point)))
94821e4f 105 (insert "not to your local site managers!")
fbd410d6
RS
106 (put-text-property pos (point) 'face 'highlight))
107 (insert "\nPlease write in ")
108 (let ((pos (point)))
109 (insert "English")
110 (put-text-property pos (point) 'face 'highlight))
9210027b
RS
111 (insert " if possible, because the Emacs maintainers
112usually do not have translators to read other languages for them.\n\n")
8ab5d35a
EZ
113 (insert (format "Your bug report will be posted to the %s mailing list"
114 (if pretest-p
115 report-emacs-bug-pretest-address
116 report-emacs-bug-address)))
117 (if pretest-p
118 (insert ".\n\n")
119 (insert ",\nand to the gnu.emacs.bug news group.\n\n")))
fe1d8b33 120
515ced27
MR
121 (insert "Please describe exactly what actions triggered the bug\n"
122 "and the precise symptoms of the bug:")
123 (setq report-emacs-bug-text-prompt
124 (buffer-substring prompt-beg-point (point)))
125
126 (insert "\n\n")
127 (setq user-point (point))
3a7f4c18
KS
128 (insert "\n\n")
129
130 (insert "If emacs crashed, and you have the emacs process in the gdb debugger,\n"
131 "please include the output from the following gdb commands:\n"
132 " `bt full' and `xbacktrace'.\n")
133
134 (let ((debug-file (expand-file-name "DEBUG" data-directory)))
135 (if (file-readable-p debug-file)
136 (insert "If you would like to further debug the crash, please read the file\n"
137 debug-file " for instructions.\n")))
515ced27 138
3a7f4c18 139 (insert "\n\nIn " (emacs-version) "\n")
f4982064 140 (if (fboundp 'x-server-vendor)
6f8a2742 141 (condition-case nil
8a4144ca 142 (insert "X server distributor `" (x-server-vendor) "', version "
6f8a2742
JD
143 (mapconcat 'number-to-string (x-server-version) ".") "\n")
144 (error t)))
0a18209b
KH
145 (if (and system-configuration-options
146 (not (equal system-configuration-options "")))
147 (insert "configured using `configure "
515ced27 148 system-configuration-options "'\n\n"))
dc81f8a2 149 (insert "Important settings:\n")
249dd409
EZ
150 (mapcar
151 '(lambda (var)
152 (insert (format " value of $%s: %s\n" var (getenv var))))
153 '("LC_ALL" "LC_COLLATE" "LC_CTYPE" "LC_MESSAGES"
154 "LC_MONETARY" "LC_NUMERIC" "LC_TIME" "LANG"))
dc81f8a2
EZ
155 (insert (format " locale-coding-system: %s\n" locale-coding-system))
156 (insert (format " default-enable-multibyte-characters: %s\n"
157 default-enable-multibyte-characters))
0a18209b 158 (insert "\n")
3c3ba27b
RS
159 (insert (format "Major mode: %s\n"
160 (buffer-local-value 'mode-name from-buffer)))
e927088b
RS
161 (insert "\n")
162 (insert "Minor modes in effect:\n")
163 (dolist (mode minor-mode-list)
3c3ba27b
RS
164 (and (boundp mode) (buffer-local-value mode from-buffer)
165 (insert (format " %s: %s\n" mode
166 (buffer-local-value mode from-buffer)))))
e927088b 167 (insert "\n")
515ced27 168 (insert "Recent input:\n")
0a18209b
KH
169 (let ((before-keys (point)))
170 (insert (mapconcat (lambda (key)
171 (if (or (integerp key)
172 (symbolp key)
173 (listp key))
174 (single-key-description key)
175 (prin1-to-string key nil)))
176 (or recent-keys (recent-keys))
177 " "))
178 (save-restriction
179 (narrow-to-region before-keys (point))
180 (goto-char before-keys)
181 (while (progn (move-to-column 50) (not (eobp)))
182 (search-forward " " nil t)
183 (insert "\n"))))
184 (let ((message-buf (get-buffer "*Messages*")))
185 (if message-buf
186 (let (beg-pos
187 (end-pos message-end-point))
188 (with-current-buffer message-buf
189 (goto-char end-pos)
190 (forward-line -10)
191 (setq beg-pos (point)))
192 (insert "\n\nRecent messages:\n")
193 (insert-buffer-substring message-buf beg-pos end-pos))))
194 ;; This is so the user has to type something
195 ;; in order to send easily.
196 (use-local-map (nconc (make-sparse-keymap) (current-local-map)))
197 (define-key (current-local-map) "\C-c\C-i" 'report-emacs-bug-info)
e9227982
RS
198 (unless report-emacs-bug-no-explanations
199 (with-output-to-temp-buffer "*Bug Help*"
200 (if (eq mail-user-agent 'sendmail-user-agent)
201 (princ (substitute-command-keys
202 "Type \\[mail-send-and-exit] to send the bug report.\n")))
203 (princ (substitute-command-keys
204 "Type \\[kill-buffer] RET to cancel (don't send it).\n"))
205 (terpri)
206 (princ (substitute-command-keys
207 "Type \\[report-emacs-bug-info] to visit in Info the Emacs Manual section
1628adc6
KH
208about when and how to write a bug report,
209and what information to supply so that the bug can be fixed.
e9227982 210Type SPC to scroll through this section and its subsections."))))
0a18209b
KH
211 ;; Make it less likely people will send empty messages.
212 (make-local-variable 'mail-send-hook)
213 (add-hook 'mail-send-hook 'report-emacs-bug-hook)
0a18209b
KH
214 (save-excursion
215 (goto-char (point-max))
216 (skip-chars-backward " \t\n")
217 (make-local-variable 'report-emacs-bug-orig-text)
218 (setq report-emacs-bug-orig-text (buffer-substring (point-min) (point))))
219 (goto-char user-point)))
e24ec555 220
1628adc6
KH
221(defun report-emacs-bug-info ()
222 "Go to the Info node on reporting Emacs bugs."
223 (interactive)
224 (info)
225 (Info-directory)
226 (Info-menu "emacs")
227 (Info-goto-node "Bugs"))
228
e24ec555
RS
229(defun report-emacs-bug-hook ()
230 (save-excursion
c7127655
MR
231 (save-excursion
232 (goto-char (point-max))
233 (skip-chars-backward " \t\n")
234 (if (and (= (- (point) (point-min))
235 (length report-emacs-bug-orig-text))
236 (equal (buffer-substring (point-min) (point))
237 report-emacs-bug-orig-text))
238 (error "No text entered in bug report")))
fe1d8b33
KH
239
240 ;; Check the buffer contents and reject non-English letters.
9b4e41ac
RS
241 (save-excursion
242 (goto-char (point-min))
243 (skip-chars-forward "\0-\177")
244 (if (not (eobp))
fbd410d6 245 (if (or report-emacs-bug-no-confirmation
02f6b354 246 (y-or-n-p "Convert non-ASCII letters to hexadecimal? "))
9b4e41ac
RS
247 (while (progn (skip-chars-forward "\0-\177")
248 (not (eobp)))
249 (let ((ch (following-char)))
250 (delete-char 1)
22ad9937 251 (insert (format "=%02x" ch)))))))
fe1d8b33
KH
252
253 ;; The last warning for novice users.
fbd410d6 254 (if (or report-emacs-bug-no-confirmation
fe1d8b33 255 (yes-or-no-p
02f6b354 256 "Send this bug report to the Emacs maintainers? "))
fe1d8b33
KH
257 ;; Just send the current mail.
258 nil
259 (goto-char (point-min))
260 (if (search-forward "To: ")
261 (let ((pos (point)))
262 (end-of-line)
263 (delete-region pos (point))))
264 (kill-local-variable 'mail-send-hook)
265 (with-output-to-temp-buffer "*Bug Help*"
266 (princ (substitute-command-keys "\
02f6b354
RS
267You invoked the command M-x report-emacs-bug,
268but you decided not to mail the bug report to the Emacs maintainers.
fe1d8b33 269
02f6b354
RS
270If you want to mail it to someone else instead,
271please insert the proper e-mail address after \"To: \",
272and send the mail again using \\[mail-send-and-exit].")))
273 (error "M-x report-emacs-bug was cancelled, please read *Bug Help* buffer"))
ea33ba73
TTN
274
275 ;; Unclutter
276 (mail-text)
515ced27
MR
277 (if (looking-at report-emacs-bug-text-prompt)
278 (replace-match "Symptoms:"))))
a2535589 279
8e0ff8c8
ER
280(provide 'emacsbug)
281
ab5796a9 282;;; arch-tag: 248b6523-c3b5-4fec-9a3f-0411fafa7d49
c0274f38 283;;; emacsbug.el ends here