import cvs 2:1.12.13+real-5 (see mircvs://src/gnu/usr.bin/cvs/ for VCS history)
[alioth/cvs.git] / src / cvsbug.in
1 #! /bin/sh
2 # $MirOS: ports/devel/cvs/patches/patch-src_cvsbug_in,v 1.1 2010/09/15 20:57:00 tg Exp $
3 #
4 # Submit a problem report to a GNATS site.
5 # Copyright (C) 1993 Free Software Foundation, Inc.
6 # Contributed by Brendan Kehoe (brendan@cygnus.com), based on a
7 # version written by Heinz G. Seidl (hgs@ide.com).
8 #
9 # This file is part of GNU GNATS.
10 # Modified by Berliner for CVS.
11 #
12 # GNU GNATS is free software; you can redistribute it and/or modify
13 # it under the terms of the GNU General Public License as published by
14 # the Free Software Foundation; either version 2, or (at your option)
15 # any later version.
16 #
17 # GNU GNATS is distributed in the hope that it will be useful,
18 # but WITHOUT ANY WARRANTY; without even the implied warranty of
19 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 # GNU General Public License for more details.
21
22 # The version of this send-pr.
23 VERSION=3.2
24
25 # The submitter-id for your site.
26 SUBMITTER=net
27
28 ## # Where the GNATS directory lives, if at all.
29 ## [ -z "$GNATS_ROOT" ] && 
30 ## GNATS_ROOT=/usr/local/lib/gnats/gnats-db
31
32 # The default mail address for PR submissions. 
33 GNATS_ADDR=@PACKAGE_BUGREPORT@
34
35 ## # Where the gnats category tree lives.
36 ## DATADIR=/usr/local/lib
37
38 ## # If we've been moved around, try using GCC_EXEC_PREFIX.
39 ## [ ! -d $DATADIR/gnats -a -d "$GCC_EXEC_PREFIX" ] && DATADIR=${GCC_EXEC_PREFIX}..
40
41 # The default release for this host.
42 DEFAULT_RELEASE="@VERSION@"
43
44 # The default organization.
45 DEFAULT_ORGANIZATION="net"
46
47 ## # The default site to look for.
48 ## GNATS_SITE=unknown
49
50 ## # Newer config information?
51 ## [ -f ${GNATS_ROOT}/gnats-adm/config ] && . ${GNATS_ROOT}/gnats-adm/config
52
53 # Hack mktemp on systems that don't have it.
54 @MKTEMP_SH_FUNCTION@
55 MKTEMP="@MKTEMP@"
56
57 # What mailer to use.  This must come after the config file, since it is
58 # host-dependent.
59 SENDMAIL="@SENDMAIL@"
60 MAIL_AGENT="$SENDMAIL -oi -t"
61 MAILER=`echo $MAIL_AGENT | sed -e 's, .*,,'`
62 if [ ! -f "$MAILER" ] ; then
63         echo "$COMMAND: Cannot find mail program \"$MAILER\"."
64         echo "$COMMAND: Please fix the MAIL_AGENT entry in the $COMMAND file."
65         exit 1
66 fi
67
68 if test "`echo -n foo`" = foo ; then
69   ECHON=bsd
70 elif test "`echo 'foo\c'`" = foo ; then
71   ECHON=sysv
72 else
73   ECHON=none
74 fi
75
76 if [ $ECHON = bsd ] ; then
77   ECHON1="echo -n"
78   ECHON2=
79 elif [ $ECHON = sysv ] ; then
80   ECHON1=echo
81   ECHON2='\c'
82 else
83   ECHON1=echo
84   ECHON2=
85 fi
86
87 #\f
88
89 [ -z "$TMPDIR" ] && TMPDIR=/tmp
90
91 TEMP="`$MKTEMP $TMPDIR/p.XXXXXX`"
92 BAD="`$MKTEMP $TMPDIR/pbad.XXXXXX`"
93 REF="`$MKTEMP $TMPDIR/pf.XXXXXX`"
94
95 if [ -z "$LOGNAME" -a -n "$USER" ]; then
96   LOGNAME=$USER
97 fi
98
99 FROM="$LOGNAME"
100 REPLY_TO="$LOGNAME"
101
102 # Find out the name of the originator of this PR.
103 if [ -n "$NAME" ]; then
104   ORIGINATOR="$NAME"
105 elif [ -f $HOME/.fullname ]; then
106   ORIGINATOR="`sed -e '1q' $HOME/.fullname`"
107 elif [ -f /bin/domainname ]; then
108   if [ "`/bin/domainname`" != "" -a -f /usr/bin/ypcat ]; then
109     # Must use temp file due to incompatibilities in quoting behavior
110     # and to protect shell metacharacters in the expansion of $LOGNAME
111     /usr/bin/ypcat passwd 2>/dev/null | cat - /etc/passwd | grep "^$LOGNAME:" |
112       cut -f5 -d':' | sed -e 's/,.*//' > $TEMP
113     ORIGINATOR="`cat $TEMP`"
114     > $TEMP
115   fi
116 fi
117
118 if [ "$ORIGINATOR" = "" ]; then
119   grep "^$LOGNAME:" /etc/passwd | cut -f5 -d':' | sed -e 's/,.*//' > $TEMP
120   ORIGINATOR="`cat $TEMP`"
121   > $TEMP
122 fi
123
124 if [ -n "$ORGANIZATION" ]; then
125   if [ -f "$ORGANIZATION" ]; then
126     ORGANIZATION="`cat $ORGANIZATION`"
127   fi
128 else
129   if [ -n "$DEFAULT_ORGANIZATION" ]; then
130     ORGANIZATION="$DEFAULT_ORGANIZATION"
131   elif [ -f $HOME/.organization ]; then
132     ORGANIZATION="`cat $HOME/.organization`"
133   elif [ -f $HOME/.signature ]; then
134     ORGANIZATION="`cat $HOME/.signature`"
135   fi
136 fi
137
138 # If they don't have a preferred editor set, then use
139 if [ -z "$VISUAL" ]; then
140   if [ -z "$EDITOR" ]; then
141     EDIT=vi
142   else
143     EDIT="$EDITOR"
144   fi
145 else
146   EDIT="$VISUAL"
147 fi
148
149 # Find out some information.
150 SYSTEM=`( [ -f /bin/uname ] && /bin/uname -a ) || \
151         ( [ -f /usr/bin/uname ] && /usr/bin/uname -a ) || echo ""`
152 ARCH=`[ -f /bin/arch ] && /bin/arch`
153 MACHINE=`[ -f /bin/machine ] && /bin/machine`
154
155 COMMAND=`echo $0 | sed -e 's,.*/,,'`
156 ## USAGE="Usage: $COMMAND [-PVL] [-t address] [-f filename] [--request-id] 
157 USAGE="Usage: $COMMAND [-PVL]
158 [--version]"
159 REMOVE=
160 BATCH=
161
162 while [ $# -gt 0 ]; do
163   case "$1" in
164     -r) ;;              # Ignore for backward compat.
165 ##     -t | --to) if [ $# -eq 1 ]; then echo "$USAGE"; exit 1; fi
166 ##      shift ; GNATS_ADDR="$1"
167 ##      EXPLICIT_GNATS_ADDR=true
168 ##         ;;
169 ##     -f | --file) if [ $# -eq 1 ]; then echo "$USAGE"; exit 1; fi
170 ##      shift ; IN_FILE="$1"
171 ##      if [ "$IN_FILE" != "-" -a ! -r "$IN_FILE" ]; then
172 ##        echo "$COMMAND: cannot read $IN_FILE"
173 ##        exit 1
174 ##      fi
175 ##      ;;
176     -b | --batch) BATCH=true ;;
177     -p | -P | --print) PRINT=true ;;
178     -L | --list) FORMAT=norm ;;
179     -l | -CL | --lisp) FORMAT=lisp ;;
180 ##     --request-id) REQUEST_ID=true ;;
181     -h | --help) echo "$USAGE"; exit 0 ;;
182     -V | --version) echo "$VERSION"; exit 0 ;;
183     -*) echo "$USAGE" ; exit 1 ;;
184     *) echo "$USAGE" ; exit 1
185 ##        if [ -z "$USER_GNATS_SITE" ]; then
186 ##       if [ ! -r "$DATADIR/gnats/$1" ]; then
187 ##         echo "$COMMAND: the GNATS site $1 does not have a categories list."
188 ##         exit 1
189 ##       else
190 ##         # The site name is the alias they'll have to have created.
191 ##         USER_GNATS_SITE=$1
192 ##       fi
193 ##        else
194 ##       echo "$USAGE" ; exit 1
195 ##        fi
196        ;;
197  esac
198  shift
199 done
200
201 if [ -n "$USER_GNATS_SITE" ]; then
202   GNATS_SITE=$USER_GNATS_SITE
203   GNATS_ADDR=$USER_GNATS_SITE-gnats
204 fi
205
206 if [ "$SUBMITTER" = "unknown" -a -z "$REQUEST_ID" -a -z "$IN_FILE" ]; then
207   cat << '__EOF__'
208 It seems that send-pr is not installed with your unique submitter-id.
209 You need to run
210
211           install-sid YOUR-SID
212
213 where YOUR-SID is the identification code you received with `send-pr'.
214 `send-pr' will automatically insert this value into the template field
215 `>Submitter-Id'.  If you've downloaded `send-pr' from the Net, use `net'
216 for this value.  If you do not know your id, run `send-pr --request-id' to 
217 get one from your support site.
218 __EOF__
219   exit 1
220 fi
221
222 ## if [ -r "$DATADIR/gnats/$GNATS_SITE" ]; then
223 ##   CATEGORIES=`grep -v '^#' $DATADIR/gnats/$GNATS_SITE | sort`
224 ## else
225 ##   echo "$COMMAND: could not read $DATADIR/gnats/$GNATS_SITE for categories list."
226 ##   exit 1
227 ## fi
228 CATEGORIES="contrib cvs doc pcl-cvs portability"
229
230 if [ -z "$CATEGORIES" ]; then
231   echo "$COMMAND: the categories list for $GNATS_SITE was empty!"
232   exit 1
233 fi
234
235 case "$FORMAT" in
236   lisp) echo "$CATEGORIES" | \
237         awk 'BEGIN {printf "( "}
238              {printf "(\"%s\") ",$0}
239              END {printf ")\n"}'
240         exit 0
241         ;;
242   norm) l=`echo "$CATEGORIES" | \
243         awk 'BEGIN {max = 0; }
244              { if (length($0) > max) { max = length($0); } }
245              END {print max + 1;}'`
246         c=`expr 70 / $l`
247         if [ $c -eq 0 ]; then c=1; fi
248         echo "$CATEGORIES" | \
249         awk 'BEGIN {print "Known categories:"; i = 0 }
250           { printf ("%-'$l'.'$l's", $0); if ((++i % '$c') == 0) { print "" } }
251             END { print ""; }'
252         exit 0
253         ;;
254 esac
255
256 ORIGINATOR_C='<name of the PR author (one line)>'
257 ORGANIZATION_C='<organization of PR author (multiple lines)>'
258 CONFIDENTIAL_C='<[ yes | no ] (one line)>'
259 SYNOPSIS_C='<synopsis of the problem (one line)>'
260 SEVERITY_C='<[ non-critical | serious | critical ] (one line)>'
261 PRIORITY_C='<[ low | medium | high ] (one line)>'
262 CATEGORY_C='<name of the product (one line)>'
263 CLASS_C='<[ sw-bug | doc-bug | change-request | support ] (one line)>'
264 RELEASE_C='<release number or tag (one line)>'
265 ENVIRONMENT_C='<machine, os, target, libraries (multiple lines)>'
266 DESCRIPTION_C='<precise description of the problem (multiple lines)>'
267 HOW_TO_REPEAT_C='<code/input/activities to reproduce the problem (multiple lines)>'
268 FIX_C='<how to correct or work around the problem, if known (multiple lines)>'
269
270 # Catch some signals. ($xs kludge needed by Sun /bin/sh)
271 xs=0
272 trap 'rm -f $REF $TEMP; exit $xs' 0
273 trap 'echo "$COMMAND: Aborting ..."; rm -f $REF $TEMP; xs=1; exit' 1 2 3 13 15
274
275 # If they told us to use a specific file, then do so.
276 if [ -n "$IN_FILE" ]; then
277   if [ "$IN_FILE" = "-" ]; then
278     # The PR is coming from the standard input.
279     if [ -n "$EXPLICIT_GNATS_ADDR" ]; then
280       sed -e "s;^[Tt][Oo]:.*;To: $GNATS_ADDR;" > $TEMP
281     else
282       cat > $TEMP
283     fi
284   else
285     # Use the file they named.
286     if [ -n "$EXPLICIT_GNATS_ADDR" ]; then
287       sed -e "s;^[Tt][Oo]:.*;To: $GNATS_ADDR;" $IN_FILE > $TEMP
288     else
289       cat $IN_FILE > $TEMP
290     fi
291   fi
292 else
293
294   if [ -n "$PR_FORM" -a -z "$PRINT_INTERN" ]; then
295     # If their PR_FORM points to a bogus entry, then bail.
296     if [ ! -f "$PR_FORM" -o ! -r "$PR_FORM" -o ! -s "$PR_FORM" ]; then
297       echo "$COMMAND: can't seem to read your template file (\`$PR_FORM'), ignoring PR_FORM"
298       sleep 1
299       PRINT_INTERN=bad_prform
300     fi
301   fi
302
303   if [ -n "$PR_FORM" -a -z "$PRINT_INTERN" ]; then
304     cp $PR_FORM $TEMP || 
305       ( echo "$COMMAND: could not copy $PR_FORM" ; xs=1; exit )
306   else
307     for file in $TEMP $REF ; do
308       cat  > $file << '__EOF__'
309 SEND-PR: -*- send-pr -*-
310 SEND-PR: Lines starting with `SEND-PR' will be removed automatically, as
311 SEND-PR: will all comments (text enclosed in `<' and `>').
312 SEND-PR: 
313 SEND-PR: Choose from the following categories:
314 SEND-PR:
315 __EOF__
316
317       # Format the categories so they fit onto lines.
318         l=`echo "$CATEGORIES" | \
319         awk 'BEGIN {max = 0; }
320              { if (length($0) > max) { max = length($0); } }
321              END {print max + 1;}'`
322         c=`expr 61 / $l`
323         if [ $c -eq 0 ]; then c=1; fi
324         echo "$CATEGORIES" | \
325         awk 'BEGIN {printf "SEND-PR: "; i = 0 }
326           { printf ("%-'$l'.'$l's", $0);
327             if ((++i % '$c') == 0) { printf "\nSEND-PR: " } }
328             END { printf "\nSEND-PR:\n"; }' >> $file
329
330       cat >> $file << __EOF__
331 To: $GNATS_ADDR
332 Subject: 
333 From: $FROM
334 Reply-To: $REPLY_TO
335 X-send-pr-version: $VERSION
336
337
338 >Submitter-Id:   $SUBMITTER
339 >Originator:     $ORIGINATOR
340 >Organization:
341 ${ORGANIZATION-$ORGANIZATION_C}
342 >Confidential:  $CONFIDENTIAL_C
343 >Synopsis:      $SYNOPSIS_C
344 >Severity:      $SEVERITY_C
345 >Priority:      $PRIORITY_C
346 >Category:      $CATEGORY_C
347 >Class:         $CLASS_C
348 >Release:       ${DEFAULT_RELEASE-$RELEASE_C}
349 >Environment:
350         $ENVIRONMENT_C
351 `[ -n "$SYSTEM" ] && echo System: $SYSTEM`
352 `[ -n "$ARCH" ] && echo Architecture: $ARCH`
353 `[ -n "$MACHINE" ] && echo Machine: $MACHINE`
354 >Description:
355         $DESCRIPTION_C
356 >How-To-Repeat:
357         $HOW_TO_REPEAT_C
358 >Fix:
359         $FIX_C
360 __EOF__
361     done
362   fi
363
364   if [ "$PRINT" = true -o "$PRINT_INTERN" = true ]; then
365     cat $TEMP
366     xs=0; exit
367   fi
368
369   chmod u+w $TEMP
370   if [ -z "$REQUEST_ID" ]; then
371     eval $EDIT $TEMP
372   else
373     ed -s $TEMP << '__EOF__'
374 /^Subject/s/^Subject:.*/Subject: request for a customer id/
375 /^>Category/s/^>Category:.*/>Category: send-pr/
376 w
377 q
378 __EOF__
379   fi
380
381   if cmp -s $REF $TEMP ; then
382     echo "$COMMAND: problem report not filled out, therefore not sent"
383     xs=1; exit
384   fi
385 fi
386
387 #\f
388 #       Check the enumeration fields
389
390 # This is a "sed-subroutine" with one keyword parameter 
391 # (with workaround for Sun sed bug)
392 #
393 SED_CMD='
394 /$PATTERN/{
395 s|||
396 s|<.*>||
397 s|^[    ]*||
398 s|[     ]*$||
399 p
400 q
401 }'
402
403
404 while [ -z "$REQUEST_ID" ]; do
405   CNT=0
406
407   # 1) Confidential
408   #
409   PATTERN=">Confidential:"
410   CONFIDENTIAL=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
411   case "$CONFIDENTIAL" in
412     ""|yes|no) CNT=`expr $CNT + 1` ;;
413     *) echo "$COMMAND: \`$CONFIDENTIAL' is not a valid value for \`Confidential'." ;;
414   esac
415   #
416   # 2) Severity
417   #
418   PATTERN=">Severity:"
419   SEVERITY=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
420   case "$SEVERITY" in
421     ""|non-critical|serious|critical) CNT=`expr $CNT + 1` ;;
422     *)  echo "$COMMAND: \`$SEVERITY' is not a valid value for \`Severity'."
423   esac
424   #
425   # 3) Priority
426   #
427   PATTERN=">Priority:"
428   PRIORITY=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
429   case "$PRIORITY" in
430     ""|low|medium|high) CNT=`expr $CNT + 1` ;;
431     *)  echo "$COMMAND: \`$PRIORITY' is not a valid value for \`Priority'."
432   esac
433   #
434   # 4) Category
435   #
436   PATTERN=">Category:"
437   CATEGORY=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
438   FOUND=
439   for C in $CATEGORIES
440   do
441     if [ "$C" = "$CATEGORY" ]; then FOUND=true ; break ; fi
442   done
443   if [ -n "$FOUND" ]; then
444     CNT=`expr $CNT + 1` 
445   else
446     if [ -z "$CATEGORY" ]; then
447       echo "$COMMAND: you must include a Category: field in your report."
448     else
449       echo "$COMMAND: \`$CATEGORY' is not a known category."
450     fi
451   fi
452   #
453   # 5) Class
454   #
455   PATTERN=">Class:"
456   CLASS=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
457   case "$CLASS" in
458     ""|sw-bug|doc-bug|change-request|support) CNT=`expr $CNT + 1` ;;
459     *)  echo "$COMMAND: \`$CLASS' is not a valid value for \`Class'."
460   esac
461
462   [ $CNT -lt 5 -a -z "$BATCH" ] && 
463     echo "Errors were found with the problem report."
464
465   while true; do
466     if [ -z "$BATCH" ]; then
467       $ECHON1 "a)bort, e)dit or s)end? $ECHON2"
468       read input
469     else
470       if [ $CNT -eq 5 ]; then
471         input=s
472       else
473         input=a
474       fi
475     fi
476     case "$input" in
477       a*)
478         if [ -z "$BATCH" ]; then
479           echo "$COMMAND: the problem report remains in $BAD and is not sent."
480           mv $TEMP $BAD
481         else
482           echo "$COMMAND: the problem report is not sent."
483         fi
484         xs=1; exit
485         ;;
486       e*)
487         eval $EDIT $TEMP
488         continue 2
489         ;;
490       s*)
491         break 2
492         ;;
493     esac
494   done
495 done
496 #
497 #       Remove comments and send the problem report
498 #       (we have to use patterns, where the comment contains regex chars)
499 #
500 # /^>Originator:/s;$ORIGINATOR;;
501 sed  -e "
502 /^SEND-PR:/d
503 /^>Organization:/,/^>[A-Za-z-]*:/s;$ORGANIZATION_C;;
504 /^>Confidential:/s;<.*>;;
505 /^>Synopsis:/s;$SYNOPSIS_C;;
506 /^>Severity:/s;<.*>;;
507 /^>Priority:/s;<.*>;;
508 /^>Category:/s;$CATEGORY_C;;
509 /^>Class:/s;<.*>;;
510 /^>Release:/,/^>[A-Za-z-]*:/s;$RELEASE_C;;
511 /^>Environment:/,/^>[A-Za-z-]*:/s;$ENVIRONMENT_C;;
512 /^>Description:/,/^>[A-Za-z-]*:/s;$DESCRIPTION_C;;
513 /^>How-To-Repeat:/,/^>[A-Za-z-]*:/s;$HOW_TO_REPEAT_C;;
514 /^>Fix:/,/^>[A-Za-z-]*:/s;$FIX_C;;
515 " $TEMP > $REF
516
517 if $MAIL_AGENT < $REF; then
518   echo "$COMMAND: problem report sent"
519   xs=0; exit
520 else
521   echo "$COMMAND: mysterious mail failure."
522   if [ -z "$BATCH" ]; then
523     echo "$COMMAND: the problem report remains in $BAD and is not sent."
524     mv $REF $BAD
525   else
526     echo "$COMMAND: the problem report is not sent."
527   fi
528   xs=1; exit
529 fi