gccbug.in revision 96489
1#!/bin/sh
2# Submit a problem report to a GNATS site.
3# Copyright (C) 1993, 2000, 2001, 2002 Free Software Foundation, Inc.
4# Contributed by Brendan Kehoe (brendan@cygnus.com), based on a
5# version written by Heinz G. Seidl (hgs@cygnus.com).
6#
7# This file is part of GNU GNATS.
8#
9# GNU GNATS is free software; you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation; either version 2, or (at your option)
12# any later version.
13#
14# GNU GNATS is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with GNU GNATS; see the file COPYING.  If not, write to
21# the Free Software Foundation, 59 Temple Place - Suite 330,
22# Boston, MA 02111-1307, USA.
23
24# The version of this send-pr.
25VERSION=3.113
26
27# The submitter-id for your site.
28SUBMITTER=net
29
30# The default mail address for PR submissions. 
31GNATS_ADDR=gcc-gnats@gcc.gnu.org
32
33# The default release for this host.
34DEFAULT_RELEASE="@gcc_version_full@"
35
36# The default organization.
37DEFAULT_ORGANIZATION=
38
39# What mailer to use.  This must come after the config file, since it is
40# host-dependent.
41# Copied from cvsbug
42if [ -f /usr/sbin/sendmail ]; then  
43    MAIL_AGENT="/usr/sbin/sendmail -oi -t"
44else  
45    MAIL_AGENT="/usr/lib/sendmail -oi -t"
46fi
47MAILER=`echo $MAIL_AGENT | sed -e 's, .*,,'`
48if [ ! -f "$MAILER" ] ; then
49    echo "$COMMAND: Cannot file mail program \"$MAILER\"."
50    echo "$COMMAND: Please fix the MAIL_AGENT entry in the $COMMAND file."
51    exit 1
52fi
53
54
55# How to read the passwd database.
56PASSWD="cat /etc/passwd"
57
58ECHON=bsd
59
60if [ $ECHON = bsd ] ; then
61  ECHON1="echo -n"
62  ECHON2=
63elif [ $ECHON = sysv ] ; then
64  ECHON1=echo
65  ECHON2='\c'
66else
67  ECHON1=echo
68  ECHON2=
69fi
70
71#
72
73if [ -z "$TMPDIR" ]; then
74  TMPDIR=/tmp
75else
76  if [ "`echo $TMPDIR | grep '/$'`" != "" ]; then
77    TMPDIR="`echo $TMPDIR | sed -e 's,/$,,'`"
78  fi
79fi
80
81if [ @have_mktemp_command@ = yes ]; then
82	TEMP0=`mktemp $TMPDIR/poXXXXXX` || exit 1
83	TEMP=`mktemp $TMPDIR/pXXXXXX` || exit 1
84	BAD=`mktemp $TMPDIR/pbadXXXXXX` || exit 1
85	REF=`mktemp $TMPDIR/pfXXXXXX` || exit 1
86	REMOVE_TEMP="rm -f $TEMP0 $TEMP $BAD $REF"
87else
88	TEMPD=$TMPDIR/pd$$
89	TEMP0=$TEMPD/po$$
90	TEMP=$TEMPD/p$$
91	BAD=$TEMPD/pbad$$
92	REF=$TEMPD/pf$$
93	mkdir $TEMPD || exit 1
94	REMOVE_TEMP="rm -rf $TEMPD"
95fi
96
97# find a user name
98if [ "$LOGNAME" = "" ]; then
99	if [ "$USER" != "" ]; then
100		LOGNAME="$USER"
101	else
102		LOGNAME="UNKNOWN"
103	fi
104fi
105
106FROM="$LOGNAME"
107REPLY_TO="${REPLY_TO:-${REPLYTO:-$LOGNAME}}"
108
109# Find out the name of the originator of this PR.
110if [ -n "$NAME" ]; then
111  ORIGINATOR="$NAME"
112elif [ -f $HOME/.fullname ]; then
113  ORIGINATOR="`sed -e '1q' $HOME/.fullname`"
114else
115  # Must use temp file due to incompatibilities in quoting behavior
116  # and to protect shell metacharacters in the expansion of $LOGNAME
117  $PASSWD | grep "^$LOGNAME:" | awk -F: '{print $5}' | sed -e 's/,.*//' > $TEMP0
118  ORIGINATOR="`cat $TEMP0`"
119  rm -f $TEMP0
120fi
121
122if [ -n "$ORGANIZATION" ]; then
123  if [ -f "$ORGANIZATION" ]; then
124    ORGANIZATION="`cat $ORGANIZATION`"
125  fi
126else
127  if [ -n "$DEFAULT_ORGANIZATION" ]; then
128    ORGANIZATION="$DEFAULT_ORGANIZATION"
129  elif [ -f $HOME/.organization ]; then
130    ORGANIZATION="`cat $HOME/.organization`"
131  fi
132fi
133
134# If they don't have a preferred editor set, then use
135if [ -z "$VISUAL" ]; then
136  if [ -z "$EDITOR" ]; then
137    EDIT=vi
138  else
139    EDIT="$EDITOR"
140  fi
141else
142  EDIT="$VISUAL"
143fi
144
145# Find out some information.
146SYSTEM=`( [ -f /bin/uname ] && /bin/uname -a ) || \
147        ( [ -f /usr/bin/uname ] && /usr/bin/uname -a ) || echo ""`
148ARCH=`[ -f /bin/arch ] && /bin/arch`
149MACHINE=`[ -f /bin/machine ] && /bin/machine`
150
151COMMAND=`echo $0 | sed -e 's,.*/,,'`
152USAGE="Usage: $COMMAND [-PVL] [-t address] [-f filename] [-s severity]
153       [-c address] [--request-id] [--version]"
154REMOVE=
155BATCH=
156CC=
157SEVERITY_C=
158
159while [ $# -gt 0 ]; do
160  case "$1" in
161    -r) ;; 		# Ignore for backward compat.
162    -t | --to) if [ $# -eq 1 ]; then echo "$USAGE"; $REMOVE_TEMP; exit 1; fi
163	shift ; GNATS_ADDR="$1"
164	EXPLICIT_GNATS_ADDR=true
165        ;;
166    -f | --file) if [ $# -eq 1 ]; then echo "$USAGE"; $REMOVE_TEMP; exit 1; fi
167	shift ; IN_FILE="$1"
168	if [ "$IN_FILE" != "-" -a ! -r "$IN_FILE" ]; then
169	  echo "$COMMAND: cannot read $IN_FILE"
170	  $REMOVE_TEMP
171	  exit 1
172	fi
173	;;
174    -b | --batch) BATCH=true ;;
175    -c | --cc) if [ $# -eq 1 ]; then echo "$USAGE"; $REMOVE_TEMP; exit 1; fi
176	shift ; CC="$1"
177	;;
178    -s | --severity) if [ $# -eq 1 ]; then echo "$USAGE"; $REMOVE_TEMP; exit 1; fi
179	shift ; SEVERITY_C="$1"
180	;;
181    -p | -P | --print) PRINT=true ;;
182    -L | --list) FORMAT=norm ;;
183    -l | -CL | --lisp) FORMAT=lisp ;;
184    --request-id) REQUEST_ID=true ;;
185    -h | --help) echo "$USAGE"; $REMOVE_TEMP; exit 0 ;;
186    -V | --version) cat <<EOF
187gccbug (GCC) $DEFAULT_RELEASE
188Copyright (C) 2002 Free Software Foundation, Inc.
189This is free software; see the source for copying conditions.  There is NO
190warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
191
192EOF
193	$REMOVE_TEMP; exit 0 ;;
194    -*) echo "$USAGE" ; $REMOVE_TEMP; exit 1 ;;
195    *) echo "$USAGE" ; $REMOVE_TEMP; exit 1
196 esac
197 shift
198done
199
200# spam does not need to be listed here
201CATEGORIES="ada bootstrap c++ c debug fortran java libf2c libgcj libobjc libstdc++ middle-end objc optimization other preprocessor target web"
202
203case "$FORMAT" in
204  lisp) echo "$CATEGORIES" | \
205        awk 'BEGIN {printf "( "} {printf "(\"%s\") ",$0} END {printf ")\n"}'
206	$REMOVE_TEMP
207        exit 0
208        ;;
209  norm) l=`echo "$CATEGORIES" | \
210	awk 'BEGIN {max = 0; } { if (length($0) > max) { max = length($0); } }
211	     END {print max + 1;}'`
212	c=`expr 70 / $l`
213	if [ $c -eq 0 ]; then c=1; fi
214	echo "$CATEGORIES" | \
215        awk 'BEGIN {print "Known categories:"; i = 0 }
216          { printf ("%-'$l'.'$l's", $0); if ((++i % '$c') == 0) { print "" } }
217            END { print ""; }'
218	$REMOVE_TEMP
219        exit 0
220        ;;
221esac
222
223ORIGINATOR_C='<name of the PR author (one line)>'
224ORGANIZATION_C='<organization of PR author (multiple lines)>'
225SYNOPSIS_C='<synopsis of the problem (one line)>'
226if [ -z "$SEVERITY_C" ]; then
227  SEVERITY_C='<[ non-critical | serious | critical ] (one line)>'
228fi
229PRIORITY_C='<[ low | medium ] (one line)>'
230CATEGORY_C='<choose from the top of this file (one line)>'
231RELEASE_C='<release number or tag (one line)>'
232ENVIRONMENT_C='<machine, os, target, libraries (multiple lines)>'
233DESCRIPTION_C='<precise description of the problem (multiple lines)>'
234HOW_TO_REPEAT_C='<When reporting a compiler error, preprocessor output must be included>'
235FIX_C='<how to correct or work around the problem, if known (multiple lines)>'
236
237# Catch some signals. ($xs kludge needed by Sun /bin/sh)
238xs=0
239trap '$REMOVE_TEMP; exit $xs' 0
240trap 'echo "$COMMAND: Aborting ..."; $REMOVE_TEMP; xs=1; exit' 1 3 13 15
241
242# If they told us to use a specific file, then do so.
243if [ -n "$IN_FILE" ]; then
244  if [ "$IN_FILE" = "-" ]; then
245    # The PR is coming from the standard input.
246    if [ -n "$EXPLICIT_GNATS_ADDR" ]; then
247      sed -e "s;^[Tt][Oo]:.*;To: $GNATS_ADDR;" > $TEMP
248    else
249      cat > $TEMP
250    fi
251  else
252    # Use the file they named.
253    if [ -n "$EXPLICIT_GNATS_ADDR" ]; then
254      sed -e "s;^[Tt][Oo]:.*;To: $GNATS_ADDR;" $IN_FILE > $TEMP
255    else
256      cat $IN_FILE > $TEMP
257    fi
258  fi
259else
260
261  if [ -n "$PR_FORM" -a -z "$PRINT_INTERN" ]; then
262    # If their PR_FORM points to a bogus entry, then bail.
263    if [ ! -f "$PR_FORM" -o ! -r "$PR_FORM" -o ! -s "$PR_FORM" ]; then
264      echo "$COMMAND: can't seem to read your template file (\`$PR_FORM'), ignoring PR_FORM"
265      sleep 1
266      PRINT_INTERN=bad_prform
267    fi
268  fi
269
270  if [ -n "$PR_FORM" -a -z "$PRINT_INTERN" ]; then
271    cp $PR_FORM $TEMP || 
272      ( echo "$COMMAND: could not copy $PR_FORM" ; xs=1; exit )
273  else
274    for file in $TEMP $REF ; do
275      cat  > $file << '__EOF__'
276SEND-PR: -*- send-pr -*-
277SEND-PR: Lines starting with `SEND-PR' will be removed automatically, as
278SEND-PR: will all comments (text enclosed in `<' and `>').
279SEND-PR: 
280SEND-PR: Please consult the GCC manual if you are not sure how to
281SEND-PR: fill out a problem report.
282SEND-PR: Note that the Synopsis field is mandatory.  The Subject (for
283SEND-PR: the mail) will be made the same as Synopsis unless explicitly
284SEND-PR: changed.
285SEND-PR:
286SEND-PR: Choose from the following categories:
287SEND-PR:
288__EOF__
289
290      # Format the categories so they fit onto lines.
291	l=`echo "$CATEGORIES" | \
292	awk 'BEGIN {max = 0; } { if (length($0) > max) { max = length($0); } }
293	     END {print max + 1;}'`
294	c=`expr 61 / $l`
295	if [ $c -eq 0 ]; then c=1; fi
296	echo "$CATEGORIES" | \
297        awk 'BEGIN {printf "SEND-PR: "; i = 0 }
298          { printf ("%-'$l'.'$l's", $0);
299	    if ((++i % '$c') == 0) { printf "\nSEND-PR: " } }
300            END { printf "\nSEND-PR:\n"; }' >> $file
301
302      cat >> $file << __EOF__
303To: $GNATS_ADDR
304Subject: 
305From: $FROM
306Reply-To: $REPLYTO
307Cc: $CC
308X-send-pr-version: $VERSION
309X-GNATS-Notify: 
310
311
312>Submitter-Id:	$SUBMITTER
313>Originator:	$ORIGINATOR
314>Organization:	${ORGANIZATION-$ORGANIZATION_C}
315>Confidential:	no
316SEND-PR: Leave "Confidential" as "no"; all GCC PRs are public.
317>Synopsis:	$SYNOPSIS_C
318>Severity:	$SEVERITY_C
319SEND-PR: critical     GCC is completely not operational; no work-around known.
320SEND-PR: serious      GCC is not working properly; a work-around is possible.
321SEND-PR: non-critical Report indicates minor problem.
322>Priority:	$PRIORITY_C
323SEND-PR: medium       The problem should be solved in the next release.
324SEND-PR: low          The problem should be solve in a future release.
325>Category:	$CATEGORY_C
326>Class:		<[ doc-bug | accepts-illegal | rejects-legal | wrong-code | ice-on-legal-code| ice-on-illegal-code | pessimizes-code | sw-bug | change-request | support ] (one line)>
327SEND-PR: doc-bug          The documentation is incorrect.
328SEND-PR: accepts-illegal  GCC fails to reject erroneous code.
329SEND-PR: rejects-legal    GCC gives an error message for correct code.
330SEND-PR: wrong-code       The machine code generated by gcc is incorrect.
331SEND-PR: ice-on-legal-code   GCC gives an Internal Compiler Error (ICE)
332SEND-PR:                     for correct code
333SEND-PR: ice-on-illegal-code GCC gives an ICE instead of reporting an error
334SEND-PR: pessimizes-code     GCC misses an important optimization opportunity
335SEND-PR: sw-bug              Software bug of some other class than above
336SEND-PR: change-request      A feature in GCC is missing.
337SEND-PR: support             I need help with gcc.
338>Release:	${DEFAULT_RELEASE-$RELEASE_C}
339>Environment:
340`[ -n "$SYSTEM" ] && echo System: $SYSTEM`
341`[ -n "$ARCH" ] && echo Architecture: $ARCH`
342`[ -n "$MACHINE" ] && echo Machine: $MACHINE`
343	$ENVIRONMENT_C
344host: @host@
345build: @build@
346target: @target@
347configured with: @gcc_config_arguments@
348>Description:
349	$DESCRIPTION_C
350>How-To-Repeat:
351	$HOW_TO_REPEAT_C
352>Fix:
353	$FIX_C
354__EOF__
355    done
356  fi
357
358  if [ "$PRINT" = true -o "$PRINT_INTERN" = true ]; then
359    cat $TEMP
360    xs=0; exit
361  fi
362
363  chmod u+w $TEMP
364  if [ -z "$REQUEST_ID" ]; then
365    eval $EDIT $TEMP
366  else
367    ed -s $TEMP << '__EOF__'
368/^Subject/s/^Subject:.*/Subject: request for a customer id/
369/^>Category/s/^>Category:.*/>Category: send-pr/
370w
371q
372__EOF__
373  fi
374
375  if cmp -s $REF $TEMP ; then
376    echo "$COMMAND: problem report not filled out, therefore not sent"
377    xs=1; exit
378  fi
379fi
380
381#
382#	Check the enumeration fields
383
384# This is a "sed-subroutine" with one keyword parameter 
385# (with workaround for Sun sed bug)
386#
387SED_CMD='
388/$PATTERN/{
389s|||
390s|<.*>||
391s|^[ 	]*||
392s|[ 	]*$||
393p
394q
395}'
396
397
398while [ -z "$REQUEST_ID" ]; do
399  CNT=0
400
401  # 1) Confidential
402  #
403  PATTERN=">Confidential:"
404  CONFIDENTIAL=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
405  case "$CONFIDENTIAL" in
406    no) CNT=`expr $CNT + 1` ;;
407    *) echo "$COMMAND: \`$CONFIDENTIAL' is not a valid value for \`Confidential'." ;;
408  esac
409  #
410  # 2) Severity
411  #
412  PATTERN=">Severity:"
413  SEVERITY=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
414  case "$SEVERITY" in
415    ""|non-critical|serious|critical) CNT=`expr $CNT + 1` ;;
416    *)  echo "$COMMAND: \`$SEVERITY' is not a valid value for \`Severity'."
417  esac
418  #
419  # 3) Priority
420  #
421  PATTERN=">Priority:"
422  PRIORITY=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
423  case "$PRIORITY" in
424    ""|low|medium) CNT=`expr $CNT + 1` ;;
425    high) echo "$COMMAND: \`Priority: high' is reserved for GCC maintainers." ;;
426    *)  echo "$COMMAND: \`$PRIORITY' is not a valid value for \`Priority'."
427  esac
428  #
429  # 4) Category
430  #
431  PATTERN=">Category:"
432  CATEGORY=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
433  FOUND=
434  for C in $CATEGORIES
435  do
436    if [ "$C" = "$CATEGORY" ]; then FOUND=true ; break ; fi
437  done
438  if [ -n "$FOUND" ]; then
439    CNT=`expr $CNT + 1`	
440  else
441    if [ -z "$CATEGORY" ]; then
442      echo "$COMMAND: you must include a Category: field in your report."
443    else
444      echo "$COMMAND: \`$CATEGORY' is not a known category."
445    fi
446  fi
447  #
448  # 5) Class
449  #
450  PATTERN=">Class:"
451  CLASS=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
452  case "$CLASS" in
453    ""|doc-bug|accepts-illegal|rejects-legal|wrong-code|ice-on-legal-code|ice-on-illegal-code|pessimizes-code|sw-bug|change-request|support) CNT=`expr $CNT + 1` ;;
454    *)  echo "$COMMAND: \`$CLASS' is not a valid value for \`Class'."
455  esac
456  #
457  # 6) Check that synopsis is not empty
458  #
459  if grep "^>Synopsis:[ 	]*${SYNOPSIS_C}\$" $TEMP > /dev/null
460  then
461    echo "$COMMAND: Synopsis must not be empty."
462  else
463    CNT=`expr $CNT + 1`
464  fi
465
466  [ $CNT -lt 6 -a -z "$BATCH" ] && 
467    echo "Errors were found with the problem report."
468
469  while true; do
470    if [ -z "$BATCH" ]; then
471      $ECHON1 "a)bort, e)dit or s)end? $ECHON2"
472      read input
473    else
474      if [ $CNT -eq 6 ]; then
475        input=s
476      else
477        input=a
478      fi
479    fi
480    case "$input" in
481      a*)
482	if [ -z "$BATCH" ]; then
483	  echo "$COMMAND: the problem report remains in $BAD and is not sent."
484	  REMOVE_TEMP="rm -f $TEMP0 $TEMP $REF"
485	  mv $TEMP $BAD
486        else
487	  echo "$COMMAND: the problem report is not sent."
488	fi
489	xs=1; exit
490	;;
491      e*)
492        eval $EDIT $TEMP
493	continue 2
494	;;
495      s*)
496	break 2
497	;;
498    esac
499  done
500done
501
502#
503# Make sure the mail has got a Subject.  If not, use the same as
504# in Synopsis.
505#
506
507if grep '^Subject:[ 	]*$' $TEMP > /dev/null
508then
509  SYNOPSIS=`grep '^>Synopsis:' $TEMP | sed -e 's/^>Synopsis:[ 	]*//'`
510  ed -s $TEMP << __EOF__
511/^Subject:/s/:.*\$/: $SYNOPSIS/
512w
513q
514__EOF__
515fi
516
517#
518#	Remove comments and send the problem report
519#	(we have to use patterns, where the comment contains regex chars)
520#
521# /^>Originator:/s;$ORIGINATOR;;
522sed  -e "
523/^SEND-PR:/d
524/^>Organization:/,/^>[A-Za-z-]*:/s;$ORGANIZATION_C;;
525/^>Confidential:/s;<.*>;;
526/^>Synopsis:/s;$SYNOPSIS_C;;
527/^>Severity:/s;<.*>;;
528/^>Priority:/s;<.*>;;
529/^>Category:/s;$CATEGORY_C;;
530/^>Class:/s;<.*>;;
531/^>Release:/,/^>[A-Za-z-]*:/s;$RELEASE_C;;
532/^>Environment:/,/^>[A-Za-z-]*:/s;$ENVIRONMENT_C;;
533/^>Description:/,/^>[A-Za-z-]*:/s;$DESCRIPTION_C;;
534/^>How-To-Repeat:/,/^>[A-Za-z-]*:/s;$HOW_TO_REPEAT_C;;
535/^>Fix:/,/^>[A-Za-z-]*:/s;$FIX_C;;
536" $TEMP > $REF
537
538if $MAIL_AGENT < $REF; then
539  echo "$COMMAND: problem report sent"
540  xs=0; exit
541else
542  echo "$COMMAND: mysterious mail failure."
543  if [ -z "$BATCH" ]; then
544    echo "$COMMAND: the problem report remains in $BAD and is not sent."
545    REMOVE_TEMP="rm -f $TEMP0 $TEMP $REF"
546    mv $REF $BAD
547  else
548    echo "$COMMAND: the problem report is not sent."
549  fi
550  xs=1; exit
551fi
552