--- gnats/edit-pr.sh.orig Sun May 26 16:32:02 2002 +++ gnats/edit-pr.sh Sat Dec 6 02:43:44 2003 @@ -5,6 +5,8 @@ # Contributed by Jeffrey Osier (jeffrey@cygnus.com). # Majorly revised by Bob Manson (manson@juniper.net). # Further improvements by Dirk Bergstrom (dirk@juniper.net). +# Patches for the FreeBSD Project by Ceri Davies (ceri@FreeBSD.org), +# based on work by Paul Richards (paul@FreeBSD.org). # # This file is part of GNU GNATS. # @@ -24,9 +26,12 @@ debug_print=false # or echo to get output. BINDIR=xBINDIRx +DATE=`LC_TIME=C date` # Some prstats tools rely on this format +GNATS_ROOT=${GNATS_ROOT:-/usr/local/share/gnats/gnats-db}; export GNATS_ROOT LIBEXECDIR=xLIBEXECDIRx GNATS_PORT= locked= +rc=0 version=xVERSIONx usage=" @@ -99,28 +104,23 @@ *) if [ "`echo $1 | grep /`" != "" ]; then - pr_id=`echo $1 | awk -F"/" '{print $2}' -` + pr=`echo $1 | awk -F"/" '{print $2}' -` else - pr_id=$1 + pr=$1 fi + prs="$prs $pr" ;; esac shift done +chng_tpl="${GNATS_ROOT}/gnats-adm/edit-pr-msg" + # set command here to always pass host and port, and directory if supplied QUERY_PR="$BINDIR/query-pr $GNATS_HOST $GNATS_PORT $GNATS_DB $EDIT_USER $EDIT_PASSWD" PR_ADDR="$QUERY_PR --responsible-address" PR_EDIT="$LIBEXECDIR/gnats/pr-edit $GNATS_HOST $GNATS_PORT $EDIT_USER $EDIT_PASSWD $GNATS_DB" -# These traps take care of deleting all the /tmp files -trap 'rm -f $new.old $change_msg $fixfil' 0 -# Don't delete $new on error signals -trap 'if [ "$locked" != "" ]; then \ - $PR_EDIT --unlock $pr_id ; \ - locked= ; \ - fi' 1 2 3 13 15 - # find a user name if [ "$USER" != "" ]; then me=$USER @@ -138,85 +138,45 @@ full_me="$me" fi +for pr_id in $prs ; do + +epdir=`mktemp -d /tmp/epXXXXXX || exit 75` +chng_msg="$epdir/chng.$pr_id.$$" # new = temp file to use for editing -new="/tmp/ep$$" -newtmp="/tmp/ep$$.tp" -change_msg="/tmp/ep$$.ch" -fixfil="/tmp/ep$$.fx" +new="$epdir/$pr_id.ep$$" +change_msg="$epdir/ep$$.$pr_id.ch" +keepnew= + +# These traps take care of deleting all the /tmp files +trap 'rm -f $new.old $change_msg chng_msg; rmdir $epdir 2>/dev/null' 0 +trap 'if [ "$locked" != "" ]; then \ + $PR_EDIT --unlock $pr_id ; \ + locked= ; \ + fi; \ + rm -f $new.old $change_msg chng_msg; rmdir $epdir 2>/dev/null' 1 2 3 13 15 + # lock the pr $debug_print "Locking $pr_id." -lock=`$PR_EDIT --lock=$full_me --process=$$ $pr_id 2>&1 > $new` +lock=`$PR_EDIT --lock=$me --process=$$ $pr_id 2>&1 > $new` locked=t if [ "$lock" != "" ] ; then + echo "Failed to lock PR $pr_id" echo $lock - exit 0 + rc=1 + rm -r $epdir + continue fi -rm -f $fixfil - -# Now add any missing fields, along with a description. - -$QUERY_PR --list-fields | while read field -do - grep -i "^>${field}:" "$new" > /dev/null 2>&1 - if [ $? != 0 ] - then - $QUERY_PR --field-flags "$field" | grep -i readonly > /dev/null 2>&1 - if [ $? != 0 ] - then - type="`$QUERY_PR --field-type $field`" - case $type in - [Ee][Nn][Uu][Mm]) - values=`$QUERY_PR --valid-values $field | tr '\n' ' ' | sed 's/ *$//g; s/ / | /g;s/^/[ /;s/$/ ]/;` - valslen=`echo "$values" | wc -c` - if [ "$valslen" -gt 160 ] - then - desc="<`$QUERY_PR --field-description $field` (one line)>"; - else - desc="<${values} (one line)>"; - fi - dpat=`echo "$desc" | tr '][*+^$|\()&/' '............'` - echo "/^>${field}:/ s/${dpat}//" >> $fixfil - echo "/>${field}: ${desc}" >> $new; - ;; - [Mm][Uu][Ll][Tt][Ii][Tt][Ee][Xx][Tt]) - desc=" <`$QUERY_PR --field-description $field` (multiple lines)>"; - dpat=`echo "$desc" | tr '][*+^$|\()&/' '............'` - echo "s/^${dpat}//" >> $fixfil - echo ">${field}:" >> $new; - echo "$desc" >> $new; - ;; - *) - desc="<`$QUERY_PR --field-description $field` (one line)>" - dpat=`echo "$desc" | tr '][*+^$|\()&/' '............'` - echo "/^>${field}:/ s/${dpat}//" >> $fixfil - echo ">${field}: ${desc}" >> $new - ;; - esac - else - prevfld="$field"; - fi - fi -done - # here's where we actually call the editor. cp $new $new.old $VISUAL $new if cmp -s $new.old $new ; then echo "edit-pr: PR not changed" $PR_EDIT --unlock $pr_id - exit 0 -fi - -if [ -f $fixfil ] -then - sed -f $fixfil < $new > $newtmp - mv $newtmp $new - sed -f $fixfil < $new.old > $newtmp - mv $newtmp $new.old - rm -f $fixfil + rm -r $epdir + continue fi # error-check output by calling pr-edit --check; if mistakes exist, @@ -233,7 +193,7 @@ echo "PR $pr_id not updated: changed file is in $new.changed" mv $new $new.changed $PR_EDIT --unlock $pr_id - exit 0 + continue 2 ;; esac $VISUAL $new @@ -242,24 +202,37 @@ fi done -exec 3<&0 - # # Find out what fields have changed; if the changed field requires a # change reason, then ask about it. # -$LIBEXECDIR/gnats/diff-prs $new.old $new | while read field + +changed_fields=`$LIBEXECDIR/gnats/diff-prs $new.old $new` +for field in $changed_fields do flags=`$QUERY_PR --field-flags $field` || echo "edit-pr: Invalid field name $field" 1>&2; if echo "$flags" | grep -i "requirechangereason" > /dev/null 2>&1 then - echo ">${field}-Changed-Why:" >> $change_msg; - echo "Why did the $field field change? (Ctrl-D to end)"; - cat 0<&3 >> $change_msg; + $debug_print "Doing $field change." + echo ">$field-Changed-Why: " >> $change_msg + if [ -e $chng_msg ]; then + echo "Re-use last message (y/n)?" + read yesno + if [ "$yesno" != "y" ]; then + sed "s/%%ITEM%%/$field/" $chng_tpl > $chng_msg + fi + else + sed "s/%%ITEM%%/$field/" $chng_tpl > $chng_msg + fi + $VISUAL $chng_msg + sed '/^GNATS:/d' $chng_msg >> $change_msg fi done +echo "" >> $change_msg +echo "http://www.FreeBSD.org/cgi/query-pr.cgi?pr=$pr_id" >> $change_msg + if [ -f $change_msg ] then cat $change_msg >> $new @@ -269,12 +242,12 @@ # Submit the changed PR. # while true; do - if $PR_EDIT --email-addr "$full_me" $pr_id < $new + if $PR_EDIT --email-addr "$me" $pr_id < $new then echo "Edit successful" # we need to unlock the PR $PR_EDIT --unlock $pr_id - exit 0 + break else echo "Problems with edit submission." fi @@ -284,9 +257,11 @@ case "$input" in a*) echo "Cancelling edit. Changed PR is in $new." - # we need to ulock the PR no matter what + # we need to unlock the PR no matter what $PR_EDIT --unlock $pr_id - exit 1 ;; + keepnew=y + rc=1 + break 2 ;; r*) break ;; *) @@ -296,6 +271,13 @@ done done -rm -f $new +rm -f $chng_msg $new.old $change_msg +if [ "$keepnew" != "y" ]; then + rm -f $new + rmdir $epdir +fi +keepnew= + +done # for pr_id in $prs -exit 0 +exit $rc