Initial revision
[chise/xemacs-chise.git.1] / lisp / build-report.el
1 ;;; build-report.el --- Automatically formatted build reports for XEmacs
2
3 ;; Copyright (C) 1997 Adrian Aichner
4
5 ;; Author: Adrian Aichner <adrian@xemacs.org>
6 ;; Date: Sun., Apr. 20, 1997, 1998, 1999.
7 ;; Version: 1.35
8 ;; Keywords: internal
9
10 ;; This file is part of XEmacs.
11
12 ;; XEmacs is free software; you can redistribute it and/or modify
13 ;; it under the terms of the GNU General Public License as published by
14 ;; the Free Software Foundation; either version 2, or (at your option)
15 ;; any later version.
16
17 ;; XEmacs is distributed in the hope that it will be useful, but
18 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20 ;; General Public License for more details.
21
22 ;; You should have received a copy of the GNU General Public License
23 ;; along with XEmacs; see the file COPYING.  If not, write to the Free
24 ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
25 ;; 02111-1307, USA.
26
27 ;;; Synched up with: Not synched.
28
29 ;;; Commentary:
30
31 ;; The Idea:
32 ;; Let XEmacs report interesting aspects of how it was built.
33
34 ;; The Concept:
35 ;; User creates an XEmacs Build Report by just calling
36 ;; M-x build-report
37 ;; which will initialize a mail buffer with relevant information
38 ;; derived from the XEmacs build process. Point is left at the
39 ;; beginning of the report for user to input some personal notes and
40 ;; send the report.
41
42 ;; The Status:
43 ;; This is the first `Proof of Concept'.
44
45 ;; The Author:
46 ;; Adrian Aichner, Teradyne GmbH Munich, Sun., Apr. 20, 1997.
47
48 ;;; Code:
49
50 (require 'config)
51 (provide 'build-report)
52
53 ;; Due to recommendation by developers on xemacs-beta@xemacs.org,
54 ;; release versions are to be checked out using `co -u -kv ...'.
55 (defconst build-report-version
56   "1.35"
57   "Version number of build-report.")
58
59 (defgroup build-report nil
60   "Package automating the process of sending XEmacs Build Reports."
61   :group 'build)
62
63 (defcustom build-report-destination
64   "xemacs-build-reports@xemacs.org"
65   "The mail address XEmacs Build Reports should go to."
66   :type 'string
67   :group 'build-report)
68
69 (defcustom build-report-keep-regexp
70   (list
71    "make\\["
72    "error"
73    "warn"
74    "pure.*\\(space\\|size\\)"
75    "hides\\b"
76    "strange"
77    "shadowings"
78    "^Compilation"
79    "not\\s-+found")
80   "Regexp of make process output lines to keep in the report."
81   :type '(repeat regexp)
82   :group 'build-report)
83
84 (defcustom build-report-delete-regexp
85   (list
86    "confl.*with.*auto-inlining"
87    (concat (regexp-quote (gethash 'blddir (config-value-hash-table))) "/lisp/[^ \t\n]+ hides "))
88   "Regexp of make process output lines to delete from the report."
89   :type '(repeat regexp)
90   :group 'build-report)
91
92 (defcustom build-report-make-output-file
93   (concat (gethash 'blddir (config-value-hash-table)) "/beta.err")
94   "Filename where stdout and stderr of XEmacs make process have been stored.
95 mk.err will not be created automatically. You'll have to run make with
96 output redirection. I use an alias
97 alias mk 'make \!* >>&\! \!$.err &'
98 for that, so that I get beta.err went I run `mk beta'."
99   :type 'file
100   :group 'build-report)
101
102 (defcustom build-report-installation-file
103   (concat (gethash 'blddir (config-value-hash-table)) "/Installation")
104   "Installation file produced by XEmacs configure process."
105   :type 'file
106   :group 'build-report)
107
108 (defcustom build-report-installation-insert-all nil
109   "Tell build-report to insert the whole Installation file
110 instead of just the last report."
111   :type 'boolean
112   :group 'build-report)
113
114 (defcustom build-report-subject
115   (concat "[%s] " emacs-version " on " system-configuration)
116   "XEmacs Build Report Subject Line. %s-sequences will be substituted
117 with user input through `build-report' according to
118 `build-report-prompts' using `format'."
119   :type 'string
120   :group 'build-report)
121
122 (defcustom build-report-prompts
123   '(("Status?: "  "Success" "Failure"))
124   "XEmacs Build Report Prompt(s). This is a list of prompt-string
125 lists used by `build-report' in conjunction with
126 `build-report-subject'. Each list consists of a prompt string
127 followed by any number of strings which can be chosen via the history
128 mechanism."
129   :group 'build-report)
130
131 (defcustom build-report-file-encoding
132   "7bit"
133   "XEmacs Build Report File Encoding to be used when MIME support is
134 available."
135   :group 'build-report)
136
137 ;; Symbol Name mappings from TM to SEMI serving as Compatibility
138 ;; Bandaid
139 (when (featurep 'mime-setup)
140   ;; No (defvaralias ...) so far. Thanks to "Didier Verna"
141   ;; <didier@xemacs.org> for reporting my incorrect defvaraliasing of
142   ;; `mime-editor/insert-tag'.
143   ;; Thanks to Jens-Ulrik Holger Petersen
144   ;; <petersen@kurims.kyoto-u.ac.jp> for suggesting the conditional
145   ;; aliasing of SEMI functions.
146   (unless (fboundp 'mime-edit-content-beginning)
147     (defalias 'mime-edit-content-beginning 'mime-editor/content-beginning))
148   (unless (fboundp 'mime-edit-insert-tag)
149     (defalias 'mime-edit-insert-tag 'mime-editor/insert-tag))
150   (unless (fboundp 'mime-edit-insert-binary-file)
151     (defalias 'mime-edit-insert-binary-file
152       'mime-editor/insert-binary-file)))
153
154 ;;;###autoload
155 (defun build-report (&rest args)
156   "Initializes a fresh mail composition buffer using `compose-mail'
157 with the contents of XEmacs Installation file and excerpts from XEmacs
158 make output and errors and leaves point at the beginning of the mail text.
159  See also
160 `compose-mail', `mail-user-agent',
161 `build-report-destination',
162 `build-report-keep-regexp',
163 `build-report-delete-regexp',
164 `build-report-make-output-file' and
165 `build-report-installation-file'."
166   (interactive
167    (let (prompt
168          hist
169          arg
170          (prompts build-report-prompts))
171      (progn
172        (while prompts
173          (defvar hist)
174          (setq prompt (caar prompts))
175          (setq hist (cdar prompts))
176          (setq prompts (cdr prompts))
177          (setq arg (cons (read-string prompt "" 'hist) arg)))
178        arg)))
179   (save-excursion
180     (compose-mail
181      build-report-destination
182      (apply 'format build-report-subject args)
183      nil
184      nil
185      nil
186      nil
187      nil)
188     (let ((report-begin (point)))
189       (insert (build-report-insert-make-output report-begin))
190       (insert (build-report-insert-installation-file
191                report-begin
192                build-report-installation-insert-all))
193       (insert (build-report-insert-header report-begin))
194       (goto-char report-begin))))
195
196 (defun build-report-insert-header (where)
197   "Inserts the build-report-header at the point specified by `where'."
198   (goto-char where)
199   (with-temp-buffer
200     (insert "\n> XEmacs Build Report as generated\n> by"
201             " build-report-version "
202             build-report-version " follows:\n\n")
203     (buffer-string)))
204
205 (defun build-report-insert-make-output (where)
206   "Inserts the output of the XEmacs Beta make run.
207 The make process output must have been saved in
208 `build-report-make-output-file' during the XEmacs Beta building."
209   (goto-char where)
210   (with-temp-buffer
211     (if (file-exists-p build-report-make-output-file)
212         (progn
213           (if (featurep 'mime-setup)
214               (progn
215                 (mime-edit-insert-tag
216                  "text"
217                  "plain"
218                  (concat
219                   "\nContent-Disposition: attachment;"
220                   " filename=\""
221                   (file-name-nondirectory
222                    build-report-make-output-file)
223                   "\""))
224                 (mime-edit-insert-binary-file
225                  build-report-make-output-file
226                  build-report-file-encoding))
227             (insert-file-contents build-report-make-output-file))
228           (goto-char (point-min))
229           (delete-non-matching-lines (build-report-keep))
230           (goto-char (point-min))
231           (delete-matching-lines (build-report-delete))
232           (goto-char (point-min))
233           (insert "> Contents of "
234                   build-report-make-output-file
235                   "\n> keeping lines matching\n> \""
236                   (build-report-keep)
237                   "\"\n> and then deleting lines matching\n> \""
238                   (build-report-delete)
239                   "\"\n\n"))
240       (insert "> " build-report-make-output-file
241               " does not exist!\n\n"))
242     (buffer-string)))
243
244 (defun build-report-insert-installation-file (where all)
245   "Inserts the contents of the `build-report-installation-file'
246 created by the XEmacs Beta configure process."
247   (goto-char where)
248   (with-temp-buffer
249     (if (file-exists-p build-report-installation-file)
250         (let (file-begin last-configure)
251           (insert "> Contents of "
252                   build-report-installation-file
253                   ":\n")
254           (insert
255            (format
256             "> (Output from %s of ./configure)\n\n"
257             (if all "all runs" "most recent run")))
258           (if (featurep 'mime-setup)
259               (progn
260                 (mime-edit-insert-tag
261                  "text"
262                  "plain"
263                  (concat
264                   "\nContent-Disposition: attachment;"
265                   " filename=\""
266                   (file-name-nondirectory
267                    build-report-installation-file)
268                   "\""))
269                 (mime-edit-insert-binary-file
270                  build-report-installation-file
271                  build-report-file-encoding)
272                 (setq file-begin (mime-edit-content-beginning)))
273             (setq file-begin (point))
274             (insert-file-contents
275              build-report-installation-file))
276           (unless all
277             (setq last-configure
278                   (search-backward-regexp
279                    "^\\(uname.*\\|osversion\\):\\s-+" file-begin t))
280             (if (and file-begin last-configure)
281                 (delete-region file-begin last-configure))))
282       (insert "> " build-report-installation-file
283               " does not exist!\n\n"))
284     (buffer-string)))
285
286 (defun build-report-keep ()
287   "build-report-internal function of no general value."
288   (mapconcat #'identity
289              (cons "^--\\[\\[\\|\\]\\]$" build-report-keep-regexp) "\\|"))
290
291 (defun build-report-delete ()
292   "build-report-internal function of no general value."
293   (mapconcat #'identity
294              build-report-delete-regexp "\\|"))
295
296 ;;; build-report.el ends here