5e33dc5974e878e8d3af9a3ee62b543a98b4ce62
[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, Teradyne GmbH Munich <aichner@ecf.teradyne.com>
6 ;; Date: Sun., Apr. 20, 1997.
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   ;; <verna@inf.enst.fr> 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 (defun build-report (&rest args)
155   "Initializes a fresh mail composition buffer using `compose-mail'
156 with the contents of XEmacs Installation file and excerpts from XEmacs
157 make output and errors and leaves point at the beginning of the mail text.
158  See also
159 `compose-mail', `mail-user-agent',
160 `build-report-destination',
161 `build-report-keep-regexp',
162 `build-report-delete-regexp',
163 `build-report-make-output-file' and
164 `build-report-installation-file'."
165   (interactive
166    (let (prompt
167          hist
168          arg
169          (prompts build-report-prompts))
170      (progn
171        (while prompts
172          (defvar hist)
173          (setq prompt (caar prompts))
174          (setq hist (cdar prompts))
175          (setq prompts (cdr prompts))
176          (setq arg (cons (read-string prompt "" 'hist) arg)))
177        arg)))
178   (save-excursion
179     (compose-mail
180      build-report-destination
181      (apply 'format build-report-subject args)
182      nil
183      nil
184      nil
185      nil
186      nil)
187     (let ((report-begin (point)))
188       (insert (build-report-insert-make-output report-begin))
189       (insert (build-report-insert-installation-file
190                report-begin
191                build-report-installation-insert-all))
192       (insert (build-report-insert-header report-begin))
193       (goto-char report-begin))))
194
195 (defun build-report-insert-header (where)
196   "Inserts the build-report-header at the point specified by `where'."
197   (goto-char where)
198   (with-temp-buffer
199     (insert "\n> XEmacs Build Report as generated\n> by"
200             " build-report-version "
201             build-report-version " follows:\n\n")
202     (buffer-string)))
203
204 (defun build-report-insert-make-output (where)
205   "Inserts the output of the XEmacs Beta make run.
206 The make process output must have been saved in
207 `build-report-make-output-file' during the XEmacs Beta building."
208   (goto-char where)
209   (with-temp-buffer
210     (if (file-exists-p build-report-make-output-file)
211         (progn
212           (if (featurep 'mime-setup)
213               (progn
214                 (mime-edit-insert-tag
215                  "text"
216                  "plain" 
217                  (concat
218                   "\nContent-Disposition: attachment;"
219                   " filename=\""
220                   (file-name-nondirectory
221                    build-report-make-output-file)
222                   "\""))
223                 (mime-edit-insert-binary-file
224                  build-report-make-output-file
225                  build-report-file-encoding))
226             (insert-file-contents build-report-make-output-file))
227           (goto-char (point-min))
228           (delete-non-matching-lines (build-report-keep))
229           (goto-char (point-min))
230           (delete-matching-lines (build-report-delete))
231           (goto-char (point-min))
232           (insert "> Contents of " 
233                   build-report-make-output-file
234                   "\n> keeping lines matching\n> \""
235                   (build-report-keep)
236                   "\"\n> and then deleting lines matching\n> \""
237                   (build-report-delete)
238                   "\"\n\n"))
239       (insert "> " build-report-make-output-file
240               " does not exist!\n\n"))
241     (buffer-string)))
242       
243 (defun build-report-insert-installation-file (where all)
244   "Inserts the contents of the `build-report-installation-file'
245 created by the XEmacs Beta configure process."
246   (goto-char where)
247   (with-temp-buffer
248     (if (file-exists-p build-report-installation-file)
249         (let (file-begin last-configure)
250           (insert "> Contents of "
251                   build-report-installation-file
252                   ":\n")
253           (insert
254            (format
255             "> (Output from %s of ./configure)\n\n"
256             (if all "all runs" "most recent run")))
257           (if (featurep 'mime-setup)
258               (progn
259                 (mime-edit-insert-tag
260                  "text"
261                  "plain" 
262                  (concat
263                   "\nContent-Disposition: attachment;"
264                   " filename=\""
265                   (file-name-nondirectory
266                    build-report-installation-file)
267                   "\""))
268                 (mime-edit-insert-binary-file
269                  build-report-installation-file
270                  build-report-file-encoding)
271                 (setq file-begin (mime-edit-content-beginning)))
272             (setq file-begin (point))
273             (insert-file-contents
274              build-report-installation-file))
275           (unless all
276             (setq last-configure
277                   (search-backward-regexp
278                    "^\\(uname.*\\|osversion\\):\\s-+" file-begin t))
279             (if (and file-begin last-configure)
280                 (delete-region file-begin last-configure))))
281       (insert "> " build-report-installation-file
282               " does not exist!\n\n"))
283     (buffer-string)))
284
285 (defun build-report-keep ()
286   "build-report-internal function of no general value."
287   (mapconcat #'identity
288              (cons "^--\\[\\[\\|\\]\\]$" build-report-keep-regexp) "\\|"))
289
290 (defun build-report-delete ()
291   "build-report-internal function of no general value."
292   (mapconcat #'identity
293              build-report-delete-regexp "\\|"))
294
295 ;;; build-report.el ends here