[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:16248] Bug stamp-out list plotter.



Wichert が debian-devel-announce@lists.debian.org に Release
critical buglistを先月くらいからポストしているので、プロットす
るためのスクリプトを書いてみました。

プロットにはgnuplot を使っています。ただし、諸般の事情によりバー
ジョンは

    G N U P L O T
    Linux version 3.5 
    patchlevel 3.50.1.17, 27 Aug 93
    last modified Fri Aug 27 05:21:33 GMT 1993

というものを使いました。

いい加減にこしらえた稚拙なスクリプトですが、それなりに見れる出
力が得られています。次の5つのグラフを書きます。
    o   新規発生バグの累積
    o   バグ修正数の累積
    o   修正されずに残ったバグ数の遷移
    o   その時点での全 Release-critical Bug数
    o   全バグ数の累積

#実際に得られたグラフを一応JPEGに落してみたんですが、結構なサ
 イズになったので添付はしないでおきます。

perlスクリプト``wak2tab''は、WichertのMailを表形式に展開します。
この様にして得た表をファイルに貯めておき、shスクリプト``tab2gp''
にまとめて食わせます。たいしたスクリプトではないので適当にいじっ
て使ってください。


 -.- . -. -.
Ken Nakagaki <kenn@xxxxxxxxxxxxxxxxx>
「人は船ではない。人は会社ではない」-- Gerry Spence


-------------------------------------------
wak2tab:

#!/usr/bin/perl

$Year = 1999;

## Now, we have to use this Y2KP *incompliant* module. Sigh...
require 'timelocal.pl';

$/ = "\n\n";

## Read headers of the mail and ignore them.
$_ = <> or exit 0;  # empty.


%monthn2d = (
    'Jan', 1,
    'Feb', 2,
    'Mar', 3,
    'Apr', 4,
    'May', 5,
    'Jun', 6,
    'Jul', 7,
    'Aug', 8,
    'Sep', 9,
    'Oct', 10,
    'Nov', 11,
    'Dec', 12,
    'HEY!!', 0
);


while (<>){

    if (/list for\s+([A-Z][a-z][a-z])\s+(\d+?)\s+(\d+?):(\d+?)\s+.([A-Z][A-Z]T)/){
        @timestamp = ($1, $2, $3, $4, $5);
        $timestamp[0] = $monthn2d{$timestamp[0]} - 1;
            ## Idunno why month of ``timelocal'' is 0..11. -- kenn.
        $timestamp[2] = $timestamp[2] - (-5);   # FIXME!!! What's ``CST''??
        $timestamp[3] = $timestamp[3] + 0;
        $ts = timegm(0, $timestamp[3], $timestamp[2], $timestamp[1], $timestamp[0], $Year-1900);

        next;
    }

    if (!/^Package:/){ next }

    @btsr = split('\n');
    $btsr[0] =~ /Package: ([-\w]+)/;
    $pkgname = $1;
    for ($i = 1; $i <= $#btsr; $i++){
        print "$1\t$ts\t$pkgname\n" if $btsr[$i] =~ /^\s+(\d+)/;
    }
}

-------------------------------------------
tab2gp:

#!/bin/sh -

B="`basename $0`"
Dir="/tmp/$B.$$"
Fix="/tmp/$B.$$/fix"
New="/tmp/$B.$$/new"
Nof="/tmp/$B.$$/not"

makecomm()
{
    : {$2?}

    ${isbegin:-false} || cat < "$2" > "$1"
    sort -n < "$1" > "$1.sort"
    while [ $# -gt 1 ]; do
        rt="`expr $2 - $EPOCH`"
        sort -n < "$2" > "$2.sort"
        comm -23 "$1.sort" "$2.sort"|wc -l|(read lc; echo "$rt  $lc") >> "$Fix"
        comm -13 "$1.sort" "$2.sort"|wc -l|(read lc; echo "$rt  $lc") >> "$New"
        comm -12 "$1.sort" "$2.sort"|wc -l|(read lc; echo "$rt  $lc") >> "$Nof"
        shift
    done
}

accum()
{
    awk '{ Days = $1 / 86400; Sum += $2; print Days, Sum }' < "$1"
}

accum2()
{
    paste "$1" "$2" | awk '
        {
            Days = $3 / 86400
            if (NR == 1){
                Sum = $2 + $4
            }else{
                Sum += $4
            }
            print Days, Sum
        }
    '
}

noaccum()
{
    awk '{ Days = $1 / 86400; print Days, $2 }' < "$1"
}

total()
{
    paste "$1" "$2" | awk '{ T = $4 - $2; print $1, T }'
}

while [ $# -gt 0 ]; do
    case "$1" in
    -b*|--b*) isbegin=true ;;
    -c*|--c*) isbegin=false ;;
    -d*|--d*) doplot=false ;;
    -f*|--f*) shift; fixout="$1" ;;
    -ne*|--ne*) shift; newout="$1" ;;
    -no*|--no*) shift; notout="$1" ;;
    -t*|--t*) shift; totout="$1" ;;
    -T*|--T*) shift; tacout="$1" ;;
    -s*|--s*) shift; scrout="$1" ;;
    -|--) shift; break ;;
    -*) echo "Usage:
    $B [option(s)] bugtable ...
    options:
        --begin|--continued
        --fixedbug-file _fliename_
        --do-not-plot
        --notfixedbug-file _fliename_
        --newbug-file _fliename_
        --totalbugs-file _fliename_
        --Totalbugs-file _fliename_
        --script-of-gnuplot _fliename_
        " >&2 ; exit;;
    *) break ;;
    esac
    shift
done

Fi="${fixout:-fix}"
Ne="${newout:-new}"
No="${notout:-notfix}"
To="${totout:-total}"
Ta="${tacout:-Total}"
Gp="${scrout:-gp}"


umask 022
trap "rm -rf \"$Dir\"; exit"  0 1 2 3 13 15
mkdir "$Dir" || exit

: > "$Dir/00" || exit
cat "$@"| while read bugid ts remain; do
    echo "$bugid    $remain" >> "$Dir/$ts"
done

EPOCH=`(cd "$Dir" && ls [0-9]*[0-9]|sed -n 2p)`
Epoch="`perl -e \"print scalar(gmtime($EPOCH))\"`"

(cd "$Dir" && makecomm `ls [0-9]*[0-9]`)

accum "$Fix" > "$Fi"
accum "$New" > "$Ne"
noaccum "$Nof" > "$No"
accum2 "$Nof" "$New" > "$Ta"
total "$Fi" "$Ta" > "$To"

sed "1,/^exit/d;
    s,@@datafile1,$Ne,; s,@@title1,New bugs(accumulation),;
    s,@@datafile2,$Fi,; s,@@title2,Fixed bugs(accumulation),;
    s,@@datafile3,$No,; s,@@title3,Not-fixed bugs,;
    s,@@datafile4,$To,; s,@@title4,Total bugs,;
    s,@@datafile5,$Ta,; s,@@title5,Total bugs(accumulation),;
    s/@@Xlabel/days since $Epoch./;
    s/@@Ylabel//;
    s/@@Title/Bug stamp-out list/" < $0 > "$Gp"

${doplot:-true} || exit 0
exec < /dev/tty
gnuplot "$Gp"

exit
set terminal x11
set title "@@Title" 0,0
set xlabel "@@Xlabel" 0,0
set ylabel "@@Ylabel" 0,0
plot "@@datafile1" title "@@title1" with lines, "@@datafile2" title "@@title2" with lines, "@@datafile3" title "@@title3" with lines, "@@datafile4" title "@@title4" with lines, "@@datafile5" title "@@title5" with lines
pause -1