(vc-backend-checkout): Do not set umask to value that does not allow
[bpt/emacs.git] / lisp / mail / reporter.el
CommitLineData
bf3b07d3 1;;; reporter.el --- customizable bug reporting of lisp programs
9ee9b53e 2;; Copyright (C) 1993 Free Software Foundation, Inc.
bf3b07d3
RS
3
4;; Author: 1993 Barry A. Warsaw, Century Computing Inc. <bwarsaw@cen.com>
5;; Maintainer: bwarsaw@cen.com
6;; Created: 19-Apr-1993
bf3b07d3
RS
7;; Keywords: bug reports lisp
8
54d2ecd3 9;; This file is part of GNU Emacs.
bf3b07d3
RS
10;;
11;; This program is free software; you can redistribute it and/or modify
12;; it under the terms of the GNU General Public License as published by
13;; the Free Software Foundation; either version 2 of the License, or
14;; (at your option) any later version.
15;;
16;; This program is distributed in the hope that it will be useful,
17;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19;; GNU General Public License for more details.
20;;
21;; You should have received a copy of the GNU General Public License
22;; along with this program; if not, write to the Free Software
23;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24
25;; Introduction
26;; ============
27;; This program is for lisp package authors and is used to ease
28;; reporting of bugs. When invoked, reporter-submit-bug-report will
29;; set up a mail buffer with the appropriate bug report address,
30;; including a lisp expression the maintainer of the package can use
31;; to completely reproduce the environment in which the bug was
32;; observed (e.g. by using eval-last-sexp). This package is especially
33;; useful for my development of c++-mode.el, which is highly dependent
34;; on its configuration variables.
35;;
36;; Do a "C-h f reporter-submit-bug-report" for more information.
37;; Here's an example usage:
38;;
39;; (defconst mypkg-version "9.801")
40;; (defconst mypkg-maintainer-address "mypkg-help@foo.com")
41;; (defun mypkg-submit-bug-report ()
42;; "Submit via mail a bug report on mypkg"
43;; (interactive)
44;; (require 'reporter)
45;; (and (y-or-n-p "Do you really want to submit a report on mypkg? ")
46;; (reporter-submit-bug-report
47;; mypkg-maintainer-address
48;; (concat "mypkg.el " mypkg-version)
49;; (list 'mypkg-variable-1
50;; 'mypkg-variable-2
51;; ;; ...
52;; 'mypkg-variable-last))))
53
54;; Mailing List
55;; ============
56;; I've set up a mailing list to report bugs or suggest enhancements,
57;; etc. This list's intended audience is elisp package authors who are
58;; using reporter and want to stay current with releases. Here are the
165c38c5 59;; relevant addresses:
bf3b07d3
RS
60;;
61;; Administrivia: reporter-request@anthem.nlm.nih.gov
62;; Submissions: reporter@anthem.nlm.nih.gov
63
64;; LCD Archive Entry:
65;; reporter|Barry A. Warsaw|warsaw@cen.com|
66;; Customizable bug reporting of lisp programs.|
67;; 1993/05/22 00:29:49|1.18|~/misc/reporter.el.Z|
68
69;;; Code:
70
71\f
72;; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
73;; user defined variables
74
75(defvar reporter-mailer 'mail
76 "*Mail package to use to generate bug report buffer.")
77
78;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
79;; end of user defined variables
80
9ee9b53e
RS
81(defvar reporter-eval-buffer nil
82 "Buffer to retrieve variable's value from.
83This is necessary to properly support the printing of buffer-local
84variables. Current buffer will always be the mail buffer being
85composed.")
bf3b07d3
RS
86\f
87(defun reporter-dump-variable (varsym)
88 "Pretty-print the value of the variable in symbol VARSYM."
9ee9b53e
RS
89 (let ((val (save-excursion
90 (set-buffer reporter-eval-buffer)
91 (eval varsym)))
bf3b07d3
RS
92 (sym (symbol-name varsym))
93 (print-escape-newlines t))
94 (insert " " sym " "
95 (cond
96 ((memq val '(t nil)) "")
97 ((listp val) "'")
98 ((symbolp val) "'")
99 (t ""))
100 (prin1-to-string val)
101 "\n")))
102
103(defun reporter-dump-state (pkgname varlist pre-hooks post-hooks)
104 "Dump the state of the mode specific variables.
105PKGNAME contains the name of the mode as it will appear in the bug
106report (you must explicitly concat any version numbers).
107
108VARLIST is the list of variables to dump. Each element in VARLIST can
109be a variable symbol, or a cons cell. If a symbol, this will be
110passed to `reporter-dump-variable' for insertion into the mail buffer.
111If a cons cell, the car must be a variable symbol and the cdr must be
112a function which will be `funcall'd with the symbol. Use this to write
113your own custom variable value printers for specific variables.
114
9ee9b53e
RS
115Note that the global variable `reporter-eval-buffer' will be bound to
116the buffer in which `reporter-submit-bug-report' was invoked. If you
117want to print the value of a buffer local variable, you should wrap
118the `eval' call in your custom printer inside a `set-buffer' (and
119probably a `save-excursion'). `reporter-dump-variable' handles this
120properly.
121
bf3b07d3
RS
122PRE-HOOKS is run after the emacs-version and PKGNAME are inserted, but
123before the VARLIST is dumped. POST-HOOKS is run after the VARLIST is
124dumped."
125 (let ((buffer (current-buffer)))
126 (set-buffer buffer)
127 (insert "Emacs : " (emacs-version) "\nPackage: " pkgname "\n")
128 (run-hooks 'pre-hooks)
129 (insert "\ncurrent state:\n==============\n(setq\n")
130 (mapcar
131 (function
132 (lambda (varsym-or-cons-cell)
133 (let ((varsym (or (car-safe varsym-or-cons-cell)
134 varsym-or-cons-cell))
135 (printer (or (cdr-safe varsym-or-cons-cell)
136 'reporter-dump-variable)))
137 (funcall printer varsym)
138 )))
139 varlist)
140 (insert " )\n")
141 (run-hooks 'post-hooks)
142 ))
143
144(defun reporter-submit-bug-report
145 (address pkgname varlist &optional pre-hooks post-hooks salutation)
146 "Submit a bug report via mail.
147
148ADDRESS is the email address for the package's maintainer. PKGNAME is
149the name of the mode (you must explicitly concat any version numbers).
150VARLIST is the list of variables to dump (do a `\\[describe-function] reporter-dump-state'
151for details). Optional PRE-HOOKS and POST-HOOKS are passed to
152`reporter-dump-state'. Optional SALUTATION is inserted at the top of the
165c38c5 153mail buffer, and point is left after the salutation.
bf3b07d3
RS
154
155The mailer used is described in the variable `reporter-mailer'."
156
9ee9b53e 157 (let ((reporter-eval-buffer (current-buffer))
bf3b07d3
RS
158 (mailbuf (progn (call-interactively reporter-mailer)
159 (current-buffer))))
160 (require 'sendmail)
9ee9b53e 161 (pop-to-buffer reporter-eval-buffer)
bf3b07d3
RS
162 (pop-to-buffer mailbuf)
163 (goto-char (point-min))
164 ;; different mailers use different separators, some may not even
165 ;; use m-h-s, but sendmail.el stuff must have m-h-s bound.
166 (let ((mail-header-separator
167 (save-excursion
168 (re-search-forward
169 (concat
170 "^\\(" ;beginning of line
171 (mapconcat
172 'identity
173 (list "[\t ]*" ;simple SMTP form
174 "-+" ;mh-e form
175 (regexp-quote
176 mail-header-separator)) ;sendmail.el form
177 "\\|") ;or them together
178 "\\)$") ;end of line
179 nil
180 'move) ;search for and move
181 (buffer-substring (match-beginning 0) (match-end 0)))))
182 (mail-position-on-field "to")
183 (insert address)
184 (mail-position-on-field "subject")
185 (insert "Report on package " pkgname)
186 (re-search-forward mail-header-separator (point-max) 'move)
187 (forward-line 1)
188 (and salutation (insert "\n" salutation "\n\n"))
189 (set-mark (point)) ;user should see mark change
190 (insert "\n\n")
191 (reporter-dump-state pkgname varlist pre-hooks post-hooks)
192 (exchange-point-and-mark))
193 (let* ((sendkey "C-c C-c") ;can this be generalized like below?
194 (killkey-whereis (where-is-internal 'kill-buffer nil t))
195 (killkey (if killkey-whereis
196 (key-description killkey-whereis)
197 "M-x kill-buffer")))
198 (message "Please type in your report. Hit %s to send, %s to abort."
199 sendkey killkey))
200 ))
201
202;; this is useful
203(provide 'reporter)
204
205;;; reporter.el ends here