annotate lisp/gnats/gnats.el @ 208:f427b8ec4379

Added tag r20-4b2 for changeset e45d5e7c476e
author cvs
date Mon, 13 Aug 2007 10:03:54 +0200
parents 9ad43877534d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
110
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1 ;;;; -*-emacs-lisp-*-
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2 ;;;; EMACS interface for GNATS.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
3 ;;;; Copyright (C) 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
4 ;;;; Contributed by Brendan Kehoe (brendan@cygnus.com)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
5 ;;;; based on an original version by Heinz G. Seidl (hgs@ide.com).
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
6 ;;;;
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
7 ;;;; This file is part of GNU GNATS.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
8 ;;;;
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
9 ;;;; GNU GNATS is free software; you can redistribute it and/or modify
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
10 ;;;; it under the terms of the GNU General Public License as published by
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
11 ;;;; the Free Software Foundation; either version 2, or (at your option)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
12 ;;;; any later version.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
13 ;;;;
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
14 ;;;; GNU GNATS is distributed in the hope that it will be useful,
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
15 ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
16 ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
17 ;;;; GNU General Public License for more details.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
18 ;;;;
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
19 ;;;; You should have received a copy of the GNU General Public License
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
20 ;;;; along with GNU GNATS; see the file COPYING. If not, write to
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
21 ;;;; the Free Software Foundation, 59 Temple Place - Suite 330,
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
22 ;;;; Boston, MA 02111, USA. */
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
23
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
24 ;;;; This file provides `edit-pr', `view-pr' `query-pr', for changing and
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
25 ;;;; searching problem reports that are part of the GNATS database. See the
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
26 ;;;; gnats(1) man page or the GNATS documentation for further information.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
27
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
28 (provide 'gnats)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
29 (require 'send-pr) ;Shared stuff defined there
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
30
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
31 ;;;;---------------------------------------------------------------------------
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
32 ;;;; Customization: put the following forms into your default.el file
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
33 ;;;; (or into your .emacs) and the whole file into your EMACS library.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
34 ;;;;---------------------------------------------------------------------------
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
35
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
36 ;(autoload 'edit-pr "gnats"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
37 ; "Command to edit a problem report." t)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
38
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
39 ;(autoload 'view-pr "gnats"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
40 ; "Command to view a problem report." t)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
41
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
42 ;(autoload 'gnats-mode "gnats"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
43 ; "Major mode for editing of problem reports." t)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
44
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
45 ;(autoload 'query-pr "gnats"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
46 ; "Command to query information about problem reports." t)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
47
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
48 ;(autoload 'summ-pr "gnats"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
49 ; "Command to display a summary listing of problem reports." t)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
50
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
51 ;;;;---------------------------------------------------------------------------
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
52 ;;;; To reply by mail within gnats-mode
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
53 ;;;;---------------------------------------------------------------------------
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
54
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
55 (defvar gnats-mailer 'mail
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
56 "*Specifiles either `mail' or `mhe' as mailer for GNATS")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
57
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
58 ;; Provides mail reply and mail other window command using usual mail
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
59 ;; interface and mh-e interface.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
60 ;;
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
61 ;; To use MAIL: set the variable
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
62 ;; `gnats-mailer' to `mail'
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
63 ;;
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
64 ;; To use MH-E: set the variable
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
65 ;; `gnats-mailer' to `mhe'
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
66
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
67 (autoload 'mail "sendmail")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
68 (autoload 'mail-other-window "sendmail")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
69 (autoload 'mail-fetch-field "mail-utils")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
70 (autoload 'rmail-dont-reply-to "mail-utils")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
71 (autoload 'mail-strip-quoted-names "mail-utils")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
72 (autoload 'mail-send "sendmail")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
73 (autoload 'mail-send-and-exit "sendmail")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
74
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
75 (autoload 'mh-send "mh-e")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
76 (autoload 'mh-send-other-window "mh-e")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
77 (autoload 'mh-find-path "mh-e")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
78 (autoload 'mh-get-field "mh-e")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
79 (autoload 'mh-insert-fields "mh-e")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
80 (defvar mh-show-buffer nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
81 (defvar mh-sent-from-folder nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
82 (defvar mh-sent-from-msg nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
83
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
84 ;;; User options
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
85
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
86 (defvar gnats:keep-edited-buffers t
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
87 "*If non-nil, then PR buffers are kept with distinct names after
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
88 editing. Otherwise, only the the most recently edited PR is kept.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
89
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
90 (defvar gnats:keep-sent-messages 1
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
91 "*Non-nil value N causes GNATS to keep the last N messages sent from GNATS.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
92 A value of 0 or nil causes GNATS never to keep such buffers. A value of t
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
93 causes GNATS to keep all such buffers.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
94
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
95 (defvar gnats:network-server nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
96 "*If non-nil, names the GNATS network server for remote queries and editing.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
97
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
98 (defvar gnats:run-in-background t
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
99 "*If non-nil, make GNATS programs run in the background allowing the emacs to continue to other things.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
100
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
101 (defvar gnats:bury-edited-prs t
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
102 "*If non-nil, then PR buffers are buried after editing. Otherwise, they are left at the top of the buffer list.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
103
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
104 ;;; emacs 19 uses compile-internal, emacs 18 uses compile1
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
105 (if gnats::emacs-19p
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
106 (autoload 'compile-internal "compile")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
107 (autoload 'compile1 "compile")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
108 (fset 'compile-internal 'compile1))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
109
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
110 ;;; Misc constants.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
111
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
112 ;;(defvar gnats:root "/usr/share/gnats/gnats-db"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
113 ;; "*The top of the tree containing the GNATS database.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
114
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
115 (defvar gnats:libdir (or (gnats::get-config "LIBDIR") "/usr/lib")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
116 "*Where the `gnats' subdirectory lives for things like pr-edit.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
117
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
118 (defvar gnats:addr (or (gnats::get-config "GNATS_ADDR") "bugs")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
119 "*Where bug reports are sent.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
120
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
121 (defvar gnats::version
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
122 (concat "Version " (or (gnats::get-config "VERSION") "3.101")))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
123
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
124 (defvar gnats::diffopt (or (gnats::get-config "DIFFOPT") "-u")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
125 "How to get human-friendly output from diff(1).")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
126
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
127 (defvar gnats::categories nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
128 "List of GNATS categories; computed at runtime.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
129
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
130 (defvar gnats::responsibles nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
131 "List of GNATS responsibles; Computed at runtime.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
132
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
133 (defvar gnats::submitters nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
134 "List of GNATS submitters; Computed at runtime.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
135
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
136 ;;;###autoload
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
137 (defvar gnats::mode-name nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
138 "Name of the GNATS mode.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
139
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
140 (defconst gnats::err-buffer "*gnats-error*"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
141 "Name of the temporary buffer, where gnats error messages appear.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
142
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
143 ;;(defconst gnats::indent 17 "Indent for formatting the value.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
144
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
145 (defvar gnats:::pr-locked nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
146 "Buffer local flag representing whether the associated pr is locked.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
147
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
148 (defvar gnats:::pr-errors nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
149 "Buffer local buffer holding any errors from attempting to file this pr.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
150
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
151 (defvar gnats:::buffer-pr nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
152 "Buffer local name of this pr.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
153
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
154 (defvar gnats:::current-pr nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
155 "Buffer local value of the current pr.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
156
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
157 (defvar gnats:::do-file-pr nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
158 "Buffer local value; if T, file the current pr.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
159
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
160 (defvar gnats:::force nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
161 "Buffer local value; if T, ignore errors unlocking the current pr.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
162
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
163 (defvar gnats:::pr-buffer nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
164 "Buffer local value of the buffer containing the pr.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
165
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
166 (defvar gnats:::audit-trail nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
167 "Buffer local audit trail for the current pr.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
168
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
169 (defvar gnats:::backupname nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
170 "Buffer local name of the backup file for this pr.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
171
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
172 (defvar gnats:::start-of-PR-fields nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
173 "Buffer position of the beginning of the PR fields.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
174
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
175 (defvar gnats:::newfile nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
176 "File used to store the results of npr-edit.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
177
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
178 (defvar gnats:::query-pr "query-pr"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
179 "The program name used to query problem reports.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
180
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
181 (defvar gnats:::nquery-pr "nquery-pr"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
182 "The program name used to query problem reports over the network.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
183
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
184 (defvar gnats:::query-regexp "n?query-pr:"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
185 "The regular expression to use to recognize a message from the query program.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
186
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
187 ;; For example:
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
188 ;; (setq gnats:::types '( ( "Games" ( "/gnats/games" "/usr/gamesdb/H-sun4/lib ")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
189 ;; ( "Tools" ( "/usr/toolsdb" "/usr/local/lib" ))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
190 (defvar gnats:::types nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
191 "Alist of each type of GNATS database and its root and libdir settings.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
192
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
193 (defconst gnats::fields
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
194 (let (fields)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
195 (setq
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
196 fields
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
197 ;; Duplicate send-pr::fields, don't just include it.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
198 ;; is there a better way than this?
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
199 (append (read (prin1-to-string send-pr::fields))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
200 '(("Arrival-Date" nil nil text)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
201 ("Customer-Id")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
202 ("Number" nil nil number)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
203 ("Responsible" gnats::set-responsibles nil enum
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
204 gnats::update-audit-trail)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
205 ("State"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
206 (("open") ("analyzed") ("feedback") ("suspended") ("closed"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
207 (lambda (x) (or (cdr (assoc x gnats::state-following)) ""))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
208 enum gnats::update-audit-trail))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
209 ;; (setf (second (assoc "Category" fields)) 'gnats::set-categories)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
210 (setcar (cdr (assoc "Category" fields)) 'gnats::set-categories)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
211 (setcdr (nthcdr 3 (assoc "Category" fields))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
212 '(gnats::update-responsible))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
213 (setcar (cdr (assoc "Class" fields))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
214 '(("sw-bug") ("doc-bug") ("change-request") ("support")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
215 ("mistaken") ("duplicate")))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
216 (setcdr (assoc "Submitter-Id" fields) '(gnats::set-submitters t enum))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
217 (setcdr (assoc "Customer-Id" fields) (cdr (assoc "Submitter-Id" fields)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
218 fields)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
219 "AList of one-line PR fields and their possible values.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
220
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
221 (defconst gnats::state-following
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
222 '(("open" . "analyzed")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
223 ("analyzed" . "feedback")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
224 ("feedback" . "closed")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
225 ("suspended" . "analyzed"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
226 "A list of states and possible following states (does not describe all
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
227 possibilities).")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
228
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
229 (defvar gnats::query-pr-history nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
230 "Past arguments passed to the query-pr program.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
231
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
232 (defvar gnats::tmpdir (or (getenv "TMPDIR") "/tmp/")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
233 "Directory to use for temporary files.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
234
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
235 ;;;;---------------------------------------------------------------------------
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
236 ;;;; hooks
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
237 ;;;;---------------------------------------------------------------------------
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
238
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
239 ;; we define it here in case it's not defined
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
240 (or (boundp 'text-mode-hook) (setq text-mode-hook nil))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
241 (defvar gnats-mode-hook text-mode-hook "Called when gnats mode is switched on.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
242
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
243 ;;;;---------------------------------------------------------------------------
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
244 ;;;; Error conditions
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
245 ;;;;---------------------------------------------------------------------------
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
246
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
247 (put 'gnats::error 'error-conditions '(error gnats::error))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
248 (put 'gnats::error 'error-message "GNATS error")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
249
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
250 ;; pr-edit --check was unhappy
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
251 (put 'gnats::invalid-fields 'error-conditions
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
252 '(error gnats::error gnats::invalid-fields))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
253 (put 'gnats::invalid-fields 'error-message "invalid fields in PR")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
254 (put 'gnats::invalid-date 'error-conditions
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
255 '(error gnats::error gnats::invalid-date))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
256 (put 'gnats::invalid-date 'error-message "invalid date value")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
257
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
258 ;; pr-addr couldn't find an appropriate address
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
259 (put 'gnats::invalid-name 'error-conditions
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
260 '(error gnats::error gnats::invalid-name))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
261 (put 'gnats::invalid-name 'error-message "could not find the requested address")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
262
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
263 ;; what pr?
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
264 (put 'gnats::no-such-pr 'error-conditions '(error gnats::error gnats::no-such-pr))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
265 (put 'gnats::no-such-pr 'error-message "PR does not exist")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
266
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
267 ;;
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
268 (put 'gnats::no-such-category 'error-conditions
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
269 '(error gnats::error gnats::no-such-category))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
270 (put 'gnats::no-such-category 'error-message "No such category")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
271
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
272 ;; there is no lock on that pr
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
273 (put 'gnats::pr-not-locked 'error-conditions
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
274 '(error gnats::error gnats::pr-not-locked))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
275 (put 'gnats::pr-not-locked 'error-message "No one is locking the PR")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
276
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
277 ;; there is a lock on that pr
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
278 (put 'gnats::locked-pr 'error-conditions '(error gnats::error gnats::locked-pr))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
279 (put 'gnats::locked-pr 'error-message "PR locked by")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
280
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
281 ;; GNATS is locked
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
282 (put 'gnats::locked 'error-conditions '(error gnats::error gnats::locked))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
283 (put 'gnats::locked 'error-message "GNATS is locked by another process---try again later.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
284
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
285 ;; We can't lock GNATS.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
286 (put 'gnats::cannot-lock 'error-conditions '(error gnats::error gnats::locked))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
287 (put 'gnats::cannot-lock 'error-message "cannot lock GNATS; try again later.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
288
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
289 ;;;;---------------------------------------------------------------------------
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
290 ;;;; GNATS mode
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
291 ;;;;---------------------------------------------------------------------------
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
292
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
293 (defvar gnats-mode-map
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
294 (let ((map (make-sparse-keymap)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
295 (define-key map "\M-n" 'gnats:next-field)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
296 (define-key map "\M-p" 'gnats:previous-field)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
297 (define-key map "\C-\M-b" 'gnats:backward-field)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
298 (define-key map "\C-\M-f" 'gnats:forward-field)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
299 (define-key map "\C-c\C-a" 'gnats:mail-reply)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
300 (define-key map "\C-c\C-c" 'gnats:submit-pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
301 (define-key map "\C-c\C-e" 'gnats:edit-pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
302 (define-key map "\C-c\C-f" 'gnats:change-field)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
303 (define-key map "\C-c\C-m" 'gnats:mail-other-window)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
304 (define-key map "\C-c\C-q" 'gnats:unlock-buffer-force)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
305 (define-key map "\C-c\C-r" 'gnats:responsible-change-from-to)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
306 (define-key map "\C-c\C-s" 'gnats:state-change-from-to)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
307 (define-key map "\C-c\C-t" 'gnats:category-change-from-to)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
308 (define-key map "\C-c\C-u" 'gnats:unlock-pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
309 (or gnats::emacs-19p
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
310 (define-key map "\C-xk" 'gnats:kill-buffer))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
311 map)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
312 "Keymap for gnats mode.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
313
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
314 (defsubst gnats::get-header (field)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
315 "Fetch the contents of mail header FIELD."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
316 (funcall (nth 4 (assoc gnats-mailer gnats::mail-functions)) field))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
317
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
318 (defun gnats:submit-pr ()
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
319 "Save the current PR into the database and unlock it.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
320
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
321 This function has no effect if the PR is not locked.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
322
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
323 Three cases:
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
324 State change
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
325 Responsibility change
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
326 Other change (only interesting if the PR was changed by somebody
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
327 other than the Reponsible person)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
328
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
329 State changes are sent to the originator
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
330 Responsibility changes are sent to the new responsible person
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
331 Other changes are sent to the responsible person."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
332 ;;
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
333 (interactive)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
334 (cond ((not (eq major-mode 'gnats:gnats-mode))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
335 (error "edit-pr: not in GNATS mode."))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
336 (gnats:::pr-locked
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
337 (gnats::check-pr-background t)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
338 (if gnats:run-in-background (bury-buffer)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
339 ;; If not locked, do nothing
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
340 (t
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
341 (message "edit-pr: PR not locked."))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
342
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
343 ;;;###autoload
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
344 (setq gnats::mode-name 'gnats:gnats-mode)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
345
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
346 (defun gnats::rename-buffer ()
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
347 (let ((category (gnats::field-contents "Category"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
348 (number (gnats::field-contents "Number"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
349 buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
350 (setq gnats:::buffer-pr (format "%s/%s" category number))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
351 (and (setq buf (get-buffer gnats:::buffer-pr))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
352 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
353 (set-buffer buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
354 (set-buffer-modified-p nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
355 (kill-buffer buf)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
356 (rename-buffer gnats:::buffer-pr)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
357
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
358 ;; FIXME allow re-lock of unlocked PR
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
359 ;; FIXME too many assumptions -- make more independent of edit-pr
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
360 ;;;###autoload
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
361 (fset 'gnats-mode gnats::mode-name)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
362 ;;;###autoload
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
363 (defun gnats:gnats-mode ()
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
364 "Major mode for editing problem reports.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
365 For information about the form see gnats(1) and pr_form(5).
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
366
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
367 When you are finished editing the buffer, type \\[gnats:submit-pr] to commit
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
368 your changes to the PR database. To abort the edit, type
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
369 \\[gnats:unlock-buffer].
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
370
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
371 Special commands:
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
372 \\{gnats-mode-map}
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
373 Turning on gnats-mode calls the value of the variable gnats-mode-hook,
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
374 if it is not nil."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
375 (gnats::patch-exec-path) ;Why is this necessary? --jason
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
376 (gnats::set-categories)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
377 (gnats::set-responsibles)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
378 (gnats::set-submitters)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
379 (put gnats::mode-name 'mode-class 'special)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
380 (kill-all-local-variables)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
381 (setq major-mode gnats::mode-name)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
382 (setq mode-name "gnats")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
383 (use-local-map gnats-mode-map)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
384 (set-syntax-table text-mode-syntax-table)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
385 (setq local-abbrev-table text-mode-abbrev-table)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
386 (make-local-variable 'gnats:::start-of-PR-fields)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
387 (make-local-variable 'gnats:::pr-errors)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
388 (make-local-variable 'gnats:::buffer-pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
389 (gnats::rename-buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
390
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
391 ;; we do this in gnats:edit-pr for the network version
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
392 (if (not gnats:network-server)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
393 (progn
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
394 (setq gnats:::backupname (gnats::make-temp-name))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
395 (copy-file (format "%s/%s" gnats:root gnats:::buffer-pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
396 gnats:::backupname)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
397
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
398 ;; edit-pr locks it for us
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
399 (make-local-variable 'gnats:::pr-locked)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
400 (setq gnats:::pr-locked t)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
401
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
402 (cond (gnats::emacs-19p
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
403 (make-local-variable 'kill-buffer-hook)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
404 (add-hook 'kill-buffer-hook 'gnats::kill-buffer-hook)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
405
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
406 ; If they do C-x C-c, unlock all of the PRs they've edited.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
407 (if (fboundp 'add-hook)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
408 (add-hook 'kill-emacs-hook 'gnats::unlock-all-buffers)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
409 (setq kill-emacs-hook 'gnats::unlock-all-buffers))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
410
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
411 (make-local-variable 'paragraph-separate)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
412 (setq paragraph-separate (concat (default-value 'paragraph-separate)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
413 "\\|" gnats::keyword "$"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
414 (make-local-variable 'paragraph-start)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
415 (setq paragraph-start (concat (default-value 'paragraph-start)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
416 "\\|" gnats::keyword))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
417 (make-local-variable 'gnats:::audit-trail)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
418 (goto-char (point-min))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
419 (search-forward "\n>Number:")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
420 (beginning-of-line)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
421 (setq gnats:::start-of-PR-fields (point-marker))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
422 (run-hooks 'gnats-mode-hook))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
423
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
424 ;;;;---------------------------------------------------------------------------
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
425 ;;;; Mail customization
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
426 ;;;;---------------------------------------------------------------------------
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
427
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
428 (or (string-match mail-yank-ignored-headers "X-mode:")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
429 (setq mail-yank-ignored-headers
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
430 (concat "^X-mode:" "\\|" mail-yank-ignored-headers)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
431
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
432 (defconst gnats::mail-functions
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
433 '((mail gnats::mail-other-window-using-mail
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
434 gnats::mail-reply-using-mail
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
435 gnats::mail-PR-changed-mail-setup
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
436 gnats::get-header-using-mail-fetch-field)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
437 (mhe gnats::mail-other-window-using-mhe
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
438 gnats::mail-reply-using-mhe
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
439 gnats::mail-PR-changed-mhe-setup
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
440 gnats::get-header-using-mhe))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
441 "An association list of mailers and the functions that use them.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
442 The functions are supposed to implement, respectively:
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
443 gnats::mail-other-window
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
444 gnats::mail-reply
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
445 gnats::mail-PR-changed-setup
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
446 gnats::get-header")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
447
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
448 ;;;;---------------------------------------------------------------------------
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
449 ;;;; Toplevel functions and vars, to reply with mail within gnats-mode
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
450 ;;;;---------------------------------------------------------------------------
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
451
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
452 (defun gnats:mail-other-window ()
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
453 "Compose mail in other window.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
454 Customize the variable `gnats-mailer' to use another mailer."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
455 ;;
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
456 (interactive)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
457 (funcall (nth 1 (assoc gnats-mailer gnats::mail-functions))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
458
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
459 (defun gnats:mail-reply (&optional just-sender)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
460 "Reply mail to PR Originator.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
461 Customize the variable `gnats-mailer' to use another mailer.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
462 If optional argument JUST-SENDER is non-nil, send response only to
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
463 original submitter of problem report."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
464 ;;
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
465 (interactive "P")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
466 (funcall (nth 2 (assoc gnats-mailer gnats::mail-functions)) just-sender))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
467
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
468 ;;;; common (and suppport) functions
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
469
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
470 (defun gnats::isme (addr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
471 (setq addr (mail-strip-quoted-names addr))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
472 (or (string= addr (user-login-name))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
473 (string= addr (concat (user-login-name) "@" (system-name)))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
474
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
475 (defsubst gnats::mail-PR-changed-setup (to subject cc buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
476 (funcall (nth 3 (assoc gnats-mailer gnats::mail-functions))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
477 to subject cc buffer))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
478
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
479 (defun gnats::mail-PR-changed-mail-setup (to subject cc buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
480 (or (gnats::vmish-mail
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
481 (format "notification of changes to PR %s" gnats:::buffer-pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
482 nil to subject nil cc buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
483 (error "Submit aborted; PR is still locked.")))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
484
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
485 (defun gnats::mail-PR-changed-mhe-setup (to subject cc buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
486 (let ((config (current-window-configuration))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
487 (pop-up-windows t)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
488 draft)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
489 (mh-find-path)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
490 (let ((pop-up-windows t))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
491 (mh-send-sub to (or cc "") subject config))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
492 (switch-to-buffer (current-buffer))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
493 (setq mh-sent-from-folder buffer
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
494 mh-sent-from-msg 1
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
495 mh-show-buffer buffer)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
496
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
497 (defun gnats::mail-PR-changed (user responsible resp-change state-change notify)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
498 "- Send mail to the responsible person if the PR has been changed
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
499 by someone else
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
500 - Send mail to the originator when the state is changed.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
501 - Send mail to old and new responsible people when the responsibility is
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
502 transferred.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
503 `resp-change' is the list (old-resp new-resp start end)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
504 - Send mail to any other parties in NOTIFY."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
505 ;; This function is really ugly !
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
506 ;;
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
507 (let ((to nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
508 (cc nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
509 (subn nil) (subm nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
510 (subject (gnats::get-reply-subject))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
511 (buffer (current-buffer))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
512 (pr-change (not (or resp-change state-change)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
513 (pr-backupname gnats:::backupname)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
514 )
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
515 ;; Here we find out where to send the mail to
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
516 (let (to-resp to-new-resp to-submitter to-bugs resp-addr new-resp-addr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
517 (if pr-change (setq to-resp t to-bugs t)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
518 (if resp-change (setq to-resp t to-new-resp t))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
519 (if state-change (setq to-submitter t to-resp t)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
520 (cond (to-new-resp
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
521 (setq new-resp-addr (gnats::pr-addr (car resp-change)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
522 (if (gnats::isme new-resp-addr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
523 (setq to-new-resp nil))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
524 (cond (to-resp
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
525 (setq resp-addr (gnats::pr-addr responsible))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
526 (if (gnats::isme resp-addr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
527 (setq to-resp nil))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
528 (cond (to-submitter
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
529 (setq cc to)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
530 (setq to (list (gnats::get-reply-to)))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
531 (if to-resp (gnats::push resp-addr to))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
532 (if to-new-resp (gnats::push new-resp-addr to))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
533 (setq subm (or (gnats::field-contents "Customer-Id")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
534 (gnats::field-contents "Submitter-Id")))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
535 (if subm
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
536 (progn
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
537 (setq subn (nth 5 (assoc subm gnats::submitters)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
538 (if (not (string= subn ""))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
539 (gnats::push subn cc))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
540 (if to-bugs (gnats::push gnats:addr cc))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
541 (if notify (gnats::push notify cc))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
542 (setq to (mapconcat 'identity to ", ")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
543 cc (mapconcat 'identity cc ", "))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
544 (if (string= cc "") (setq cc nil)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
545 (gnats::mail-PR-changed-setup to subject cc buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
546 ;; now we assume that the current buffer is the mail buffer
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
547 (goto-char (point-max))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
548 (if pr-change
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
549 (progn
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
550 (insert
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
551 (format "\n\t`%s' made changes to this PR.\n\n" (user-full-name)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
552 (if (and pr-backupname (file-readable-p pr-backupname))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
553 (let ((file (gnats::make-temp-name))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
554 (default-directory (gnats::find-safe-default-directory)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
555 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
556 (set-buffer buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
557 (write-region (point-min) (point-max) file))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
558 (call-process "diff" nil t t gnats::diffopt
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
559 pr-backupname file)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
560 (delete-file file))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
561 (if resp-change
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
562 (progn
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
563 (insert (format "\n\t`%s' changed the responsibility to `%s'.\n"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
564 (user-full-name) responsible))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
565 (insert-buffer-substring buffer
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
566 (nth 2 resp-change)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
567 (nth 3 resp-change)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
568 (if state-change
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
569 (progn
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
570 (insert (format "\n\t`%s' changed the state to `%s'.\n"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
571 (user-full-name) (nth 1 state-change)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
572 (insert-buffer-substring buffer
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
573 (nth 2 state-change)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
574 (nth 3 state-change))))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
575 ))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
576
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
577 (defsubst gnats::bm (num)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
578 (buffer-substring (match-beginning num) (match-end num)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
579
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
580 (defun gnats::real-pr-addr (name)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
581 (if (zerop (length name))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
582 nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
583 (let ((buf (generate-new-buffer gnats::err-buffer)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
584 (unwind-protect
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
585 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
586 (let ((default-directory (gnats::find-safe-default-directory)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
587 (call-process (format "%s/gnats/pr-addr" gnats:libdir)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
588 nil buf nil "-F" name))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
589 (set-buffer buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
590 (goto-char (point-min))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
591 (cond ((looking-at "pr-addr: could not find the requested address")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
592 nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
593 ((looking-at "^\\([^:]*\\):\\([^:]*\\):\\([^:]*\\)\n")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
594 (list (gnats::bm 1) (gnats::bm 2) (gnats::bm 3)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
595 (t (signal 'gnats::error
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
596 (list (buffer-substring (point-min)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
597 (1- (point-max))))))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
598 (kill-buffer buf)))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
599
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
600 (defun gnats::pr-addr (name)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
601 "Find the e-mail address corresponding to maintainer NAME."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
602 (let (entry addr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
603 (or (setq entry (assoc name gnats::responsibles))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
604 (and (setq entry (gnats::real-pr-addr name))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
605 (gnats::push entry gnats::responsibles))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
606 (signal 'gnats::invalid-name (list name)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
607 (setq addr (if (zerop (length (nth 2 entry)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
608 name
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
609 (nth 2 entry)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
610 (if (zerop (length (nth 1 entry)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
611 addr
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
612 (concat (nth 1 entry) " <" addr ">"))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
613
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
614 (defun gnats::get-header-using-mail-fetch-field (field)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
615 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
616 (save-restriction
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
617 (goto-char (point-min))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
618 (re-search-forward "^$" nil 'move)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
619 (narrow-to-region (point-min) (point))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
620 (mail-fetch-field field))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
621
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
622 (defun gnats::get-header-using-mhe (field)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
623 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
624 (let ((ret (mh-get-field (concat field ":"))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
625 (if (string= ret "")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
626 nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
627 ret))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
628
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
629 (defun gnats::get-reply-to ()
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
630 (or (gnats::get-header "Reply-To")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
631 (gnats::get-header "From")))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
632
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
633 (defun gnats::get-reply-subject ()
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
634 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
635 (save-restriction
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
636 (widen)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
637 (let ((category (gnats::field-contents "Category"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
638 (number (gnats::field-contents "Number"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
639 (synopsis (gnats::field-contents "Synopsis" 0))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
640 (subject))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
641 (goto-char (point-min))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
642 (narrow-to-region (point-min)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
643 (progn (search-forward "\n\n" nil 'move)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
644 (point-marker)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
645 (setq subject (mail-fetch-field "subject"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
646 (if (and synopsis (not (equal synopsis "")))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
647 (format "Re: %s/%s: %s" category number synopsis)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
648 (format "Re: %s/%s: %s" category number subject))))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
649
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
650 (defun gnats::make-in-reply-to-field (from date msg-id)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
651 (concat
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
652 (substring from 0 (string-match " *at \\| *@ \\| *(\\| *<" from))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
653 "'s message of " date
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
654 (if (not (equal msg-id ""))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
655 (concat "\n " msg-id)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
656 "")))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
657
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
658 ;;;; Send mail using sendmail mail mode.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
659
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
660 (defun gnats::mail-reply-using-mail (just-sender)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
661 ;;
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
662 "Mail a reply to the originator of the PR.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
663 Normally include CC: to all other recipients of original message;
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
664 argument means ignore them.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
665 While composing the reply, use \\[mail-yank-original] to yank the
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
666 original message into it."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
667 ;;
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
668 (let (from cc subject date to reply-to msg-id)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
669 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
670 (save-restriction
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
671 (widen)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
672 (narrow-to-region (point-min) (progn (goto-char (point-min))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
673 (search-forward "\n\n")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
674 (- (point) 1)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
675 (setq from (mail-fetch-field "from" nil t)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
676 subject (gnats::get-reply-subject)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
677 reply-to (or (mail-fetch-field "reply-to" nil t)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
678 from)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
679 date (mail-fetch-field "date" nil t)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
680 cc (cond (just-sender nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
681 (t (mail-fetch-field "cc" nil t)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
682 to (or (mail-fetch-field "to" nil t)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
683 (mail-fetch-field "apparently-to" nil t)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
684 "")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
685 msg-id (mail-fetch-field "message-id")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
686 )))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
687 (gnats::vmish-mail-other-window
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
688 (format "reply to PR %s" gnats:::buffer-pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
689 nil (mail-strip-quoted-names reply-to) subject
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
690 (gnats::make-in-reply-to-field from date msg-id)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
691 (if just-sender
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
692 nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
693 (let* ((cc-list (rmail-dont-reply-to (mail-strip-quoted-names
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
694 (if (null cc) to
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
695 (concat to ", " cc))))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
696 (if (string= cc-list "") nil cc-list)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
697 (current-buffer))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
698
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
699 (defun gnats::mail-other-window-using-mail ()
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
700 "Send mail in another window.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
701 While composing the message, use \\[mail-yank-original] to yank the
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
702 original message into it."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
703 (gnats::vmish-mail-other-window
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
704 (format "mail regarding PR %s" gnats:::buffer-pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
705 nil nil (gnats::get-reply-subject) nil nil (current-buffer)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
706
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
707 ;; This must be done in two toplevel forms because of a 19.19 byte-compiler
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
708 ;; bug.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
709 (defun gnats::generate-new-buffer-name (prefix)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
710 (let ((name prefix) (n 1))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
711 (while (get-buffer name)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
712 (setq name (format "%s<%d>" prefix n))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
713 (setq n (1+ n)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
714 name))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
715
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
716 (if (fboundp 'generate-new-buffer-name)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
717 (fset 'gnats::generate-new-buffer-name 'generate-new-buffer-name))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
718
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
719 (defvar gnats::kept-mail-buffers nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
720 "Sent mail buffers waiting to be killed.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
721
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
722 (defun gnats::vmish-rename-after-send ()
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
723 (or (string-match "^sent " (buffer-name))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
724 (rename-buffer (gnats::generate-new-buffer-name
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
725 (format "sent %s" (buffer-name)))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
726
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
727 ;; Mostly lifted from vm-reply.el 5.35
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
728 (setq gnats::kept-mail-buffers
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
729 (cons (current-buffer) gnats::kept-mail-buffers))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
730 (if (not (eq gnats:keep-sent-messages t))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
731 (let ((extras (nthcdr (or gnats:keep-sent-messages 0)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
732 gnats::kept-mail-buffers)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
733 (mapcar (function (lambda (b) (and (buffer-name b) (kill-buffer b))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
734 extras)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
735 (and gnats::kept-mail-buffers extras
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
736 (setcdr (memq (car extras) gnats::kept-mail-buffers) nil)))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
737
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
738 (if gnats::emacs-19p
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
739 (defun gnats::vmish-mail-bindings ())
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
740 (defun gnats::vmish-mail-send ()
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
741 (interactive)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
742 (gnats::vmish-rename-after-send)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
743 (mail-send))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
744 (defun gnats::vmish-mail-send-and-exit (arg)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
745 (interactive "P")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
746 (gnats::vmish-rename-after-send)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
747 (mail-send-and-exit arg))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
748 (defun gnats::vmish-mail-bindings ()
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
749 (use-local-map (copy-keymap (current-local-map)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
750 (local-set-key "\C-c\C-s" 'gnats::vmish-mail-send)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
751 (local-set-key "\C-c\C-c" 'gnats::vmish-mail-send-and-exit))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
752 (defun string-to-number (str) (string-to-int str)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
753
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
754 ;; ignore 'free variable' warnings about buf.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
755 (defsubst gnats::vmish-rename-mail-buffer (buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
756 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
757 (set-buffer buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
758 (setq buf (gnats::generate-new-buffer-name "*not mail*"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
759 (rename-buffer buf)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
760
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
761 ;; ignore 'free variable' warnings about buf.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
762 (defsubst gnats::vmish-restore-mail-buffer (buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
763 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
764 (let ((mbuf (get-buffer "*mail*")))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
765 (cond (mbuf ;maybe left over from m-o-w failure
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
766 (set-buffer mbuf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
767 (set-buffer-modified-p nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
768 (kill-buffer mbuf))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
769 (cond (buf
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
770 (set-buffer buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
771 (rename-buffer "*mail*")))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
772
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
773 (defun gnats::vmish-mail-other-window
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
774 (&optional buffer-name noerase to subject in-reply-to cc replybuffer actions)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
775 (let ((buf (get-buffer "*mail*")))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
776 (if buf (gnats::vmish-rename-mail-buffer buf))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
777 (or buffer-name (setq buffer-name "GNATS mail"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
778 (unwind-protect
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
779 (prog1
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
780 (if gnats::emacs-19p
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
781 (mail-other-window
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
782 noerase to subject in-reply-to cc replybuffer
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
783 (cons '(gnats::vmish-rename-after-send) actions))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
784 (prog1
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
785 (mail-other-window noerase to subject in-reply-to
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
786 cc replybuffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
787 (gnats::vmish-mail-bindings)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
788 (rename-buffer (gnats::generate-new-buffer-name buffer-name)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
789 (gnats::vmish-restore-mail-buffer buf))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
790
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
791 (defun gnats::vmish-mail
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
792 (&optional buffer-name noerase to subject in-reply-to cc replybuffer actions)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
793 (let (buf (get-buffer "*mail*"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
794 (if buf (gnats::vmish-rename-mail-buffer buf))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
795 (or buffer-name (setq buffer-name "GNATS mail"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
796 (unwind-protect
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
797 (prog1
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
798 (if gnats::emacs-19p
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
799 (mail noerase to subject in-reply-to cc replybuffer
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
800 (cons '(gnats::vmish-rename-after-send) actions))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
801 (prog1
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
802 (mail noerase to subject in-reply-to cc replybuffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
803 (gnats::vmish-mail-bindings)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
804 (rename-buffer (gnats::generate-new-buffer-name buffer-name)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
805 (gnats::vmish-restore-mail-buffer buf))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
806
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
807 ;;;; Send mail using mh-e.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
808
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
809 (defun gnats::mail-other-window-using-mhe ()
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
810 "Compose mail other window using mh-e.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
811 While composing the message, use \\[mh-yank-cur-msg] to yank the
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
812 original message into it."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
813 (let ((subject (gnats::get-reply-subject)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
814 (setq mh-show-buffer (current-buffer))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
815 (mh-find-path)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
816 (mh-send-other-window "" "" subject)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
817 (setq mh-sent-from-folder (current-buffer))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
818 (setq mh-sent-from-msg 1)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
819
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
820
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
821 (defun gnats::mail-reply-using-mhe (just-sender)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
822 "Compose reply mail using mh-e.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
823 The command \\[mh-yank-cur-msg] yanks the original message into current buffer.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
824 If optional argument JUST-SENDER is non-nil, send response only to
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
825 original submitter of problem report."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
826 ;; First of all, prepare mhe mail buffer.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
827 (let (from cc subject date to reply-to (buffer (current-buffer)) msg-id)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
828 (save-restriction
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
829 (setq from (mh-get-field "From:")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
830 subject (gnats::get-reply-subject)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
831 reply-to (or (mh-get-field "Reply-To:") from)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
832 to (or (mh-get-field "To:")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
833 (mh-get-field "Apparently-To:")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
834 "")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
835 cc (mh-get-field "Cc:")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
836 date (mh-get-field "Date:")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
837 msg-id (mh-get-field "Message-Id:")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
838 )
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
839 (setq mh-show-buffer buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
840 (mh-find-path)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
841 (mh-send reply-to (or (and just-sender "")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
842 (if (null cc) to
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
843 (concat to ", " cc)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
844 subject)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
845 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
846 (mh-insert-fields
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
847 "In-Reply-To:" (gnats::make-in-reply-to-field from date msg-id)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
848 (setq mh-sent-from-folder buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
849 (setq mh-sent-from-msg 1)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
850 )))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
851
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
852
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
853 ;;;;---------------------------------------------------------------------------
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
854 ;;;; Functions to change specific fields
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
855 ;;;;---------------------------------------------------------------------------
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
856
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
857 (defun gnats:state-change-from-to ()
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
858 "Change the value of the `>State:' field and update the audit trail."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
859 (interactive)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
860 (gnats:change-field "State"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
861
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
862 (defun gnats:responsible-change-from-to ()
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
863 "Change the value of the `>Responsible:' field and update the audit trail."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
864 (interactive)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
865 (gnats:change-field "Responsible"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
866
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
867 (defun gnats:category-change-from-to ()
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
868 "Change the value of the `>Category:' field and the responsible party."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
869 (interactive)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
870 (gnats:change-field "Category"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
871
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
872 (defun gnats::update-audit-trail (field old new)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
873 (if (gnats::position-on-field "Audit-Trail")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
874 (let (start end)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
875 (gnats::forward-eofield)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
876 (setq start (point-marker))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
877 (if (eq old t) (setq old "????"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
878 (if (string= field "Responsible")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
879 (insert (format "\n\n%s-Changed-From-To: %s->%s" field
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
880 (gnats::nth-word old)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
881 (gnats::nth-word new)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
882 (insert (format "\n\n%s-Changed-From-To: %s-%s" field
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
883 (gnats::nth-word old)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
884 (gnats::nth-word new))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
885 (insert (format "\n%s-Changed-By: %s" field (user-login-name)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
886 (insert (format "\n%s-Changed-When: %s" field (current-time-string)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
887 (insert (format "\n%s-Changed-Why:\n" field))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
888 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
889 (gnats::before-keyword t)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
890 (setq end (point-marker)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
891 ;; here we record the changes in a assoc list
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
892 (setq gnats:::audit-trail (cons (list field
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
893 (gnats::nth-word old)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
894 (gnats::nth-word new)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
895 start end)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
896 gnats:::audit-trail)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
897 (error "Field `>Audit-Trail:' missing.")))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
898
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
899 (defun gnats::category-responsible (category)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
900 (let ((entry (assoc category gnats::categories)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
901 (if entry
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
902 (nth 2 entry)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
903 (signal 'gnats::no-such-category (list category)))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
904
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
905 (defun gnats::update-responsible (ignore1 ignore2 new)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
906 "Modify the responsible field of the current PR to match the new category."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
907 (and (y-or-n-p "Update the >Responsible: field? ")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
908 (gnats:change-field "Responsible" (gnats::category-responsible new))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
909
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
910 ;;;;---------------------------------------------------------------------------
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
911
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
912 (defsubst gnats::rw (buf retval)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
913 (or
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
914 retval ; call-process is broken under 19.19.2
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
915 (save-excursion (set-buffer buf) (buffer-size))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
916
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
917 (defun gnats::handle-results (pr exit-status)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
918 "Handle the results of running pr-edit or npr-edit, giving a signal
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
919 if needed."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
920 (cond
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
921 ((looking-at "n?pr-edit: cannot create lock file")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
922 (signal 'gnats::cannot-lock nil))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
923 ((looking-at "n?pr-edit: lock file exists")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
924 (signal 'gnats::locked nil))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
925 ((or (looking-at "n?pr-edit: no such PR")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
926 (looking-at "n?pr-edit: couldn.t find PR.*"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
927 (signal 'gnats::no-such-pr nil))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
928 ((looking-at "n?pr-edit: PR \\(.*\\) locked by \\(.*\\)")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
929 (let* ((msg (gnats::bm 2))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
930 (pr-path
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
931 (buffer-substring-no-properties (match-beginning 1) (match-end 1)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
932 (pr-name (progn (if (string-match gnats:root pr-path)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
933 (substring pr-path (1+ (match-end 0)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
934 pr-path)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
935 (buf (get-buffer pr-name))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
936 win)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
937 (if buf
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
938 ;; If we're already editing the PR, just go to that
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
939 ;; buffer and be done with it.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
940 (progn
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
941 (if (setq win (get-buffer-window buf))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
942 (select-window win)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
943 (switch-to-buffer buf))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
944 (message "Already editing PR %s." pr-name))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
945 ;; kick it to the next level
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
946 (signal 'gnats::locked-pr (list msg)))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
947 ((looking-at "n?pr-edit: PR is not locked")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
948 (if (not gnats:::force) (signal 'gnats::pr-not-locked nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
949 t))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
950 ((looking-at "n?pr-edit: invalid fields")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
951 (signal 'gnats::invalid-fields nil))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
952 ((looking-at "n?pr-edit: cannot parse the date")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
953 (signal 'gnats::invalid-date nil))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
954 ((looking-at "n?pr-edit: lock file .* does not exist"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
955 (t (signal 'gnats::error
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
956 (list (if (eq (point-min) (point-max))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
957 (format "unknown error (exit status %d)"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
958 exit-status)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
959 (buffer-substring (point-min) (- (point-max) 1))))))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
960
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
961 (if gnats::emacs-19p
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
962 (require 'env))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
963 (defun gnats::start-background (pr proctype sentinel &optional outfile filep args)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
964 (let ((buf (get-buffer-create gnats::err-buffer))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
965 inbuf proc-name proc-action proc-send-buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
966 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
967 (setq inbuf (current-buffer))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
968 (set-buffer buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
969 (erase-buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
970 (make-variable-buffer-local 'gnats:::force)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
971 (setq gnats:::force nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
972 (cond ((eq proctype 'check)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
973 (progn
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
974 (setq proc-name "check-pr"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
975 proc-action "Checking"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
976 proc-send-buffer t)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
977 (setq args (append (list "--check") args))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
978 (make-variable-buffer-local 'gnats:::pr-buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
979 (setq gnats:::pr-buffer inbuf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
980 (make-variable-buffer-local 'gnats:::do-file-pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
981 (setq gnats:::do-file-pr filep)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
982 ((eq proctype 'file)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
983 (setq proc-name "file-pr"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
984 proc-action "Filing"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
985 proc-send-buffer t))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
986 ((eq proctype 'unlock)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
987 (progn
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
988 (setq proc-name "unlock-pr"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
989 proc-action "Unlocking")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
990 (make-variable-buffer-local 'gnats:::current-pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
991 (setq gnats:::current-pr pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
992 (setq args (append (list "--unlock" pr) args))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
993 ((eq proctype 'unlock-force)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
994 (progn
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
995 (setq proc-name "unlock-pr"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
996 proc-action "Unlocking"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
997 gnats:::force t)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
998 (make-variable-buffer-local 'gnats:::current-pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
999 (setq gnats:::current-pr pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1000 (setq args (append (list "--unlock" pr) args))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1001 ((eq proctype 'edit)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1002 (progn
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1003 (setq proc-name "edit-pr"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1004 proc-action "Fetching")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1005 (make-variable-buffer-local 'gnats:::current-pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1006 (setq gnats:::current-pr pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1007 (make-variable-buffer-local 'gnats:::newfile)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1008 (setq gnats:::newfile outfile)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1009 (t
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1010 (error "Invalid PROCTYPE for background GNATS process.")))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1011 (let ((process-environment
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1012 (if gnats::emacs-19p (copy-sequence process-environment)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1013 proc)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1014 (setq proc
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1015 (apply 'start-process
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1016 (concat " *" proc-name "-" (random t))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1017 buf
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1018 (format (if gnats:network-server
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1019 "%s/gnats/npr-edit"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1020 "%s/gnats/pr-edit")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1021 gnats:libdir)
179
9ad43877534d Import from CVS: tag r20-3b16
cvs
parents: 136
diff changeset
1022 (if gnats:network-server
9ad43877534d Import from CVS: tag r20-3b16
cvs
parents: 136
diff changeset
1023 (concat (format "--host=%s" gnats:network-server) args)
9ad43877534d Import from CVS: tag r20-3b16
cvs
parents: 136
diff changeset
1024 args
9ad43877534d Import from CVS: tag r20-3b16
cvs
parents: 136
diff changeset
1025 )
110
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1026 ))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1027
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1028 ;; Only set up the sentinel if they want stuff done in the background.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1029 (if gnats:run-in-background
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1030 (progn
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1031 (set-process-sentinel proc sentinel)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1032 (message "%s PR %s in background." proc-action pr))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1033 (message "%s PR %s..." proc-action pr))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1034 (if proc-send-buffer
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1035 (progn
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1036 (set-buffer inbuf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1037 (goto-char (point-min))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1038 (process-send-region proc (point-min) (point-max))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1039 (if (and (/= (point-min) (point-max))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1040 (/= (char-after (- (point-max) 1)) ?\n))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1041 (process-send-string proc "\n"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1042 (process-send-eof proc)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1043 ;; if they don't want it in the background, just sit and twiddle...
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1044 (if (not gnats:run-in-background)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1045 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1046 (set-buffer (process-buffer proc))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1047 (while (memq (process-status proc) '(run open))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1048 (accept-process-output proc))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1049 (funcall sentinel proc nil)))))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1050
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1051 (defun gnats::handle-pr-edit (process event)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1052 (let ((buf (process-buffer process))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1053 result pr newfile nbuf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1054 (if (null (buffer-name buf)) ;; deleted buffer
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1055 (set-process-buffer process nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1056 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1057 (set-buffer buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1058 (setq pr gnats:::current-pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1059 (setq result (process-exit-status process))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1060 (and (/= 0 result)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1061 (goto-char (point-min))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1062 (gnats::handle-results gnats:::current-pr result))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1063 (setq nbuf (generate-new-buffer
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1064 (concat "*edit-pr " gnats:::current-pr "*")))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1065 (setq newfile gnats:::newfile)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1066 (set-buffer nbuf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1067 (insert-file-contents newfile)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1068 (make-local-variable 'gnats:::backupname)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1069 (put 'gnats:::backupname 'permanent-local t)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1070 ;; we do this in gnats:gnats-mode for non-network
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1071 (if gnats:network-server (setq gnats:::backupname newfile))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1072 (set-buffer-modified-p nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1073 (setq buffer-undo-list nil) ;flush undo list
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1074 (gnats:gnats-mode)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1075 (make-variable-buffer-local 'gnats:::current-pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1076 (setq gnats:::current-pr pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1077 (goto-char gnats:::start-of-PR-fields))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1078 (message "Fetching PR %s done." pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1079 (if gnats:run-in-background
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1080 (display-buffer nbuf 'not-this-window)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1081 (switch-to-buffer nbuf)))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1082
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1083 (defun gnats::pr-edit-background (pr outfile args)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1084 (gnats::start-background pr 'edit 'gnats::handle-pr-edit outfile nil args))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1085
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1086 (defun gnats::handle-check-pr (process event)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1087 (let ((buf (process-buffer process))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1088 result pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1089 (if (null (buffer-name buf)) ;; deleted buffer
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1090 (set-process-buffer process nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1091 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1092 (set-buffer buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1093 (setq result (process-exit-status process))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1094 (and (/= 0 result)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1095 (goto-char (point-min))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1096 (gnats::handle-results gnats:::current-pr result))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1097 (message "Checked PR %s." gnats:::current-pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1098 (if gnats:::do-file-pr
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1099 (progn
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1100 (set-buffer gnats:::pr-buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1101 (gnats::file-pr-background)))))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1102
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1103 (defun gnats::check-pr-background (&optional filep)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1104 (gnats::start-background gnats:::current-pr 'check
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1105 'gnats::handle-check-pr nil filep))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1106
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1107 (defun gnats::finish-filing ()
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1108 (let (responsible user resp-change state-change buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1109 (if gnats:network-server (setq gnats:::pr-locked nil))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1110 (setq buf (current-buffer))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1111 (set-buffer-modified-p nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1112 (setq responsible (gnats::field-contents "Responsible")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1113 user (user-login-name)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1114 resp-change (cdr (assoc "Responsible" gnats:::audit-trail))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1115 state-change (cdr (assoc "State" gnats:::audit-trail)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1116 (if (or state-change
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1117 resp-change
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1118 (not (equal user responsible)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1119 (gnats::mail-PR-changed user responsible
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1120 resp-change state-change
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1121 (gnats::get-header "X-GNATS-Notify")))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1122 (gnats:unlock-buffer buf)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1123
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1124 (defun gnats::handle-file-pr (process event)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1125 (let ((buf (process-buffer process))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1126 result pr prbuf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1127 (if (null (buffer-name buf)) ;; deleted buffer
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1128 (set-process-buffer process nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1129 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1130 (set-buffer buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1131 (setq result (process-exit-status process))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1132 (and (/= 0 result)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1133 (goto-char (point-min))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1134 (gnats::handle-results gnats:::current-pr result))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1135 (message "Filed PR %s." gnats:::current-pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1136 (set-buffer gnats:::pr-buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1137 (gnats::finish-filing)))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1138
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1139 (defun gnats::file-pr-background ()
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1140 (gnats::start-background gnats:::current-pr 'file 'gnats::handle-file-pr))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1141
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1142 (defun gnats::lock (pr &optional outfile)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1143 (let ((lockl (list "--lock"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1144 (format "%s@%s" (user-login-name) (system-name))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1145 "-p"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1146 (if (fboundp 'emacs-pid)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1147 (concat "emacs pid " (int-to-string (emacs-pid)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1148 "emacs18")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1149 pr)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1150 (if gnats:network-server
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1151 (setq lockl (append lockl (list "-o" outfile "--get-lists"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1152 "--host" gnats:network-server))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1153 (gnats::pr-edit-background pr outfile lockl)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1154
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1155 (fset 'unlock-pr 'gnats:unlock-pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1156 (fset 'gnats-unlock 'gnats:unlock-pr) ;backward compatibility
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1157 (defun gnats::handle-unlock-pr (process event)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1158 (let ((buf (process-buffer process))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1159 result pr newfile nbuf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1160 (if (null (buffer-name buf)) ;; deleted buffer
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1161 (set-process-buffer process nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1162 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1163 (set-buffer buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1164 (setq pr gnats:::current-pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1165 (setq result (process-exit-status process))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1166 (and (/= 0 result)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1167 (goto-char (point-min))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1168 (gnats::handle-results gnats:::current-pr result))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1169 (message "PR %s unlocked." gnats:::current-pr)))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1170
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1171 (defun gnats:unlock-pr-force (pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1172 (gnats::start-background pr 'unlock-force 'gnats::handle-unlock-pr))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1173
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1174 (defun gnats:unlock-pr (pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1175 (interactive "sPR number: ")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1176 (gnats::start-background pr 'unlock 'gnats::handle-unlock-pr))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1177
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1178 (defsubst gnats::buffer-major-mode (buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1179 (save-excursion (set-buffer buffer) major-mode))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1180
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1181 (defun gnats::unlock-all-buffers ()
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1182 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1183 (mapcar
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1184 (function
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1185 (lambda (buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1186 (let ((gnats:run-in-background nil))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1187 (if (and (eq (gnats::buffer-major-mode buffer) gnats::mode-name))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1188 (progn (set-buffer buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1189 (gnats:unlock-buffer-force buffer))))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1190 (buffer-list))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1191
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1192 (if gnats::emacs-19p
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1193 ;; Emacs 19 has kill-buffer-hook, v18 doesn't.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1194 (defun gnats::kill-buffer-hook ()
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1195 "Unlock a GNATS buffer that is being killed."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1196 (gnats:unlock-buffer nil))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1197 (defun gnats:kill-buffer (buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1198 "Safely kill a GNATS buffer."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1199 (interactive "bKill buffer: ")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1200 (if (equal buf (buffer-name))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1201 (gnats:unlock-buffer (get-buffer buf)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1202 (kill-buffer buf)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1203
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1204 (defun gnats:unlock-buffer-force (&optional buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1205 "Force a buffer to be unlocked, even if it isn't."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1206 (interactive)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1207 (if (null buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1208 (setq buf (current-buffer))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1209 (set-buffer buf))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1210 (gnats:unlock-buffer buf t))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1211
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1212 (defun gnats::delete-file (filename)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1213 (if (file-readable-p filename) (delete-file filename)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1214
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1215 (defun gnats:unlock-buffer (&optional buf force)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1216 "Safely take a GNATS buffer out of gnats-mode."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1217 (interactive)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1218 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1219 (if (null buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1220 (setq buf (current-buffer))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1221 (set-buffer buf))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1222 (cond ((or force
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1223 (not (buffer-modified-p buf))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1224 (not gnats:::pr-locked)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1225 (y-or-n-p "Buffer modified; still unlock? "))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1226 (if gnats:::pr-locked
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1227 (gnats:unlock-pr-force gnats:::buffer-pr))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1228 (if gnats:::pr-errors
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1229 (kill-buffer gnats:::pr-errors))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1230 (if gnats:::backupname
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1231 (progn
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1232 (gnats::delete-file gnats:::backupname)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1233 (if gnats:network-server
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1234 (progn
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1235 (gnats::delete-file (concat gnats:::backupname ".cat"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1236 (gnats::delete-file (concat gnats:::backupname ".res"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1237 (gnats::delete-file (concat gnats:::backupname ".sub"))))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1238 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1239 (set-buffer buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1240 (let ((pr gnats:::buffer-pr))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1241 (kill-all-local-variables)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1242 (text-mode)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1243 (make-local-variable 'gnats:::buffer-pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1244 (setq gnats:::buffer-pr pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1245 (use-local-map (copy-keymap (current-local-map)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1246 (local-set-key
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1247 "e" (function (lambda () (interactive)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1248 (gnats:edit-pr gnats:::buffer-pr))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1249 (set-visited-file-name nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1250 (setq buffer-read-only t)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1251 ;; When GNATS:KEEP-EDITED-BUFFERS is nil, we always put the
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1252 ;; most recent PR in the *edited-pr* buffer.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1253 (or gnats:keep-edited-buffers
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1254 (let ((old-buf (get-buffer (concat "*edited-pr*"))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1255 (cond (old-buf
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1256 (set-buffer old-buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1257 (set-buffer-modified-p nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1258 (kill-buffer old-buf)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1259 (set-buffer buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1260 (rename-buffer (concat "*edited-pr*"))))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1261 (and gnats:bury-edited-prs
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1262 (if (get-buffer-window buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1263 (let ((win (selected-window)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1264 (select-window (get-buffer-window buf))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1265 (bury-buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1266 (select-window win))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1267 (bury-buffer buf))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1268 (t (error "PR unlock aborted.")))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1269
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1270 (defun gnats::delete-backups (filename)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1271 (let ((l (file-name-all-completions
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1272 (concat (file-name-nondirectory filename) ".~")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1273 (file-name-directory filename)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1274 (dir (file-name-directory filename)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1275 (while l
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1276 (delete-file (concat dir (car l)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1277 (setq l (cdr l)))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1278
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1279 (defun gnats::reset-variables ()
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1280 (setq gnats::submitters nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1281 gnats::responsibles nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1282 gnats::categories nil))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1283
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1284 (defun gnats::set-responsibles (&optional arg)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1285 (or (and (null arg) gnats::responsibles)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1286 (setq gnats::responsibles
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1287 (gnats::get-list-from-file
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1288 (if gnats:network-server
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1289 "res"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1290 "responsible") "responsible")))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1291 'gnats::try-responsible-completion)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1292
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1293 (defun gnats::try-responsible-completion (string predicate do-list)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1294 (let (entry)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1295 (and (not (assoc string gnats::responsibles))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1296 (setq entry (gnats::real-pr-addr string))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1297 (gnats::push entry gnats::responsibles)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1298 (let* ((completion-ignore-case t))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1299 (if do-list
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1300 (all-completions string gnats::responsibles predicate)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1301 (try-completion string gnats::responsibles predicate))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1302
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1303 (defun gnats::set-categories (&optional arg)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1304 (or (and (null arg) gnats::categories)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1305 (setq gnats::categories
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1306 (gnats::get-list-from-file
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1307 (if gnats:network-server
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1308 "cat"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1309 "categories") "categories"))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1310
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1311 (defun gnats::set-submitters (&optional arg)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1312 (or (and (null arg) gnats::submitters)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1313 (setq gnats::submitters
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1314 (gnats::get-list-from-file
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1315 (if gnats:network-server
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1316 "sub"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1317 "submitters") "submitters"))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1318
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1319 (defun gnats::get-list (buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1320 (let (result)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1321 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1322 (set-buffer buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1323 (goto-char (point-min))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1324 (while (re-search-forward "^[^#:]+" nil t)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1325 (gnats::push (list (gnats::bm 0)) result)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1326 (reverse result)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1327
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1328 (defun gnats::parse-line ()
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1329 (let ((end (progn (end-of-line) (point)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1330 (p (match-beginning 0))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1331 l)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1332 (goto-char p)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1333 (while (search-forward ":" end 'move)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1334 (gnats::push (buffer-substring p (match-beginning 0)) l)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1335 (skip-chars-forward " " end)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1336 (setq p (point)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1337 (gnats::push (buffer-substring p end) l)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1338 (reverse l)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1339
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1340 (defun gnats::get-alist (buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1341 (let (result)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1342 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1343 (set-buffer buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1344 (goto-char (point-min))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1345 (while (re-search-forward "^[^#]" nil t)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1346 (gnats::push (gnats::parse-line) result)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1347 (reverse result)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1348
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1349 (defun gnats::get-list-from-file (filename desc)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1350 (let ((buf nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1351 (result nil))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1352 (message "Parsing the %s file..." desc)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1353 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1354 (let ((bn gnats:::backupname))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1355 (setq buf (get-buffer-create " *gnats-grok*"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1356 (set-buffer buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1357 (setq buffer-read-only nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1358 (erase-buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1359 (insert-file-contents
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1360 (if gnats:network-server
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1361 (concat bn "." filename)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1362 (format "%s/gnats-adm/%s" gnats:root filename)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1363 (setq result (gnats::get-alist buf))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1364 (kill-buffer buf))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1365 (message "Parsing the %s file...done." desc)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1366 result)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1367
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1368 (defun gnats::get-pr-category (number)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1369 "Return the category for the problem report NUMBER."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1370 (let ((buf nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1371 (result nil))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1372 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1373 (setq buf (get-buffer-create " *gnats-index*"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1374 (set-buffer buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1375 (setq buffer-read-only nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1376 (erase-buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1377 (insert-file-contents (format "%s/gnats-adm/index" gnats:root))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1378 (goto-char (point-min))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1379 (setq result
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1380 (catch 'res
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1381 (while (search-forward (format "/%s:" number) nil t)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1382 (beginning-of-line)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1383 (if (looking-at (format "\\([^/]+\\)/%s:" number))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1384 (throw 'res (gnats::bm 1))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1385 (end-of-line)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1386 nil))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1387 (kill-buffer buf))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1388 (or result (signal 'gnats::no-such-pr (list number)))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1389
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1390 (defsubst gnats::has-slash (string)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1391 (memq t (mapcar (function (lambda (char) (= char ?/))) string)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1392
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1393 (or (boundp 'view-hook) (setq view-hook nil))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1394
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1395 ;;;###autoload
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1396 (fset 'view-pr 'gnats:view-pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1397 ;;;###autoload
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1398 (defun gnats:view-pr (&optional id)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1399 "Visit the problem report named by the string ID. While viewing, press
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1400 'e' to edit the currently viewed PR."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1401 (interactive "sPR number: ")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1402 (let (pr category temp-name buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1403 (if (string= id "")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1404 (message "view-pr: must specify a PR")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1405 (if (or (gnats::has-slash id) gnats:network-server)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1406 (setq pr id)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1407 (and (setq category (gnats::get-pr-category id))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1408 (setq pr (format "%s/%s" category id))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1409 (let ((view-hook (default-value 'view-hook))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1410 buf func)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1411 (if (and pr
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1412 (or gnats:network-server
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1413 (setq buf (get-buffer pr))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1414 (file-exists-p (format "%s/%s" gnats:root pr))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1415 (if buf
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1416 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1417 (set-buffer buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1418 (goto-char (point-min))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1419 (view-buffer buf))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1420 (setq func
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1421 (function
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1422 (lambda ()
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1423 (and gnats::emacs-19p (rename-buffer pr))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1424 (setq mode-line-buffer-identification
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1425 (format "Viewing %s" pr))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1426 (make-local-variable 'gnats:::buffer-pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1427 (setq gnats:::buffer-pr pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1428 (use-local-map (copy-keymap (current-local-map)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1429 (local-set-key
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1430 "e"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1431 (function (lambda () (interactive)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1432 (gnats:edit-pr gnats:::buffer-pr)))))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1433 (if (fboundp 'add-hook)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1434 (add-hook 'view-hook func)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1435 (setq view-hook func))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1436 (if gnats:network-server
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1437 (gnats:net-view-pr id buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1438 (view-file (format "%s/%s" gnats:root pr))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1439 (signal 'gnats::no-such-pr (list id)))))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1440
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1441 (defun gnats:net-view-pr (id buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1442 "Use the network query to view problem report ID."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1443 (require 'view)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1444 (let ((result nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1445 (curr (current-buffer)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1446 (unwind-protect
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1447 (if (not buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1448 (progn
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1449 ;; XXX fix this to include the category
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1450 (setq buf (get-buffer-create (concat "*view-pr " id "*")))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1451 (setq buffer-read-only nil)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1452 (let ((command (append (list 'funcall)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1453 (list ''call-process)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1454 (list gnats:::nquery-pr nil buf nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1455 (list id "--full" "--host"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1456 gnats:network-server))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1457 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1458 (set-buffer buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1459 (erase-buffer))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1460 (let ((default-directory (gnats::find-safe-default-directory)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1461 (setq result (gnats::rw buf (eval command))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1462 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1463 (set-buffer buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1464 (and (/= 0 result)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1465 (goto-char (point-min))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1466 (cond
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1467 ((or (looking-at (concat gnats:::query-regexp " no PRs matched"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1468 (looking-at (concat gnats:::query-regexp " couldn.t find PR.*")))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1469 (signal 'gnats::no-such-pr nil))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1470 (t (signal 'gnats::error
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1471 (list (buffer-substring (point-min)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1472 (- (point-max) 1)))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1473 ))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1474 (switch-to-buffer buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1475 (if (fboundp 'view-mode-enter)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1476 (view-mode-enter curr 'kill-buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1477 (view-mode curr 'kill-buffer))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1478 (set-buffer-modified-p nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1479 (make-local-variable 'gnats:::buffer-pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1480 (if (not (gnats::has-slash id)) (gnats::rename-buffer))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1481 (setq buffer-read-only t)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1482 (setq buffer-undo-list nil) ;flush undo list
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1483 (goto-char (point-min)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1484 (zerop result)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1485
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1486 (fset 'change-gnats 'gnats:change-type)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1487 (fset 'gnats-change-type 'gnats:change-type)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1488 (defun gnats:change-type (type)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1489 "Change the GNATS database type in use."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1490 (interactive
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1491 (list
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1492 (progn
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1493 (if (not gnats:::types)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1494 (error "Value of gnats:::types has to be non-nil."))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1495 (let* ((completion-ignore-case t))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1496 (completing-read "Use GNATS database type: " gnats:::types nil t)))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1497 (let ((newlist (car (cdr (assoc type gnats:::types)))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1498 (setq gnats:root (car newlist)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1499 gnats:libdir (car (cdr newlist))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1500 gnats:::query-pr (car (cdr (cdr newlist)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1501 gnats:::nquery-pr (car (cdr (cdr (cdr newlist))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1502 gnats:::query-regexp (car (cdr (cdr (cdr (cdr newlist)))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1503 )
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1504 (gnats::reset-variables)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1505
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1506 (defun gnats::find-pr-buffer (pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1507 "*Find the buffer currently editing PR, returning the buffer or nil."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1508 (if (gnats::has-slash pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1509 ;; return the buffer if it exists
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1510 (get-buffer pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1511 (let (buflist buf
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1512 (name (concat "/" pr "$")))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1513 (setq buflist
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1514 (delq nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1515 (mapcar
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1516 (function (lambda (buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1517 (if (string-match name (buffer-name buf))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1518 buf)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1519 (buffer-list))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1520 ;; If we found one---and only one---then sanity-check some things
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1521 ;; about it before we try to use it.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1522 (if (eq (length buflist) 1)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1523 (progn
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1524 (setq buf (car buflist))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1525 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1526 (set-buffer buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1527 ;; We make sure that we have a value for the PR, it's in
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1528 ;; the right mode, and that the buffer's writable. If so,
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1529 ;; we'll return the buffer, otherwise the result of the if
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1530 ;; gets kicked back up to return nil.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1531 (if (and gnats:::buffer-pr
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1532 (eq major-mode 'gnats:gnats-mode)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1533 (eq buffer-read-only nil))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1534 buf)))))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1535
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1536 ;;;###autoload
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1537 (fset 'edit-pr 'gnats:edit-pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1538 ;;;###autoload
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1539 (defun gnats:edit-pr (&optional id)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1540 "Edit the problem report named by the string ID."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1541 (interactive "sPR number: ")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1542 (if (string= id "")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1543 (message "edit-pr: must specify a PR to edit")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1544 (let (pr category newfile
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1545 (buf (gnats::find-pr-buffer id)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1546 (if buf
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1547 (progn
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1548 (switch-to-buffer buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1549 (message "Already editing PR %s." id))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1550 (progn
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1551 (if (or (gnats::has-slash id) gnats:network-server)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1552 (setq pr id)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1553 (and (setq category (gnats::get-pr-category id))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1554 (setq pr (format "%s/%s" category id)))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1555 (if (and pr (or gnats:network-server
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1556 (file-exists-p (format "%s/%s" gnats:root pr))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1557 (progn
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1558 (setq newfile (if gnats:network-server
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1559 (gnats::make-temp-name)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1560 (format "%s/%s" gnats:root pr)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1561 (gnats::lock pr newfile))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1562 (signal 'gnats::no-such-pr (list id)))))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1563
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1564 (defvar gnats:query-pr-default-options nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1565 "*Default options to pass to query-pr.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1566 (defsubst gnats::query-pr-default-options ()
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1567 (or gnats:query-pr-default-options
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1568 (if (not gnats:network-server)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1569 (concat " --directory=" gnats:root " --print-path ")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1570 "")))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1571
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1572 ;;;###autoload
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1573 (fset 'query-pr 'gnats:query-pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1574 ;;;###autoload
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1575 (defun gnats:query-pr (options)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1576 "Run query-pr, with user-specified args, and collect output in a buffer.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1577 While query-pr runs asynchronously, you can use the \\[next-error] command
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1578 to find the text that the hits refer to."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1579 (interactive
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1580 (list (apply
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1581 'read-from-minibuffer "Run query-pr (with args): "
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1582 (if gnats::emacs-19p
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1583 (list (cons (gnats::query-pr-default-options) 1)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1584 nil nil 'gnats::query-pr-history)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1585 (list (gnats::query-pr-default-options) nil nil)))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1586 (require 'compile)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1587 (compile-internal (concat
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1588 (if gnats:network-server
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1589 (format (concat gnats:::nquery-pr " --host %s ")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1590 gnats:network-server)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1591 (concat gnats:::query-pr " "))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1592 options)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1593 "No more query-pr hits" (concat gnats:::query-pr " ")))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1594
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1595 (defun gnats::tr (string from to)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1596 (let ((s (copy-sequence string))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1597 (len (length string)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1598 (while (>= (setq len (1- len)) 0)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1599 (if (eq (aref s len) (string-to-char from))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1600 (aset s len (string-to-char to))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1601 s))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1602
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1603 ;; Redefine so that buffers with, say, g++/1234 embedded in them can be
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1604 ;; autosaved. This was mostly copied from the Emacs 19.19 version.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1605 (defun gnats::make-auto-save-file-name ()
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1606 "Return file name to use for auto-saves of current buffer.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1607 Does not consider `auto-save-visited-file-name' as that variable is checked
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1608 before calling this function. You can redefine this for customization.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1609 See also `auto-save-file-name-p'."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1610 ; Since the user may have his own make-auto-save-file-name, try not to
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1611 ; use our custom one unless we have to.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1612 (if (or (eq major-mode gnats::mode-name)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1613 ; Heuristic for noticing a mail buffer based on a PR
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1614 (string-match " PR .*/" (buffer-name)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1615 (if buffer-file-name
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1616 (concat (file-name-directory buffer-file-name)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1617 "#"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1618 (file-name-nondirectory buffer-file-name)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1619 "#")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1620 ;; For non-file bfr, use bfr name and Emacs pid.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1621 (expand-file-name (format "#%s#%s#"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1622 (gnats::tr (buffer-name) "/" ":")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1623 (make-temp-name ""))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1624 (gnats::real-make-auto-save-file-name)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1625
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1626 (if (not (fboundp 'gnats::real-make-auto-save-file-name))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1627 (progn (fset 'gnats::real-make-auto-save-file-name
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1628 (symbol-function 'make-auto-save-file-name))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1629 (fset 'make-auto-save-file-name 'gnats::make-auto-save-file-name)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1630
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1631 (defun gnats::make-temp-name ()
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1632 (make-temp-name
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1633 (concat (expand-file-name (file-name-as-directory gnats::tmpdir)) "gnats")))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1634
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1635 ;; Below this is the GNATS summary mode I've written. Not quite 100%
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1636 ;; integrated yet.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1637
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1638 ;; Temporary variables which are made buffer-local, but which the byte
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1639 ;; compiler complaints about if the defvars aren't here.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1640 (defvar gnats:::PRs nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1641 "List of problem reports to be summarized. This variable is buffer local.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1642 (make-variable-buffer-local 'gnats:::PRs)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1643 (defvar gnats::options nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1644 "Options used for nquery-pr in the current GNATS summary buffer.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1645 This variable is buffer local.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1646 (make-variable-buffer-local 'gnats::options)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1647
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1648 ;; Note: "release" stays out of this list. The "release" field is
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1649 ;; unrestricted; the customer could put any old junk in there, and
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1650 ;; often does.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1651 (defvar gnats:::limited-fields '(category confidential severity priority responsible state class customer-id)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1652 "PR fields for which the possible values are limited in range.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1653
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1654 (defvar gnats::summary-sort-function nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1655 "Holds a function used to filter and sort PRs before displaying a report.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1656 This filtering does not affect the stored PR information, so an invocation
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1657 of gnats:summary-redisplay after changing this variable will do the right thing.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1658
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1659 (defun gnats:::prompt-for-pr-number (default)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1660 (let ((val (read-input (if default
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1661 (format "PR number (default %d): " default)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1662 "PR number: "))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1663 (if (and default (string= val ""))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1664 default
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1665 (setq val (string-to-number val))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1666 (if (and (integerp val)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1667 (> val 0))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1668 val
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1669 (error "PR number must be a positive integer.")))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1670
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1671 (defun gnats:summary-edit (num)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1672 "Edit the PR referenced by the current text, or get a PR number from user.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1673 If a numeric prefix is given, it is used as the PR number.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1674 If a non-numeric prefix is given, or the text at (point) doesn't have the
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1675 gnats::pr-number property, the user is prompted for a PR number."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1676 (interactive (list
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1677 (let ((x (get-text-property (point) 'gnats::pr-number)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1678 (cond ((numberp current-prefix-arg) current-prefix-arg)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1679 (current-prefix-arg (gnats:::prompt-for-pr-number x))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1680 (x x)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1681 (t (gnats:::prompt-for-pr-number nil))))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1682 (message "Editing PR %d..." num)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1683 (gnats:edit-pr (number-to-string num)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1684
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1685 (defun gnats:summary-view (num)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1686 "View the PR referenced by the current text, or get a PR number from user.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1687 If a numeric prefix is given, it is used as the PR number.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1688 If a non-numeric prefix is given, or the text at (point) doesn't have the
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1689 gnats::pr-number property, the user is prompted for a PR number."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1690 (interactive (list
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1691 (let ((x (get-text-property (point) 'gnats::pr-number)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1692 (cond ((numberp current-prefix-arg) current-prefix-arg)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1693 (current-prefix-arg (gnats:::prompt-for-pr-number x))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1694 (x x)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1695 (t (gnats:::prompt-for-pr-number nil))))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1696 (message "Viewing PR %d..." num)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1697 (gnats:view-pr (number-to-string num)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1698
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1699 (defun gnats:summary-quit nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1700 "Quit GNATS summary mode."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1701 (interactive)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1702 (kill-buffer nil))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1703
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1704 (defun gnats:summary-revert nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1705 "Fetch PR data from server and rebuild the summary."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1706 (interactive)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1707 (gnats:summ-pr gnats::options))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1708
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1709 ;; Fetch field value from a PR.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1710 (defsubst gnats:::fieldval (pr field)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1711 (let ((x (assq field pr)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1712 (if x (cdr x) nil)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1713
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1714 ;; Taken from gnus-parse-simple-format in (ding)Gnus 0.88.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1715 ;; Extended to handle width-1 fields more efficiently.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1716 ;; Extended to permit "*" to flag truncation.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1717 ;; Modified to call kqpr* functions instead of gnus-*.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1718 (defun gnats:::parse-summary-format (format spec-alist)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1719 ;; This function parses the FORMAT string with the help of the
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1720 ;; SPEC-ALIST and returns a list that can be eval'ed to return the
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1721 ;; string. The list will consist of the symbol `format', a format
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1722 ;; specification string, and a list of forms depending on the
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1723 ;; SPEC-ALIST.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1724 (let ((max-width 0)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1725 spec flist fstring b newspec max-width elem beg trunc-noisy)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1726 (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1727 (set-buffer (get-buffer-create " *qpr work*"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1728 (erase-buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1729 (insert format)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1730 (goto-char (point-min))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1731 (while (re-search-forward "%-?[0-9]*\\([,*]-?[0-9]*\\)*\\(.\\)\\(.\\)?" nil t)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1732 (setq spec (string-to-char (buffer-substring (match-beginning 2)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1733 (match-end 2))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1734 ;; First check if there are any specs that look anything like
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1735 ;; "%12,12A", ie. with a "max width specification". These have
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1736 ;; to be treated specially.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1737 (if (setq beg (match-beginning 1))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1738 (setq max-width
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1739 (string-to-int
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1740 (buffer-substring (1+ (match-beginning 1)) (match-end 1)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1741 trunc-noisy (= ?* (char-after beg)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1742 (setq max-width 0)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1743 (setq beg (match-beginning 2))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1744 (setq trunc-noisy nil))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1745 ;; Find the specification from `spec-alist'.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1746 (if (not (setq elem (cdr (assq spec spec-alist))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1747 (setq elem '("*" ?s)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1748 ;; Treat user defined format specifiers specially
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1749 (and (eq (car elem) 'user-defined)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1750 (setq elem
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1751 (list
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1752 (list (intern (concat "gnats:user-format-function-"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1753 (buffer-substring
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1754 (match-beginning 3)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1755 (match-end 3))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1756 'pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1757 ?s))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1758 (delete-region (match-beginning 3) (match-end 3)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1759 (if (not (zerop max-width))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1760 (if (and (= max-width 1)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1761 (memq (car (cdr elem)) '(?c ?s)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1762 (let ((el (car elem)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1763 (cond ((= (car (cdr elem)) ?c)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1764 (setq newspec ?c)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1765 (setq flist (cons el flist)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1766 ((= (car (cdr elem)) ?s)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1767 (setq newspec ?c)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1768 (setq flist (cons (list 'string-to-char el) flist)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1769 (t
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1770 (error "eep!"))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1771 (let ((el (car elem)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1772 (cond ((= (car (cdr elem)) ?c)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1773 (setq el (list 'char-to-string el)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1774 ((= (car (cdr elem)) ?d)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1775 (numberp el) (setq el (list 'int-to-string el))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1776 (setq flist (cons (list 'gnats:::format-max-width
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1777 el max-width trunc-noisy)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1778 flist))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1779 (setq newspec ?s)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1780 (setq flist (cons (car elem) flist))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1781 (setq newspec (car (cdr elem))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1782 ;; Remove the old specification (and possibly a ",12" string).
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1783 (delete-region beg (match-end 2))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1784 ;; Insert the new specification.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1785 (goto-char beg)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1786 (insert newspec))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1787 (setq fstring (buffer-substring 1 (point-max)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1788 (kill-buffer nil))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1789 (cons 'format (cons fstring (nreverse flist)))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1790
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1791 ;; Try to keep this list similar to the command-line options for nquery-pr,
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1792 ;; just to avoid confusing people. If there are differences, it won't break
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1793 ;; anything.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1794 (defvar gnats::summary-format-alist
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1795 (list (list ?r '(symbol-name (gnats:::fieldval pr 'responsible)) ?s)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1796 (list ?c '(symbol-name (gnats:::fieldval pr 'category)) ?s)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1797 (list ?C '(symbol-name (gnats:::fieldval pr 'confidential)) ?s)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1798 (list ?e '(symbol-name (gnats:::fieldval pr 'severity)) ?s)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1799 (list ?O '(gnats:::fieldval pr 'originator) ?s)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1800 (list ?p '(symbol-name (gnats:::fieldval pr 'priority)) ?s)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1801 (list ?L '(symbol-name (gnats:::fieldval pr 'class)) ?s)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1802 (list ?S '(symbol-name (gnats:::fieldval pr 'customer-id)) ?s) ; == submitter
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1803 (list ?s '(symbol-name (gnats:::fieldval pr 'state)) ?s)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1804
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1805 (list ?n '(gnats:::fieldval pr 'number) ?d)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1806 (list ?R '(gnats:::fieldval pr 'release) ?s)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1807 (list ?j '(gnats:::fieldval pr 'synopsis) ?s)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1808 (list ?y '(gnats:::fieldval pr 'synopsis) ?s)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1809 (list ?u 'user-defined ?s)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1810 ))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1811
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1812 (defun gnats:::format-max-width (str len noisy)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1813 (if (> (length str) (if gnats::emacs-19p (abs len) len))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1814 (if noisy
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1815 (if (< len 0)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1816 (concat "*" (substring str (1+ len)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1817 (concat (substring str 0 (- len 1)) "*"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1818 (if (< len 0)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1819 (substring str len)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1820 (substring str 0 len)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1821 str))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1822
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1823 ;; Redisplay the summary in the current buffer.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1824 (defvar gnats::format-string
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1825 "%5n %-4,4c %,1e%,1p %-8,8r %,2s %-10*10S %-10*-10R %j\n"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1826 "Format string for PR summary text.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1827
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1828 If you've used format strings in (ding)Gnus, this will be familiar.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1829
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1830 Most text is copied straight through verbatim. Use \"%\" to indicate a
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1831 non-fixed field.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1832
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1833 It can be followed by a number, indicating minimum width, a separator character
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1834 (\",\" or \"*\"), and another number, indicating maximum width. These fields
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1835 are optional, except that the separator must be present if the maximum width is
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1836 specified. Whitespace padding will be on the left unless the first number is
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1837 negative. Truncation of the field will be done on the right, unless the second
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1838 number is negative. If the separator character is \"*\", a \"*\" will be used
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1839 to indicate that truncation has been done; otherwise, it will be done silently.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1840
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1841 After the \"%\" and optional width parameters, a letter is expected. Most of
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1842 the letters are chosen to match the command-line options of `nquery-pr'.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1843
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1844 %r \"Responsible\" field.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1845 %c \"Category\" field.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1846 %C \"Confidential\" field.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1847 %e \"Severity\" field.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1848 %O \"Originator\" field.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1849 %p \"Priority\" field.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1850 %L \"Class\" field.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1851 %S \"Customer-id\" (\"submitter\") field.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1852 %s \"State\" field.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1853 %n \"Number\" field.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1854 %R \"Release\" field.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1855 %j, %y \"Synopsis\" field. (\"j\" as in \"subJect\")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1856 %u Special: The next character is examined, and the function
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1857 gnats:user-format-function-<char> is invoked. One argument, the list
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1858 of (FIELD . VALUE) pairs, is passed.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1859
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1860 Any newlines you wish to have used must be included in this string; no
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1861 additional ones will be provided.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1862
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1863 If the value is not a string, it is assumed to be a function which can
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1864 be funcalled to return a format string, to be interpreted as above.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1865
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1866 (defun gnats:summary-redisplay nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1867 "Redisplay summary of stored GNATS data.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1868 This is useful if you change your filtering criteria or format string but
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1869 do not wish to update the GNATS data by contacting the server."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1870 (interactive)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1871 (let (prs
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1872 (buffer-read-only nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1873 format-form fmt)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1874 ;; Do this early, so if we're in the wrong buffer we blow up without
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1875 ;; trashing the user's data.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1876 (setq prs (if gnats::summary-sort-function
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1877 (funcall gnats::summary-sort-function
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1878 (apply 'list gnats:::PRs))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1879 gnats:::PRs))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1880 ;; No wrapping -- ick!
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1881 (if gnats::emacs-19p
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1882 (buffer-disable-undo)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1883 (buffer-flush-undo (current-buffer)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1884 (erase-buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1885 (setq fmt (if (stringp gnats::format-string)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1886 gnats::format-string
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1887 (funcall gnats::format-string)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1888 (setq format-form (gnats:::parse-summary-format fmt
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1889 gnats::summary-format-alist))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1890 (mapcar (function
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1891 (lambda (pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1892 (let ((start (point)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1893 (insert (eval format-form))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1894 ;; Magic.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1895 (put-text-property start (point) 'gnats::pr-number
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1896 (gnats:::fieldval pr 'number))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1897 )))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1898 prs)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1899 (goto-char (point-min))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1900 (buffer-enable-undo)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1901 (set-buffer-modified-p nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1902 ))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1903
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1904 (defvar gnats-summary-mode-map
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1905 (let ((map (copy-keymap text-mode-map)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1906 (if gnats::emacs-19p (suppress-keymap map))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1907 ;; basic mode stuff
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1908 (define-key map "g" 'gnats:summary-revert)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1909 (define-key map "q" 'gnats:summary-quit)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1910 (define-key map "r" 'gnats:summary-redisplay)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1911 ;; do stuff to PRs
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1912 (define-key map "e" 'gnats:summary-edit)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1913 (define-key map "v" 'gnats:summary-view)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1914 ;; navigation
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1915 (define-key map "n" 'next-line)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1916 (define-key map "p" 'previous-line)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1917 map)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1918 "Keymap for GNATS summary mode.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1919
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1920 (defun gnats-summary-mode nil
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1921 "Major mode for problem report summary.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1922
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1923 You can use \\[gnats:summary-view] to view the PR specified by the
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1924 current line, or \\[gnats:summary-edit] to edit it. Typing
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1925 \\[gnats:summary-revert] will update the PR list.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1926
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1927 Special commands:
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1928 \\{gnats-summary-mode-map}
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1929
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1930 Entering GNATS summary mode will invoke any hooks listed in the variable
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1931 gnats-summary-mode-hook. It will also use text-mode-hook, since the summary
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1932 mode is built on top of text mode."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1933 (interactive)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1934 (text-mode)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1935 ; (make-local-variable 'gnats:::PRs)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1936 ; (make-local-variable 'gnats::options)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1937 (setq buffer-read-only t)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1938 (setq truncate-lines t)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1939 (setq major-mode 'gnats-summary-mode)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1940 (setq mode-name "GNATS Summary")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1941 (use-local-map gnats-summary-mode-map)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1942 (run-hooks 'gnats-summary-mode-hook)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1943 )
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1944
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1945 ;;;###autoload
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1946 (fset 'summ-pr 'gnats:summ-pr)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1947 ;;;###autoload
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1948 (defun gnats:summ-pr (options)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1949 "Run query-pr, with user-specified args, and display a pretty summary.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1950 Well, display a summary, at least."
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1951 (interactive
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1952 (list
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1953 (if (not gnats::emacs-19p)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1954 (error "GNATS summary mode will only work with emacs 19.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1955 (apply
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1956 'read-from-minibuffer "Run query-pr (with args): "
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1957 (if gnats::emacs-19p
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1958 (list (cons (gnats::query-pr-default-options) 1)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1959 nil nil 'gnats::query-pr-history)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1960 (list (gnats::query-pr-default-options) nil nil))))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1961 (let ((buf (get-buffer-create "*gnats-summ-pr-temp*"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1962 (prs nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1963 pr fieldname value p)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1964 ; (save-excursion
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1965 (set-buffer buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1966 (if gnats::emacs-19p
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1967 (buffer-disable-undo)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1968 (buffer-flush-undo buf))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1969 (erase-buffer)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1970 ;; calling nquery-pr directly would be better, but I'd need a "split"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1971 ;; function of some sort to break apart the options string.
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1972 (message "Fetching GNATS data...")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1973 (call-process "sh" nil buf nil "-c"
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1974 (concat
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1975 (if gnats:network-server
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1976 (format (concat gnats:::nquery-pr " --host %s ")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1977 gnats:network-server)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1978 (concat gnats:::query-pr " "))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1979 options))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1980 ;; um, okay, how to i check for errors?
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1981 (goto-char (point-min))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1982 (setq pr nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1983 (while (looking-at "ld.so: warning:")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1984 (forward-line 1))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1985 (while (not (eobp))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1986 (while (looking-at ">\\([a-zA-Z-]+\\):")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1987 (setq fieldname (intern
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1988 (downcase
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1989 (buffer-substring (match-beginning 1)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1990 (match-end 1)))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1991 (goto-char (match-end 0))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1992 (while (looking-at "[ \t]")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1993 (forward-char 1))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1994 (setq p (point))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1995 (setq value (buffer-substring p (progn (end-of-line) (point))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1996 (cond ((eq fieldname 'number)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1997 (setq value (string-to-number value)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1998 ((memq fieldname gnats:::limited-fields)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
1999 (setq value (intern value))))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2000 (setq pr (cons (cons fieldname value) pr))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2001 (forward-char 1))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2002 (if (looking-at "\n")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2003 (progn
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2004 (setq prs (cons (nreverse pr) prs)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2005 pr nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2006 (forward-char 1)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2007 ;; could be the result of --print-path
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2008 (if (looking-at "/.*:0:$")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2009 (next-line 1))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2010 (if (looking-at gnats:::query-regexp)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2011 ;; error message
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2012 (progn
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2013 (goto-char (match-end 0))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2014 (while (looking-at "[ \t]")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2015 (forward-char 1))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2016 (setq p (point))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2017 (end-of-line)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2018 (setq value (buffer-substring p (point)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2019 (error "Database query failed: %s" value)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2020 )
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2021 (if pr
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2022 (setq prs (cons (nreverse pr) prs)))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2023 (setq prs (nreverse prs))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2024
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2025 ;; okay, now display it
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2026 (pop-to-buffer (get-buffer-create "*gnats:summ-pr*"))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2027 (gnats-summary-mode)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2028 (setq gnats:::PRs prs)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2029 (setq gnats::options options)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2030 (gnats:summary-redisplay)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2031 (message "Fetching GNATS data...done.")
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2032 ; )
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2033 (kill-buffer buf)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2034 ))
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2035
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents:
diff changeset
2036 ;;;; end of gnats.el