home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / cvs-1.8.7-src.tgz / tar.out / fsf / cvs / src / cvsbug.sh < prev    next >
Linux/UNIX/POSIX Shell Script  |  1996-09-28  |  14KB  |  529 lines

  1. #! /bin/sh
  2. # Submit a problem report to a GNATS site.
  3. # Copyright (C) 1993 Free Software Foundation, Inc.
  4. # Contributed by Brendan Kehoe (brendan@cygnus.com), based on a
  5. # version written by Heinz G. Seidl (hgs@ide.com).
  6. #
  7. # This file is part of GNU GNATS.
  8. # Modified by Berliner for CVS.
  9. #
  10. #ident    "@(#)cvs/src:$Name:  $:$Id: cvsbug.sh,v 1.10 1995/11/15 00:18:00 woods Exp $"
  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. # You should have received a copy of the GNU General Public License
  23. # along with GNU GNATS; see the file COPYING.  If not, write to
  24. # the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  25.  
  26. # The version of this send-pr.
  27. VERSION=3.2
  28.  
  29. # The submitter-id for your site.
  30. SUBMITTER=net
  31.  
  32. ## # Where the GNATS directory lives, if at all.
  33. ## [ -z "$GNATS_ROOT" ] && 
  34. ## GNATS_ROOT=/usr/local/lib/gnats/gnats-db
  35.  
  36. # The default mail address for PR submissions. 
  37. GNATS_ADDR=bug-cvs@prep.ai.mit.edu
  38.  
  39. ## # Where the gnats category tree lives.
  40. ## DATADIR=/usr/local/lib
  41.  
  42. ## # If we've been moved around, try using GCC_EXEC_PREFIX.
  43. ## [ ! -d $DATADIR/gnats -a -d "$GCC_EXEC_PREFIX" ] && DATADIR=${GCC_EXEC_PREFIX}..
  44.  
  45. # The default release for this host.
  46. DEFAULT_RELEASE="xVERSIONx"
  47.  
  48. # The default organization.
  49. DEFAULT_ORGANIZATION="net"
  50.  
  51. ## # The default site to look for.
  52. ## GNATS_SITE=unknown
  53.  
  54. ## # Newer config information?
  55. ## [ -f ${GNATS_ROOT}/gnats-adm/config ] && . ${GNATS_ROOT}/gnats-adm/config
  56.  
  57. # What mailer to use.  This must come after the config file, since it is
  58. # host-dependent.
  59. if [ -f /usr/sbin/sendmail ]; then
  60.   MAIL_AGENT="/usr/sbin/sendmail -oi -t"
  61. else
  62.   MAIL_AGENT="/usr/lib/sendmail -oi -t"
  63. fi
  64. MAILER=`echo $MAIL_AGENT | sed -e 's, .*,,'`
  65. if [ ! -f "$MAILER" ] ; then
  66.     echo "$COMMAND: Cannot file mail program \"$MAILER\"."
  67.     echo "$COMMAND: Please fix the MAIL_AGENT entry in the $COMMAND file."
  68.     exit 1
  69. fi
  70.  
  71. if test "`echo -n foo`" = foo ; then
  72.   ECHON=bsd
  73. elif test "`echo 'foo\c'`" = foo ; then
  74.   ECHON=sysv
  75. else
  76.   ECHON=none
  77. fi
  78.  
  79. if [ $ECHON = bsd ] ; then
  80.   ECHON1="echo -n"
  81.   ECHON2=
  82. elif [ $ECHON = sysv ] ; then
  83.   ECHON1=echo
  84.   ECHON2='\c'
  85. else
  86.   ECHON1=echo
  87.   ECHON2=
  88. fi
  89.  
  90. #
  91.  
  92. [ -z "$TMPDIR" ] && TMPDIR=/tmp
  93.  
  94. TEMP=$TMPDIR/p$$
  95. BAD=$TMPDIR/pbad$$
  96. REF=$TMPDIR/pf$$
  97.  
  98. if [ -z "$LOGNAME" -a -n "$USER" ]; then
  99.   LOGNAME=$USER
  100. fi
  101.  
  102. FROM="$LOGNAME"
  103. REPLY_TO="$LOGNAME"
  104.  
  105. # Find out the name of the originator of this PR.
  106. if [ -n "$NAME" ]; then
  107.   ORIGINATOR="$NAME"
  108. elif [ -f $HOME/.fullname ]; then
  109.   ORIGINATOR="`sed -e '1q' $HOME/.fullname`"
  110. elif [ -f /bin/domainname ]; then
  111.   if [ "`/bin/domainname`" != "" -a -f /usr/bin/ypcat ]; then
  112.     # Must use temp file due to incompatibilities in quoting behavior
  113.     # and to protect shell metacharacters in the expansion of $LOGNAME
  114.     /usr/bin/ypcat passwd 2>/dev/null | cat - /etc/passwd | grep "^$LOGNAME:" |
  115.       cut -f5 -d':' | sed -e 's/,.*//' > $TEMP
  116.     ORIGINATOR="`cat $TEMP`"
  117.     rm -f $TEMP
  118.   fi
  119. fi
  120.  
  121. if [ "$ORIGINATOR" = "" ]; then
  122.   grep "^$LOGNAME:" /etc/passwd | cut -f5 -d':' | sed -e 's/,.*//' > $TEMP
  123.   ORIGINATOR="`cat $TEMP`"
  124.   rm -f $TEMP
  125. fi
  126.  
  127. if [ -n "$ORGANIZATION" ]; then
  128.   if [ -f "$ORGANIZATION" ]; then
  129.     ORGANIZATION="`cat $ORGANIZATION`"
  130.   fi
  131. else
  132.   if [ -n "$DEFAULT_ORGANIZATION" ]; then
  133.     ORGANIZATION="$DEFAULT_ORGANIZATION"
  134.   elif [ -f $HOME/.organization ]; then
  135.     ORGANIZATION="`cat $HOME/.organization`"
  136.   elif [ -f $HOME/.signature ]; then
  137.     ORGANIZATION="`cat $HOME/.signature`"
  138.   fi
  139. fi
  140.  
  141. # If they don't have a preferred editor set, then use
  142. if [ -z "$VISUAL" ]; then
  143.   if [ -z "$EDITOR" ]; then
  144.     EDIT=vi
  145.   else
  146.     EDIT="$EDITOR"
  147.   fi
  148. else
  149.   EDIT="$VISUAL"
  150. fi
  151.  
  152. # Find out some information.
  153. SYSTEM=`( [ -f /bin/uname ] && /bin/uname -a ) || \
  154.         ( [ -f /usr/bin/uname ] && /usr/bin/uname -a ) || echo ""`
  155. ARCH=`[ -f /bin/arch ] && /bin/arch`
  156. MACHINE=`[ -f /bin/machine ] && /bin/machine`
  157.  
  158. COMMAND=`echo $0 | sed -e 's,.*/,,'`
  159. ## USAGE="Usage: $COMMAND [-PVL] [-t address] [-f filename] [--request-id] 
  160. USAGE="Usage: $COMMAND [-PVL]
  161. [--version]"
  162. REMOVE=
  163. BATCH=
  164.  
  165. while [ $# -gt 0 ]; do
  166.   case "$1" in
  167.     -r) ;;         # Ignore for backward compat.
  168. ##     -t | --to) if [ $# -eq 1 ]; then echo "$USAGE"; exit 1; fi
  169. ##     shift ; GNATS_ADDR="$1"
  170. ##     EXPLICIT_GNATS_ADDR=true
  171. ##         ;;
  172. ##     -f | --file) if [ $# -eq 1 ]; then echo "$USAGE"; exit 1; fi
  173. ##     shift ; IN_FILE="$1"
  174. ##     if [ "$IN_FILE" != "-" -a ! -r "$IN_FILE" ]; then
  175. ##       echo "$COMMAND: cannot read $IN_FILE"
  176. ##       exit 1
  177. ##     fi
  178. ##     ;;
  179.     -b | --batch) BATCH=true ;;
  180.     -p | -P | --print) PRINT=true ;;
  181.     -L | --list) FORMAT=norm ;;
  182.     -l | -CL | --lisp) FORMAT=lisp ;;
  183. ##     --request-id) REQUEST_ID=true ;;
  184.     -h | --help) echo "$USAGE"; exit 0 ;;
  185.     -V | --version) echo "$VERSION"; exit 0 ;;
  186.     -*) echo "$USAGE" ; exit 1 ;;
  187.     *) echo "$USAGE" ; exit 1
  188. ##        if [ -z "$USER_GNATS_SITE" ]; then
  189. ##      if [ ! -r "$DATADIR/gnats/$1" ]; then
  190. ##        echo "$COMMAND: the GNATS site $1 does not have a categories list."
  191. ##        exit 1
  192. ##      else
  193. ##        # The site name is the alias they'll have to have created.
  194. ##        USER_GNATS_SITE=$1
  195. ##      fi
  196. ##        else
  197. ##      echo "$USAGE" ; exit 1
  198. ##        fi
  199.        ;;
  200.  esac
  201.  shift
  202. done
  203.  
  204. if [ -n "$USER_GNATS_SITE" ]; then
  205.   GNATS_SITE=$USER_GNATS_SITE
  206.   GNATS_ADDR=$USER_GNATS_SITE-gnats
  207. fi
  208.  
  209. if [ "$SUBMITTER" = "unknown" -a -z "$REQUEST_ID" -a -z "$IN_FILE" ]; then
  210.   cat << '__EOF__'
  211. It seems that send-pr is not installed with your unique submitter-id.
  212. You need to run
  213.  
  214.           install-sid YOUR-SID
  215.  
  216. where YOUR-SID is the identification code you received with `send-pr'.
  217. `send-pr' will automatically insert this value into the template field
  218. `>Submitter-Id'.  If you've downloaded `send-pr' from the Net, use `net'
  219. for this value.  If you do not know your id, run `send-pr --request-id' to 
  220. get one from your support site.
  221. __EOF__
  222.   exit 1
  223. fi
  224.  
  225. ## if [ -r "$DATADIR/gnats/$GNATS_SITE" ]; then
  226. ##   CATEGORIES=`grep -v '^#' $DATADIR/gnats/$GNATS_SITE | sort`
  227. ## else
  228. ##   echo "$COMMAND: could not read $DATADIR/gnats/$GNATS_SITE for categories list."
  229. ##   exit 1
  230. ## fi
  231. CATEGORIES="contrib cvs doc pcl-cvs portability"
  232.  
  233. if [ -z "$CATEGORIES" ]; then
  234.   echo "$COMMAND: the categories list for $GNATS_SITE was empty!"
  235.   exit 1
  236. fi
  237.  
  238. case "$FORMAT" in
  239.   lisp) echo "$CATEGORIES" | \
  240.         awk 'BEGIN {printf "( "} {printf "(\"%s\") ",$0} END {printf ")\n"}'
  241.         exit 0
  242.         ;;
  243.   norm) l=`echo "$CATEGORIES" | \
  244.     awk 'BEGIN {max = 0; } { 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; } { if (length($0) > max) { max = length($0); } }
  320.          END {print max + 1;}'`
  321.     c=`expr 61 / $l`
  322.     if [ $c -eq 0 ]; then c=1; fi
  323.     echo "$CATEGORIES" | \
  324.         awk 'BEGIN {printf "SEND-PR: "; i = 0 }
  325.           { printf ("%-'$l'.'$l's", $0);
  326.         if ((++i % '$c') == 0) { printf "\nSEND-PR: " } }
  327.             END { printf "\nSEND-PR:\n"; }' >> $file
  328.  
  329.       cat >> $file << __EOF__
  330. To: $GNATS_ADDR
  331. Subject: 
  332. From: $FROM
  333. Reply-To: $REPLY_TO
  334. X-send-pr-version: $VERSION
  335.  
  336.  
  337. >Submitter-Id:   $SUBMITTER
  338. >Originator:      $ORIGINATOR
  339. >Organization:
  340. ${ORGANIZATION-$ORGANIZATION_C}
  341. >Confidential:  $CONFIDENTIAL_C
  342. >Synopsis:    $SYNOPSIS_C
  343. >Severity:    $SEVERITY_C
  344. >Priority:    $PRIORITY_C
  345. >Category:     $CATEGORY_C
  346. >Class:        $CLASS_C
  347. >Release:    ${DEFAULT_RELEASE-$RELEASE_C}
  348. >Environment:
  349.         $ENVIRONMENT_C
  350. `[ -n "$SYSTEM" ] && echo System: $SYSTEM`
  351. `[ -n "$ARCH" ] && echo Architecture: $ARCH`
  352. `[ -n "$MACHINE" ] && echo Machine: $MACHINE`
  353. >Description:
  354.     $DESCRIPTION_C
  355. >How-To-Repeat:
  356.     $HOW_TO_REPEAT_C
  357. >Fix:
  358.     $FIX_C
  359. __EOF__
  360.     done
  361.   fi
  362.  
  363.   if [ "$PRINT" = true -o "$PRINT_INTERN" = true ]; then
  364.     cat $TEMP
  365.     xs=0; exit
  366.   fi
  367.  
  368.   chmod u+w $TEMP
  369.   if [ -z "$REQUEST_ID" ]; then
  370.     eval $EDIT $TEMP
  371.   else
  372.     ed -s $TEMP << '__EOF__'
  373. /^Subject/s/^Subject:.*/Subject: request for a customer id/
  374. /^>Category/s/^>Category:.*/>Category: send-pr/
  375. w
  376. q
  377. __EOF__
  378.   fi
  379.  
  380.   if cmp -s $REF $TEMP ; then
  381.     echo "$COMMAND: problem report not filled out, therefore not sent"
  382.     xs=1; exit
  383.   fi
  384. fi
  385.  
  386. #
  387. #    Check the enumeration fields
  388.  
  389. # This is a "sed-subroutine" with one keyword parameter 
  390. # (with workaround for Sun sed bug)
  391. #
  392. SED_CMD='
  393. /$PATTERN/{
  394. s|||
  395. s|<.*>||
  396. s|^[     ]*||
  397. s|[     ]*$||
  398. p
  399. q
  400. }'
  401.  
  402.  
  403. while [ -z "$REQUEST_ID" ]; do
  404.   CNT=0
  405.  
  406.   # 1) Confidential
  407.   #
  408.   PATTERN=">Confidential:"
  409.   CONFIDENTIAL=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
  410.   case "$CONFIDENTIAL" in
  411.     ""|yes|no) CNT=`expr $CNT + 1` ;;
  412.     *) echo "$COMMAND: \`$CONFIDENTIAL' is not a valid value for \`Confidential'." ;;
  413.   esac
  414.   #
  415.   # 2) Severity
  416.   #
  417.   PATTERN=">Severity:"
  418.   SEVERITY=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
  419.   case "$SEVERITY" in
  420.     ""|non-critical|serious|critical) CNT=`expr $CNT + 1` ;;
  421.     *)  echo "$COMMAND: \`$SEVERITY' is not a valid value for \`Severity'."
  422.   esac
  423.   #
  424.   # 3) Priority
  425.   #
  426.   PATTERN=">Priority:"
  427.   PRIORITY=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
  428.   case "$PRIORITY" in
  429.     ""|low|medium|high) CNT=`expr $CNT + 1` ;;
  430.     *)  echo "$COMMAND: \`$PRIORITY' is not a valid value for \`Priority'."
  431.   esac
  432.   #
  433.   # 4) Category
  434.   #
  435.   PATTERN=">Category:"
  436.   CATEGORY=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
  437.   FOUND=
  438.   for C in $CATEGORIES
  439.   do
  440.     if [ "$C" = "$CATEGORY" ]; then FOUND=true ; break ; fi
  441.   done
  442.   if [ -n "$FOUND" ]; then
  443.     CNT=`expr $CNT + 1`    
  444.   else
  445.     if [ -z "$CATEGORY" ]; then
  446.       echo "$COMMAND: you must include a Category: field in your report."
  447.     else
  448.       echo "$COMMAND: \`$CATEGORY' is not a known category."
  449.     fi
  450.   fi
  451.   #
  452.   # 5) Class
  453.   #
  454.   PATTERN=">Class:"
  455.   CLASS=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
  456.   case "$CLASS" in
  457.     ""|sw-bug|doc-bug|change-request|support) CNT=`expr $CNT + 1` ;;
  458.     *)  echo "$COMMAND: \`$CLASS' is not a valid value for \`Class'."
  459.   esac
  460.  
  461.   [ $CNT -lt 5 -a -z "$BATCH" ] && 
  462.     echo "Errors were found with the problem report."
  463.  
  464.   while true; do
  465.     if [ -z "$BATCH" ]; then
  466.       $ECHON1 "a)bort, e)dit or s)end? $ECHON2"
  467.       read input
  468.     else
  469.       if [ $CNT -eq 5 ]; then
  470.         input=s
  471.       else
  472.         input=a
  473.       fi
  474.     fi
  475.     case "$input" in
  476.       a*)
  477.     if [ -z "$BATCH" ]; then
  478.       echo "$COMMAND: the problem report remains in $BAD and is not sent."
  479.       mv $TEMP $BAD
  480.         else
  481.       echo "$COMMAND: the problem report is not sent."
  482.     fi
  483.     xs=1; exit
  484.     ;;
  485.       e*)
  486.         eval $EDIT $TEMP
  487.     continue 2
  488.     ;;
  489.       s*)
  490.     break 2
  491.     ;;
  492.     esac
  493.   done
  494. done
  495. #
  496. #    Remove comments and send the problem report
  497. #    (we have to use patterns, where the comment contains regex chars)
  498. #
  499. # /^>Originator:/s;$ORIGINATOR;;
  500. sed  -e "
  501. /^SEND-PR:/d
  502. /^>Organization:/,/^>[A-Za-z-]*:/s;$ORGANIZATION_C;;
  503. /^>Confidential:/s;<.*>;;
  504. /^>Synopsis:/s;$SYNOPSIS_C;;
  505. /^>Severity:/s;<.*>;;
  506. /^>Priority:/s;<.*>;;
  507. /^>Category:/s;$CATEGORY_C;;
  508. /^>Class:/s;<.*>;;
  509. /^>Release:/,/^>[A-Za-z-]*:/s;$RELEASE_C;;
  510. /^>Environment:/,/^>[A-Za-z-]*:/s;$ENVIRONMENT_C;;
  511. /^>Description:/,/^>[A-Za-z-]*:/s;$DESCRIPTION_C;;
  512. /^>How-To-Repeat:/,/^>[A-Za-z-]*:/s;$HOW_TO_REPEAT_C;;
  513. /^>Fix:/,/^>[A-Za-z-]*:/s;$FIX_C;;
  514. " $TEMP > $REF
  515.  
  516. if $MAIL_AGENT < $REF; then
  517.   echo "$COMMAND: problem report sent"
  518.   xs=0; exit
  519. else
  520.   echo "$COMMAND: mysterious mail failure."
  521.   if [ -z "$BATCH" ]; then
  522.     echo "$COMMAND: the problem report remains in $BAD and is not sent."
  523.     mv $REF $BAD
  524.   else
  525.     echo "$COMMAND: the problem report is not sent."
  526.   fi
  527.   xs=1; exit
  528. fi
  529.