#!/bin/sh ## ============================================================================ # Script to generate some nice graphs out of the bug report emails. # # Copyright (c) 2004 Erik Abele . # All rights reserved. ## ============================================================================ [ `hostname` != "minotaur.apache.org" ] \ && { echo "This script is only useful on" \ "minotaur.apache.org!" 1>&2 && exit 1; } [ -z "$1" ] && { echo "Usage: `basename $0` [-h] version" 1>&2 && exit 1; } usage() { echo "Usage:" 1>&2 echo " `basename $0` [-h] infoid" 1>&2 echo 1>&2 echo " -h: Shows this help screen" 1>&2 echo 1>&2 echo " version: one of the following product versions" 1>&2 echo " * 1.3 Generate bug stats for HTTPD 1.3" 1>&2 echo " * 2.0 Generate bug stats for HTTPD 2.0" 1>&2 echo 1>&2 exit 1 } DATASRC=/x1/www/httpd.apache.org/mail/bugs DATADST=$HOME/public_html/httpd/bugstats EXT=dat._$$_ GNUPLOT=/usr/local/bin/gnuplot SUBJECT='Subject: Bug report for Apache' BUG_STATES=" \ New-New \ Assigned-Ass \ Reopened-Opn \ Verified-Ver \ Unconfirmed-Unc" BUG_TYPES=" \ Blocker-Blk \ Critical-Cri \ Major-Maj \ Normal-Nor \ Minor-Min \ Enhancement-Enh" case $1 in 1.3) PRODUCT='httpd-1.3' ;; 2.0) PRODUCT='httpd-2.0' ;; -h|*) usage ;; esac echo "Bug stats for $PRODUCT" echo "Preparing data..." zcat $DATASRC/*.gz | cat - $DATASRC/?????? \ | sed -n "/^$SUBJECT $PRODUCT/,/^| Total/p" \ | sed "s/^$SUBJECT $PRODUCT \[\([0-9/]*\)\]$/>> \1/g" \ | sed 's/^| Total *\([0-9]*\) *bugs.*$/<< \1/g' \ > $DATADST/data.$EXT echo "Aggregating over-all statistics..." cat $DATADST/data.$EXT \ | sed '/^[<>]\{2\} .*$/!d' \ | sed -e :a -e '$!N;s/\n<> //' \ | sort -u \ > $DATADST/data_Total.$EXT MAXBUGS=`cat $DATADST/data_Total.$EXT | \ sort -urn +1 | head -1 | cut -d ' ' -f 2` MAXDATE=`cat $DATADST/data_Total.$EXT | sort -ur | head -1 | cut -d ' ' -f 1` MINDATE=`cat $DATADST/data_Total.$EXT | sort -u | head -1 | cut -d ' ' -f 1` PLOTS_S="\"$DATADST/data_Total.$EXT\" \ using 1:2 title \"Total # of bugs\" with lines" for i in $BUG_STATES; do STR=`echo $i | cut -d '-' -f 1` SYM=`echo $i | cut -d '-' -f 2` echo "Counting bug states: $STR [$SYM]..." cat $DATADST/data.$EXT \ | awk 'BEGIN { d = 0; c = 0 } /^>> [0-9\/]*/ { if (d != 0) { print d, c; c = 0 }; d = $2 } /\|'"$SYM"'\|/ { c++ } END { if (d != 0) print d, c }' \ | sort -u \ > $DATADST/data_$SYM.$EXT PLOTS_S="$PLOTS_S, \"$DATADST/data_$SYM.$EXT\" \ using 1:2 title \"$STR\" with lines" done echo "Rendering states graph..." $GNUPLOT << EOF set terminal png small size 640,480 set output "$DATADST/$PRODUCT-states.png" set title "Apache Bug Statistics $PRODUCT\n \ (subdivided into bug states)\n \ $MINDATE - $MAXDATE" set ylabel "Number of bugs" set xdata time set timefmt "%Y/%m/%d" set xrange [ "$MINDATE" : "$MAXDATE" ] set format x "%y/%m/%d" set yrange [ 0 : $MAXBUGS ] set mytics 10 set ytics 20 set key left top Left reverse samplen 1 spacing 2 plot $PLOTS_S EOF PLOTS_T="\"$DATADST/data_Total.$EXT\" \ using 1:2 title \"Total # of bugs\" with lines" for i in $BUG_TYPES; do STR=`echo $i | cut -d '-' -f 1` SYM=`echo $i | cut -d '-' -f 2` echo "Counting bug types: $STR [$SYM]..." cat $DATADST/data.$EXT \ | awk 'BEGIN { d = 0; c = 0 } /^>> [0-9\/]*/ { if (d != 0) { print d, c; c = 0 }; d = $2 } /\|'"$SYM"'\|/ { c++ } END { if (d != 0) print d, c }' \ | sort -u \ > $DATADST/data_$SYM.$EXT PLOTS_T="$PLOTS_T, \"$DATADST/data_$SYM.$EXT\" \ using 1:2 title \"$STR\" with lines" done echo "Rendering types graph..." $GNUPLOT << EOF set terminal png small size 640,480 set output "$DATADST/$PRODUCT-types.png" set title "Apache Bug Statistics $PRODUCT\n \ (subdivided into bug types)\n \ $MINDATE - $MAXDATE" set ylabel "Number of bugs" set xdata time set timefmt "%Y/%m/%d" set xrange [ "$MINDATE" : "$MAXDATE" ] set format x "%y/%m/%d" set yrange [ 0 : $MAXBUGS ] set mytics 10 set ytics 20 set key left top Left reverse samplen 1 spacing 2 plot $PLOTS_T EOF rm -f $DATADST/data*.$EXT