X-Git-Url: http://git.chise.org/gitweb/?p=chise%2Fxemacs-chise.git.1;a=blobdiff_plain;f=lisp%2Fbuild-report.el;h=b3797f380bdc05c2f54610da267d4f0a41a33d19;hp=26b63bdb3e1b3c0f4333507724c9f1b311824a1b;hb=59eec5f21669e81977b5b1fe9bf717cab49cf7fb;hpb=032d062ebcb2344e6245cea4214bc09835da97ee diff --git a/lisp/build-report.el b/lisp/build-report.el index 26b63bd..b3797f3 100644 --- a/lisp/build-report.el +++ b/lisp/build-report.el @@ -3,8 +3,8 @@ ;; Copyright (C) 1997 Adrian Aichner ;; Author: Adrian Aichner -;; Date: Sun., Apr. 20, 1997, 1998, 1999. -;; Version: 1.35 +;; Date: Sun., Apr. 20, 1997-2000. +;; Version: $Revision: 1.5.2.6 $ ;; Keywords: internal ;; This file is part of XEmacs. @@ -48,90 +48,168 @@ ;;; Code: (require 'config) +(require 'custom) +(require 'cl) (provide 'build-report) -;; Due to recommendation by developers on xemacs-beta@xemacs.org, -;; release versions are to be checked out using `co -u -kv ...'. -(defconst build-report-version - "1.35" - "Version number of build-report.") +;;; Constant definitions used internally by `build-report'. These are not +;;; anticipated to be changed by users of `build-report'. +;;; If users do need to change the value of any of these, they need to do +;;; it after `build-report' has been loaded (not just required). Please +;;; report it to the maintainers of `build-report' when you think you +;;; need to do this. +(defconst build-report-installation-version-regexp + "XEmacs\\s-+\\([0-9]+\\)\\.\\([0-9]+\\)\\(\\(-b\\|\\.\\)\\([0-9]+\\)\\)?\\s-+\\\\?\"\\([^\\\"]+\\)\\\\?\"\\s-+configured\\s-+for\\s-+`\\(.+\\)'\\." + "*REGEXP matching XEmacs Beta Version string in +`build-report-installation-file' file. This variable is used by +`build-report-installation-data'.") + +(defconst build-report-version-file-regexp + "emacs_major_version\\s-*=\\s-*\\([0-9]+\\) +emacs_minor_version\\s-*=\\s-*\\([0-9]+\\) +emacs_beta_version\\s-*=\\s-*\\([0-9]+\\)? +xemacs_codename\\s-*=\\s-*\"\\([^\"]+\\)\"" + "*REGEXP matching XEmacs Beta Version variable assignments in +`build-report-version-file' file. This variable is used by +`build-report-version-file-data'.") + +(defconst build-report-installation-srcdir-regexp + "\\s-*Where should the build process find the source code\\?\\s-*\\(.*\\)$" + "REGEXP matching XEmacs Beta srcdir as the first substring match in +`build-report-installation-file' file. This variable is used by +`build-report-installation-data'.") + +;;; Customization support for build-report starts here. (defgroup build-report nil - "Package automating the process of sending XEmacs Build Reports." + "Standardizes the Creation of XEmacs Build Reports." + :load 'build-report :group 'build) (defcustom build-report-destination - "xemacs-build-reports@xemacs.org" - "The mail address XEmacs Build Reports should go to." - :type 'string + (quote ("XEmacs Build Reports List " + "XEmacs Beta List ")) + "*The list of mail addresses XEmacs Build Reports should most likely +go to." + :type '(repeat + :custom-show t + :documentation-shown t + string) :group 'build-report) (defcustom build-report-keep-regexp - (list - "make\\[" - "error" - "warn" - "pure.*\\(space\\|size\\)" - "hides\\b" - "strange" - "shadowings" - "^Compilation" - "not\\s-+found") - "Regexp of make process output lines to keep in the report." - :type '(repeat regexp) + (quote ("^\\(cd\\|n?make\\)\\s-" "errors?" "warnings?" + "pure.*\\(space\\|size\\)" "hides\\b" "strange" "shadowings" + "^Compil\\(ing\\s-+in\\|ation\\)" "^Using" "not\\s-+found" + "^While\\s-+compiling.*\\(\n\\s-+.+\\)*" "^Note:" + "Installing" "[Ff]ile(s) copied" + "\\s-+tests\\s-+")) + "*Regexp of make process output lines to keep in the report." + :type '(repeat + :custom-show t + :documentation-shown t + regexp) :group 'build-report) (defcustom build-report-delete-regexp - (list - "confl.*with.*auto-inlining" - (concat (regexp-quote (gethash 'blddir (config-value-hash-table))) "/lisp/[^ \t\n]+ hides ")) - "Regexp of make process output lines to delete from the report." - :type '(repeat regexp) + (quote ("confl.*with.*auto-inlining" "^Formatting:")) + "*Regexp of make process output lines to delete from the report." + :type '(repeat + :custom-show t + :documentation-shown t + regexp) :group 'build-report) -(defcustom build-report-make-output-file - (concat (gethash 'blddir (config-value-hash-table)) "/beta.err") - "Filename where stdout and stderr of XEmacs make process have been stored. -mk.err will not be created automatically. You'll have to run make with -output redirection. I use an alias +(defcustom build-report-make-output-dir + (cond + ((equal system-type 'windows-nt) + (expand-file-name "nt" + (gethash 'blddir (config-value-hash-table)))) + (t + (gethash 'blddir (config-value-hash-table)))) + "*Directory where the build report file is found. + If this is empty or nil, the default, it is replaced by the value of + the XEmacs build directory." + :type '(directory + :custom-show t + :documentation-shown t) + :group 'build-report) + +(defcustom build-report-make-output-files + (quote ("beta.err")) + "*List of Filenames where stdout and stderr of XEmacs make process +have been stored. These are relative to +`build-report-make-output-dir`. You'll have to run make with output +redirection or use the `build' XEmacs package to save this output. You +may use following alias + alias mk 'make \!* >>&\! \!$.err &' -for that, so that I get beta.err went I run `mk beta'." - :type 'file + +under csh, so that you get beta.err went you run `mk beta'." + :type '(repeat + :custom-show t + :documentation-shown t + file) :group 'build-report) (defcustom build-report-installation-file - (concat (gethash 'blddir (config-value-hash-table)) "/Installation") - "Installation file produced by XEmacs configure process." - :type 'file + (expand-file-name "Installation" + (gethash 'blddir (config-value-hash-table))) + "*Installation file produced by XEmacs configure process." + :type '(file + :custom-show t + :documentation-shown t) :group 'build-report) -(defcustom build-report-installation-insert-all nil - "Tell build-report to insert the whole Installation file -instead of just the last report." +(defcustom build-report-version-file + (expand-file-name + "version.sh" + (gethash 'blddir (config-value-hash-table))) + "*version.sh file identifying XEmacs (Beta) Distribution." + :type '(file + :custom-show t + :documentation-shown t) + :group 'build-report) + +(defcustom build-report-installation-insert-all + nil + "*Tell build-report to insert the whole Installation file + instead of just the last report." :type 'boolean :group 'build-report) (defcustom build-report-subject (concat "[%s] " emacs-version " on " system-configuration) - "XEmacs Build Report Subject Line. %s-sequences will be substituted -with user input through `build-report' according to -`build-report-prompts' using `format'." - :type 'string + "*XEmacs Build Report Subject Line. %s-sequences will be substituted + with user input through `build-report' according to + `build-report-prompts' using `format'." + :type '(string + :custom-show t + :documentation-shown t) :group 'build-report) (defcustom build-report-prompts - '(("Status?: " "Success" "Failure")) - "XEmacs Build Report Prompt(s). This is a list of prompt-string -lists used by `build-report' in conjunction with -`build-report-subject'. Each list consists of a prompt string -followed by any number of strings which can be chosen via the history -mechanism." + (quote (("Status?: " ("Success" "Failure")))) + "*XEmacs Build Report Prompt(s). This is a list of prompt-string + lists used by `build-report' in conjunction with + `build-report-subject'. Each list consists of a prompt string + followed by any number of strings which can be chosen via the history + mechanism." + :type '(repeat + :custom-show t + :documentation-shown t + (list + :tag "Prompt" + string + (repeat + :tag "Values" + string))) :group 'build-report) (defcustom build-report-file-encoding "7bit" - "XEmacs Build Report File Encoding to be used when MIME support is -available." + "*XEmacs Build Report File Encoding to be used when MIME support is + available." :group 'build-report) ;; Symbol Name mappings from TM to SEMI serving as Compatibility @@ -151,45 +229,113 @@ available." (defalias 'mime-edit-insert-binary-file 'mime-editor/insert-binary-file))) +(defun build-report-make-output-get () + "Returns the filename the XEmacs make output is saved in." + (interactive) + (if (or (string-equal build-report-make-output-dir "") + (null build-report-make-output-dir)) + (mapcar + (function + (lambda (f) + (expand-file-name + f + (file-name-as-directory + (gethash 'blddir (config-value-hash-table)))))) + build-report-make-output-files) + (mapcar + (function + (lambda (f) + (expand-file-name + f + (file-name-as-directory build-report-make-output-dir)))) + build-report-make-output-files))) + ;;;###autoload (defun build-report (&rest args) - "Initializes a fresh mail composition buffer using `compose-mail' -with the contents of XEmacs Installation file and excerpts from XEmacs -make output and errors and leaves point at the beginning of the mail text. - See also -`compose-mail', `mail-user-agent', -`build-report-destination', -`build-report-keep-regexp', -`build-report-delete-regexp', -`build-report-make-output-file' and -`build-report-installation-file'." + "Composes a fresh mail message with the contents of the built XEmacs +Installation file and excerpts from XEmacs make output. +`compose-mail' is used to create the mail message. Point is left at +the beginning of the mail text. You may add some personal notes if +you like and send the report. +See also + `compose-mail', `mail-user-agent', + `build-report-destination', + `build-report-keep-regexp', + `build-report-delete-regexp', + `build-report-make-output-dir', + `build-report-make-output-files', and + `build-report-installation-file'." + ;; `interactive' form returns value for formal parameter `args'. (interactive (let (prompt - hist - arg - (prompts build-report-prompts)) + hist + arg + (prompts build-report-prompts)) (progn (while prompts - (defvar hist) - (setq prompt (caar prompts)) - (setq hist (cdar prompts)) - (setq prompts (cdr prompts)) - (setq arg (cons (read-string prompt "" 'hist) arg))) + (defvar hist) + (setq prompt (caar prompts)) + (setq hist (cdar prompts)) + ;; `build-report-prompts' used to be a list of lists, the + ;; first element of each list being the prompt, the rest being + ;; the history. The history is now in a separate list. We + ;; better check for that. + (if (listp (car hist)) + (setq hist (car hist))) + (setq prompts (cdr prompts)) + (setq arg (cons (read-string prompt "" 'hist) arg))) arg))) (save-excursion + (if (file-exists-p build-report-installation-file) + (multiple-value-bind + (major minor beta codename configuration) + (build-report-installation-data build-report-installation-file) + (setq build-report-subject + (format "[%%s] XEmacs %s.%s%s \"%s\", %s" + major minor beta codename configuration))) + (multiple-value-bind + (major minor beta codename) + (build-report-version-file-data build-report-version-file) + (setq build-report-subject + (format "[%%s] XEmacs %s.%s%s \"%s\", %s" + major minor beta codename system-configuration)))) (compose-mail - build-report-destination + ;; `build-report-destination' used to be a single string, so + ;; let's test if we really get a list of destinations. + (if (listp build-report-destination) + (read-string + "Build Report Destination: " + (car build-report-destination) + 'build-report-destination) + (read-string + "Build Report Destination: " + build-report-destination) + ) (apply 'format build-report-subject args) nil nil nil nil nil) - (let ((report-begin (point))) - (insert (build-report-insert-make-output report-begin)) - (insert (build-report-insert-installation-file - report-begin - build-report-installation-insert-all)) + (let* ((report-begin (point)) + (files (reverse (build-report-make-output-get))) + (file (car files))) + (while file + (if (file-exists-p file) + (insert (build-report-insert-make-output report-begin file)) + (insert (format "%s not found!\n" file))) + (insert "\n") + (setq files (cdr files)) + (setq file (car files))) + (if (file-exists-p build-report-installation-file) + (insert (build-report-insert-installation-file + report-begin + build-report-installation-insert-all)) + (insert (format "%s not found!\n" build-report-installation-file))) +;;; (when (and (>= major 21) (>= minor 2) (or (null beta) (>= beta 32))) +;;; (insert "\n") +;;; (insert (build-report-insert-config-inc report-begin))) + (insert "\n") (insert (build-report-insert-header report-begin)) (goto-char report-begin)))) @@ -197,48 +343,69 @@ make output and errors and leaves point at the beginning of the mail text. "Inserts the build-report-header at the point specified by `where'." (goto-char where) (with-temp-buffer - (insert "\n> XEmacs Build Report as generated\n> by" - " build-report-version " - build-report-version " follows:\n\n") + (insert + (format " +> XEmacs Build Report generated by emacs-version +> %s +> with system-configuration +> %s +> follows:\n\n" emacs-version system-configuration)) (buffer-string))) -(defun build-report-insert-make-output (where) - "Inserts the output of the XEmacs Beta make run. +(defun build-report-insert-make-output (where file) + "Inserts the output of the XEmacs Beta make run in the +current buffer at position WHERE. The make process output must have been saved in -`build-report-make-output-file' during the XEmacs Beta building." +`build-report-make-output-files' during the XEmacs Beta building." (goto-char where) (with-temp-buffer - (if (file-exists-p build-report-make-output-file) - (progn - (if (featurep 'mime-setup) - (progn - (mime-edit-insert-tag - "text" - "plain" - (concat - "\nContent-Disposition: attachment;" - " filename=\"" - (file-name-nondirectory - build-report-make-output-file) - "\"")) - (mime-edit-insert-binary-file - build-report-make-output-file - build-report-file-encoding)) - (insert-file-contents build-report-make-output-file)) - (goto-char (point-min)) - (delete-non-matching-lines (build-report-keep)) - (goto-char (point-min)) - (delete-matching-lines (build-report-delete)) - (goto-char (point-min)) - (insert "> Contents of " - build-report-make-output-file - "\n> keeping lines matching\n> \"" - (build-report-keep) - "\"\n> and then deleting lines matching\n> \"" - (build-report-delete) - "\"\n\n")) - (insert "> " build-report-make-output-file - " does not exist!\n\n")) + (if (file-exists-p file) + (progn + (if (featurep 'mime-setup) + (progn + (mime-edit-insert-tag + "text" + "plain" + (concat + "\nContent-Disposition: attachment;" + " filename=\"" + (file-name-nondirectory + file) + "\"")) + (mime-edit-insert-binary-file + file + build-report-file-encoding)) + (insert-file-contents file)) + (when build-report-keep-regexp + (goto-char (point-min)) + (delete-non-matching-lines (build-report-keep))) + (when build-report-delete-regexp + (goto-char (point-min)) + (delete-matching-lines (build-report-delete))) + (goto-char (point-min)) + (if build-report-keep-regexp + (insert + (format + "> keeping lines matching +> \"%s\" +" + (build-report-keep)))) + (if build-report-delete-regexp + (insert + (format + "> %sdeleting lines matching +> \"%s\" +" + (if build-report-keep-regexp + "and then " + "") + (build-report-delete)))) + (insert "\n") + (goto-char (point-min)) + (insert + (format "> Contents of %s\n" file))) + (insert "> " file + " does not exist!\n\n")) (buffer-string))) (defun build-report-insert-installation-file (where all) @@ -247,50 +414,116 @@ created by the XEmacs Beta configure process." (goto-char where) (with-temp-buffer (if (file-exists-p build-report-installation-file) - (let (file-begin last-configure) - (insert "> Contents of " - build-report-installation-file - ":\n") - (insert - (format - "> (Output from %s of ./configure)\n\n" - (if all "all runs" "most recent run"))) - (if (featurep 'mime-setup) - (progn - (mime-edit-insert-tag - "text" - "plain" - (concat - "\nContent-Disposition: attachment;" - " filename=\"" - (file-name-nondirectory - build-report-installation-file) - "\"")) - (mime-edit-insert-binary-file - build-report-installation-file - build-report-file-encoding) - (setq file-begin (mime-edit-content-beginning))) - (setq file-begin (point)) - (insert-file-contents - build-report-installation-file)) - (unless all - (setq last-configure - (search-backward-regexp - "^\\(uname.*\\|osversion\\):\\s-+" file-begin t)) - (if (and file-begin last-configure) - (delete-region file-begin last-configure)))) + (let (file-begin last-configure) + (insert "> Contents of " + build-report-installation-file + ":\n") + (insert + (format + "> (Output from %s of ./configure)\n\n" + (if all "all runs" "most recent run"))) + (if (featurep 'mime-setup) + (progn + (mime-edit-insert-tag + "text" + "plain" + (concat + "\nContent-Disposition: attachment;" + " filename=\"" + (file-name-nondirectory + build-report-installation-file) + "\"")) + (mime-edit-insert-binary-file + build-report-installation-file + build-report-file-encoding) + (setq file-begin (mime-edit-content-beginning))) + (setq file-begin (point)) + (insert-file-contents + build-report-installation-file)) + (unless all + (setq last-configure + (search-backward-regexp + "^\\(uname.*\\|osversion\\|OS\\):\\s-+" file-begin t)) + (if (and file-begin last-configure) + (delete-region file-begin last-configure)))) (insert "> " build-report-installation-file - " does not exist!\n\n")) + " does not exist!\n\n")) (buffer-string))) (defun build-report-keep () - "build-report-internal function of no general value." + "Concatenate elements of `build-report-keep-regexp' and a general +MIME tag REGEXP. The result is a REGEXP string matching either of the +REGEXPs in `build-report-keep-regexp' or a general MIME tag REGEXP." (mapconcat #'identity - (cons "^--\\[\\[\\|\\]\\]$" build-report-keep-regexp) "\\|")) + (cons "^--\\[\\[\\|\\]\\]$" build-report-keep-regexp) "\\|")) (defun build-report-delete () - "build-report-internal function of no general value." - (mapconcat #'identity - build-report-delete-regexp "\\|")) + "Concatenate elements of `build-report-delete-regexp' and a general +MIME tag REGEXP. The result is a REGEXP string matching either of the +REGEXPs in `build-report-delete-regexp' or a general MIME tag REGEXP." + (mapconcat '(lambda (item) item) + build-report-delete-regexp "\\|")) + +(defun build-report-installation-data (&optional file) + "Return a list of XEmacs installation data containing MAJOR_NUMBER +MINOR_NUMBER BETA_STRING CODENAME CONFIGURATION SRCDIR from FILE, +which defaults to `build-report-installation-file'." + (interactive "fInstallation file: ") + (unless file + (setq file build-report-installation-file)) + (let + (major minor beta codename configuration srcdir) + (save-window-excursion + (find-file-read-only file) + (goto-char (point-min)) + (while (< (point) (point-max)) + (cond + ((looking-at build-report-installation-version-regexp) + (goto-char (match-end 0)) + (setq major (match-string 1)) + (setq minor (match-string 2)) + (setq beta (match-string 3)) + (setq codename (match-string 6)) + (setq configuration (match-string 7))) + ((looking-at build-report-installation-srcdir-regexp) + (goto-char (match-end 0)) + (setq srcdir (match-string 1))) + ;; We avoid matching a potentially zero-length string to avoid + ;; infinite looping. + ((looking-at + "^.+$") + (goto-char (match-end 0))) + ((looking-at "\n") + (goto-char (match-end 0))))) + (values major minor (or beta "") codename configuration srcdir)))) + +(defun build-report-version-file-data (&optional file) + "Return a list of XEmacs version information containing +MAJOR_NUMBER MINOR_NUMBER BETA_STRING CODENAME from FILE, which +defaults to `build-report-version-file'." + (interactive "fversion.sh file: ") + (unless file + (setq file build-report-version-file)) + (let + (major minor beta codename) + (save-window-excursion + (find-file-read-only file) + (goto-char (point-min)) + (while (< (point) (point-max)) + (cond + ((looking-at build-report-version-file-regexp) + (goto-char (match-end 0)) + (setq major (match-string 1)) + (setq minor (match-string 2)) + (setq beta (match-string 3)) + (setq codename (match-string 4))) + ;; We avoid matching a potentially zero-length string to avoid + ;; infinite looping. + ((looking-at + "^.+$") + (goto-char (match-end 0))) + ((looking-at "\n") + (goto-char (match-end 0))))) + (values major minor (or beta "") codename)))) ;;; build-report.el ends here