1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-12-30 11:09:23 +00:00
emacs/lisp/emacs-lisp/gulp.el

178 lines
6.0 KiB
EmacsLisp
Raw Normal View History

;;; gulp.el --- ask for updates for Lisp packages
1996-05-07 00:55:56 +00:00
2013-01-01 09:11:05 +00:00
;; Copyright (C) 1996, 2001-2013 Free Software Foundation, Inc.
1996-05-07 00:55:56 +00:00
;; Author: Sam Shteingold <shteingd@math.ucla.edu>
;; Maintainer: FSF
;; Keywords: maint
1996-05-07 00:55:56 +00:00
;; This file is part of GNU Emacs.
;; GNU Emacs is free software: you can redistribute it and/or modify
1996-05-07 00:55:56 +00:00
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
1996-05-07 00:55:56 +00:00
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
1996-05-07 00:55:56 +00:00
;;; Commentary:
;; Search the emacs/{version}/lisp directory for *.el files, extract the
;; name of the author or maintainer and send him e-mail requesting
;; update.
;;; Code:
1998-04-05 18:26:32 +00:00
(defgroup gulp nil
"Ask for updates for Lisp packages."
:prefix "-"
:group 'maint)
(defcustom gulp-discard "^;+ *Maintainer: *FSF *$"
2009-07-22 02:45:34 +00:00
"The regexp matching the packages not requiring the request for updates."
1998-04-05 18:26:32 +00:00
:type 'regexp
:group 'gulp)
2009-07-22 02:45:34 +00:00
(defcustom gulp-tmp-buffer "*gulp*"
"The name of the temporary buffer."
1998-04-05 18:26:32 +00:00
:type 'string
:group 'gulp)
(defcustom gulp-max-len 2000
2009-07-22 02:45:34 +00:00
"Distance into a Lisp source file to scan for keywords."
1998-04-05 18:26:32 +00:00
:type 'integer
:group 'gulp)
(defcustom gulp-request-header
1996-05-11 11:08:11 +00:00
(concat
"This message was created automatically.
I'm going to start pretesting a new version of GNU Emacs soon, so I'd
like to ask if you have any updates for the Emacs packages you work on.
1996-05-11 11:08:11 +00:00
You're listed as the maintainer of the following package(s):\n\n")
2009-07-22 02:45:34 +00:00
"The starting text of a gulp message."
1998-04-05 18:26:32 +00:00
:type 'string
:group 'gulp)
1996-05-07 00:55:56 +00:00
1998-04-05 18:26:32 +00:00
(defcustom gulp-request-end
1996-05-11 11:08:11 +00:00
(concat
"\nIf you have any changes since the version in the previous release ("
(format "%d.%d" emacs-major-version emacs-minor-version)
"),
please send them to me ASAP.
1996-05-07 00:55:56 +00:00
Please don't send the whole file. Instead, please send a patch made with
`diff -c' that shows precisely the changes you would like me to install.
Also please include itemized change log entries for your changes;
please use lisp/ChangeLog as a guide for the style and for what kinds
of information to include.
1996-05-11 11:08:11 +00:00
Thanks.")
2009-07-22 02:45:34 +00:00
"The closing text in a gulp message."
1998-04-05 18:26:32 +00:00
:type 'string
:group 'gulp)
1996-05-11 11:08:11 +00:00
(declare-function mail-subject "sendmail" ())
(declare-function mail-send "sendmail" ())
1996-05-11 11:08:11 +00:00
(defun gulp-send-requests (dir &optional time)
"Send requests for updates to the authors of Lisp packages in directory DIR.
1996-05-11 11:08:11 +00:00
For each maintainer, the message consists of `gulp-request-header',
followed by the list of packages (with modification times if the optional
prefix argument TIME is non-nil), concluded with `gulp-request-end'.
You can't edit the messages, but you can confirm whether to send each one.
The list of addresses for which you decided not to send mail
is left in the `*gulp*' buffer at the end."
(interactive "DRequest updates for Lisp directory: \nP")
* textmodes/two-column.el (2C-split): * textmodes/texnfo-upd.el (texinfo-multi-file-included-list): * textmodes/tex-mode.el (tex-set-buffer-directory): * textmodes/spell.el (spell-region, spell-string): * textmodes/reftex.el (reftex-erase-buffer): (reftex-get-file-buffer-force, reftex-kill-temporary-buffers): * textmodes/reftex-toc.el (reftex-toc-promote-action): * textmodes/reftex-sel.el (reftex-get-offset, reftex-insert-docstruct) (reftex-select-item): * textmodes/reftex-ref.el (reftex-label-info-update) (reftex-offer-label-menu): * textmodes/reftex-index.el (reftex-index-change-entry) (reftex-index-phrases-info): * textmodes/reftex-global.el (reftex-create-tags-file) (reftex-save-all-document-buffers, reftex-ensure-write-access): * textmodes/reftex-dcr.el (reftex-echo-ref, reftex-echo-cite) (reftex-view-crossref-from-bibtex): * textmodes/reftex-cite.el (reftex-bibtex-selection-callback) (reftex-extract-bib-entries-from-thebibliography) (reftex-all-used-citation-keys, reftex-create-bibtex-file): * textmodes/refbib.el (r2b-capitalize-title): (r2b-convert-buffer, r2b-help): * textmodes/page-ext.el (pages-directory) (pages-directory-goto-with-mouse): * textmodes/bibtex.el (bibtex-validate-globally): * textmodes/bib-mode.el (bib-capitalize-title): * textmodes/artist.el (artist-clear-buffer, artist-system): * progmodes/xscheme.el (global-set-scheme-interaction-buffer): (local-set-scheme-interaction-buffer, xscheme-process-filter) (verify-xscheme-buffer, xscheme-enter-interaction-mode) (xscheme-enter-debugger-mode, xscheme-debugger-mode-p) (xscheme-send-control-g-interrupt, xscheme-start-process) (xscheme-process-sentinel, xscheme-cd): * progmodes/verilog-mode.el (verilog-read-always-signals) (verilog-set-define, verilog-getopt-file) (verilog-module-inside-filename-p): * progmodes/sh-script.el: * progmodes/python.el (python-pdbtrack-get-source-buffer) (python-pdbtrack-grub-for-buffer, python-execute-file): * progmodes/octave-inf.el (inferior-octave): * progmodes/idlwave.el (idlwave-scan-user-lib-files) (idlwave-shell-compile-helper-routines, idlwave-set-local) (idlwave-display-completion-list-xemacs, idlwave-list-abbrevs) (idlwave-display-completion-list-emacs, idlwave-list-load-path-shadows) (idlwave-completion-fontify-classes, idlwave-display-calling-sequence): * progmodes/idlw-shell.el (idlwave-shell-examine-display-clear) (idlwave-shell-filter, idlwave-shell-examine-highlight) (idlwave-shell-sentinel, idlwave-shell-filter-directory) (idlwave-shell-display-line, idlwave-shell-set-bp-in-module) (idlwave-shell-examine-display, idlwave-shell-run-region) (idlwave-shell-filter-bp, idlwave-shell-save-and-action) (idlwave-shell-sources-filter, idlwave-shell-goto-next-error): * progmodes/idlw-help.el (idlwave-help-get-special-help) (idlwave-help-get-help-buffer): * progmodes/gud.el (gud-basic-call, gud-find-class) (gud-tooltip-activate-mouse-motions-if-enabled): * progmodes/gdb-mi.el (gdb-mouse-toggle-breakpoint-fringe): * progmodes/ebrowse.el (ebrowse-member-table, ebrowse-save-tree-as) (ebrowse-view-exit-fn, ebrowse-tags-list-members-in-file) (ebrowse-tags-next-file): * progmodes/ebnf2ps.el (ebnf-generate-eps, ebnf-generate-eps) (ebnf-eps-production-list, ebnf-begin-file, ebnf-log) (ebnf-eps-finish-and-write): * progmodes/cpp.el (cpp-edit-save): * progmodes/cperl-mode.el (cperl-pod-to-manpage): * progmodes/cc-defs.el (c-emacs-features): * progmodes/antlr-mode.el (antlr-invalidate-context-cache) (antlr-directory-dependencies): * progmodes/ada-xref.el (ada-gnat-parse-gpr, ada-get-ali-file-name) (ada-run-application, ada-find-in-src-path, ada-goto-parent) (ada-find-any-references, ada-make-filename-from-adaname) (ada-make-body-gnatstub): * obsolete/rnews.el (news-list-news-groups): * obsolete/resume.el (resume-suspend-hook,resume-write-buffer-to-file): * obsolete/iso-acc.el (iso-acc-minibuf-setup): * net/rcirc.el (rcirc-debug): * net/newst-treeview.el (newsticker--treeview-list-add-item) (newsticker--treeview-list-clear, newsticker-treeview-browse-url) (newsticker--treeview-list-update-faces, newsticker-treeview-save) (newsticker--treeview-item-show-text, newsticker--treeview-item-show) (newsticker--treeview-tree-update-tag,newsticker--treeview-buffer-init) (newsticker-treeview-show-item, newsticker--treeview-unfold-node) (newsticker--treeview-list-clear-highlight) (newsticker--treeview-list-update-highlight) (newsticker--treeview-list-highlight-start) (newsticker--treeview-tree-update-highlight) (newsticker--treeview-get-selected-item) (newsticker-treeview-mark-list-items-old) (newsticker--treeview-set-current-node): * net/newst-plainview.el (newsticker--buffer-set-uptodate): * net/newst-backend.el (newsticker--get-news-by-funcall) (newsticker--get-news-by-wget, newsticker--image-get) (newsticker--image-sentinel): * net/mairix.el (mairix-rmail-fetch-field, mairix-gnus-fetch-field): * net/eudcb-ph.el (eudc-ph-do-request, eudc-ph-open-session): (eudc-ph-close-session): * net/eudc.el (eudc-save-options): * language/thai-word.el (thai-update-word-table): * language/japan-util.el (japanese-string-conversion): * international/titdic-cnv.el (tsang-quick-converter) (ziranma-converter, ctlau-converter): * international/mule-cmds.el (describe-language-environment): * international/ja-dic-cnv.el (skkdic-convert-okuri-ari) (skkdic-convert-postfix, skkdic-convert-prefix): (skkdic-convert-okuri-nasi, skkdic-convert): * emacs-lisp/re-builder.el (reb-update-overlays): * emacs-lisp/pp.el (pp-to-string, pp-display-expression): * emacs-lisp/gulp.el (gulp-send-requests): * emacs-lisp/find-gc.el (trace-call-tree): * emacs-lisp/eieio-opt.el (eieio-browse, eieio-describe-class) (eieio-describe-generic): * emacs-lisp/eieio-base.el (eieio-persistent-read): * emacs-lisp/edebug.el (edebug-outside-excursion): * emacs-lisp/debug.el (debugger-make-xrefs): * emacs-lisp/cust-print.el (custom-prin1-to-string): * emacs-lisp/chart.el (chart-new-buffer): * emacs-lisp/authors.el (authors-scan-el, authors-scan-change-log): Use with-current-buffer. * textmodes/artist.el (artist-system): Don't call copy-sequence on a fresh string. * progmodes/idlw-shell.el (easymenu setup): Use dolist.
2009-10-31 02:38:34 +00:00
(with-current-buffer (get-buffer-create gulp-tmp-buffer)
1996-05-11 11:08:11 +00:00
(let ((m-p-alist (gulp-create-m-p-alist
(directory-files dir nil "^[^=].*\\.el$" t)
dir))
;; Temporarily inhibit undo in the *gulp* buffer.
(buffer-undo-list t)
mail-setup-hook msg node)
(setq m-p-alist
(sort m-p-alist
(function (lambda (a b)
(string< (car a) (car b))))))
1996-05-11 11:08:11 +00:00
(while (setq node (car m-p-alist))
(setq msg (gulp-create-message (cdr node) time))
(setq mail-setup-hook
2003-02-04 13:24:35 +00:00
(lambda ()
(mail-subject)
(insert "It's time for Emacs updates again")
(goto-char (point-max))
(insert msg)))
1996-05-11 11:08:11 +00:00
(mail nil (car node))
(goto-char (point-min))
1996-05-11 11:08:11 +00:00
(if (y-or-n-p "Send? ") (mail-send)
(kill-this-buffer)
(set-buffer gulp-tmp-buffer)
(insert (format "%s\n\n" node)))
(setq m-p-alist (cdr m-p-alist))))
(set-buffer gulp-tmp-buffer)
(setq buffer-undo-list nil)))
(defun gulp-create-message (rec time)
1996-05-07 00:55:56 +00:00
"Return the message string for REC, which is a list like (FILE TIME)."
(let (node (str gulp-request-header))
(while (setq node (car rec))
1996-05-11 11:08:11 +00:00
(setq str (concat str "\t" (car node)
(if time (concat "\tLast modified:\t" (cdr node)))
"\n"))
1996-05-07 00:55:56 +00:00
(setq rec (cdr rec)))
(concat str gulp-request-end)))
1996-05-11 11:08:11 +00:00
(defun gulp-create-m-p-alist (flist dir)
"Create the maintainer/package alist for files in FLIST in DIR.
That is a list of elements, each of the form (MAINTAINER PACKAGES...)."
(save-excursion
(let (mplist filen node mnt-tm mnt tm fl-tm)
1996-05-11 11:08:11 +00:00
(get-buffer-create gulp-tmp-buffer)
(set-buffer gulp-tmp-buffer)
(setq buffer-undo-list t)
(while flist
(setq fl-tm (gulp-maintainer (setq filen (car flist)) dir))
(if (setq tm (cdr fl-tm) mnt (car fl-tm));; there is a definite maintainer
(if (setq node (assoc mnt mplist));; this is not a new maintainer
(setq mplist (cons (cons mnt (cons (cons filen tm) (cdr node)))
(delete node mplist)))
(setq mplist (cons (list mnt (cons filen (cdr fl-tm))) mplist))))
(setq flist (cdr flist)))
(erase-buffer)
mplist)))
(defun gulp-maintainer (filenm dir)
"Return a list (MAINTAINER TIMESTAMP) for the package FILENM in directory DIR."
1996-05-07 00:55:56 +00:00
(save-excursion
(let* ((fl (expand-file-name filenm dir)) mnt
1996-05-07 00:55:56 +00:00
(timest (format-time-string "%Y-%m-%d %a %T %Z"
(elt (file-attributes fl) 5))))
(set-buffer gulp-tmp-buffer)
(erase-buffer)
(insert-file-contents fl nil 0 gulp-max-len)
(goto-char 1)
(if (re-search-forward gulp-discard nil t)
(setq mnt nil) ;; do nothing, return nil
(goto-char 1)
(if (and (re-search-forward "^;+ *Maintainer: \\(.*\\)$" nil t)
(> (length (setq mnt (match-string 1))) 0))
() ;; found!
(goto-char 1)
(if (re-search-forward "^;+ *Author: \\(.*\\)$" nil t)
(setq mnt (match-string 1))))
(if (= (length mnt) 0) (setq mnt nil))) ;; "^;; Author: $" --> nil
(cons mnt timest))))
2002-11-15 05:25:19 +00:00
(provide 'gulp)
1996-05-07 00:55:56 +00:00
;;; gulp.el ends here