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

[debian-users:16496] Visualized Release-critical Bugreport for July 2, 1999



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

少し直しました。あいかわらず稚拙ですが。

perlスクリプト``wak2tab''は、WichertのMailを表形式に展開します。
こんな感じで使います。

    perl wak2tab < Wichert's_Mail  > 19990702.table

こんな出力が得られます。

    40295   930891840   abiword
    40125   930891840   acroread
    37069   930891840   adduser
        :

shスクリプト``tab2gp''これらの表をまとめて、gnuplot 用のデータ
ファイルとgnuplot スクリプトを生成し、gnuplot を呼びます。
生成されたファイルは、明に指定されない限り自動的に消えます。
こんな感じで使います。

    sh - tab2gp *.table

Postscriptを吐かせたい場合には、こんな感じ。

    sh - tab2gp --Postscript 'landscape color solid' --yrange '0:450' *.table


x軸を経過日数として、次の5つのグラフを書きます。

    a.  新規発生バグの累積
        前週には存在せず、今週には現われているバグの数を足し込
        んでいったもの
    b.  バグ修正数の累積
        前週には存在したが、今週はなくなっているバグの数を足し
        込んでいったもの
    c.  修正されずに残ったバグ数の遷移
        前週にも今週にも存在するバグの数
    d.  今週の時点での全 Release-critical Bug数
        WichertのMailの冒頭で、``Total number of release-
        critical bugs:''と示されているものと同じ
    e.  全バグ数の累積
        plot開始時点での全Release-critical Bug数に、新規発生バ
        グを足し込んでいったもの

ある一時点に置いて、次の等式が成立します。

    a + c = b + d = e


やはりb.の傾きは一定しているようですね。毎週だいたい20くらい。
このあたりが、Release-critical Bugに対する現在のDebian Project
のスループットということでしょうか。

例によってgzipped PSをつけておきます。

 -.- . -. -.
 Ken Nakagaki <kenn@xxxxxxxxxxxxxxxxx>
 ``By All Means Today, For Souls Tomorrow.''


wak2tab:
-------------------------------------------
#!/usr/bin/perl

require 'timelocal.pl';
##
##          1999    2000    -->     timegm()
##  masked    99      00        946684799   946684800
##  -1900     99     100        946684799   946684800
##
##  ... works fine.
##

$/ = "\n\n";
    # Read a paragraph each time.

%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
);

$Year = (gmtime)[5];
#print STDERR "Note: year is [$Year]?\n";

while (<>){

    ## ``Date: Fri, 25 Jun 1999 00:15:08 -0500''
    if (/\ndate:\s+([a-z][a-z][a-z],\s+)?(\d+)\s+([a-z][a-z][a-z])\s+(\d+)\s+(\d+):(\d+):(\d+)\s+([-+\d]+)/i){
        @date = ($4, $monthn2d{$3}, $2+0, $5-int($8/100), $6+0, $7+0);
        $date[0] -= 1900 if $date[0] > 1900;
            ## (99, 6, 25, 5, 15, 8)

        next
    }

    ## ``Bug stamp-out list for Jun 25 00:04 (CST)''
    if (/list for\s+([A-Z][a-z][a-z])\s+(\d+)\s+(\d+):(\d+)\s+.([A-Z][A-Z]T)/){
        @date = ($Year, $monthn2d{$1}, $2+0, $3+0, $4+0, 0);
            ## (99, 6, 25, 0, 4, 0)
        $date[3] -= (-5);   # FIXME!!! What's ``CST''?

        next
    }

    if (/^Package:\s+(\S+)/){

        $pkgname = $1;
        $ts = timegm($date[5], $date[4], $date[3], $date[2], $date[1]-1, $date[0]);

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

        # next
    }
}

-------------------------------------------

tab2gp:
-------------------------------------------
#!/bin/sh -

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

makecomm()
{
    : {$2?}

    ${isbegin:-false} || cat < "$2" > "$1"
    sort -n < "$1" > "$1.sort"
    while [ $# -gt 1 ]; do
        rt="`expr $2 - $BEGIN`"
        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
    --P*) shift; PSopt="$1" ;;
    --yrange) shift; YRange="$1" ;;

    -b*|--b*) isbegin=true ;;
    -c*|--c*) isbegin=false ;;

    -d*|--d*) doplot=false ;;
    -p*|--p*) doplot=true ;;

    -f*|--f*) shift; Fi="$1" ;;
    -ne*|--ne*) shift; Ne="$1" ;;
    -no*|--no*) shift; No="$1" ;;
    -t*|--t*) shift; To="$1" ;;
    -T*|--T*) shift; Ta="$1" ;;
    -s*|--s*) shift; Gp="$1" ;;

    -|--) shift; break ;;

    -*) echo "Usage:
    $B [option(s)] bugtable ...
    options:
        --begin|--continued
        --do-not-plot|--plot
        --fixedbug-file _fliename_
        --notfixedbug-file _fliename_
        --newbug-file _fliename_
        --totalbugs-file _fliename_
        --Totalbugs-file _fliename_
        --script-of-gnuplot _fliename_
        --Postscript _psoptions_
        --yrange m:n

    Default: \"$B --plot --continued\"
        " >&2 ; exit;;

    *) break ;;
    esac
    shift
done

: ${Fi:="$Dir/fix-out"}
: ${Ne:="$Dir/new-out"}
: ${No:="$Dir/notfix-out"}
: ${To:="$Dir/total-out"}
: ${Ta:="$Dir/Total-out"}
: ${Gp:="$Dir/gp-out"}


umask 077
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

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

(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"

(
    test "$PSopt" && echo "set terminal postscript $PSopt"
    echo "set title \"Bug stamp-out list.\" 0,0"
    echo "set xlabel \"days since ${Begin}.\" 0,0"
    echo "set ylabel \"\" 0,0"
    test "$YRange" && echo "set yrange [$YRange]"
    echo -n "plot "
    echo -n "\"$Ne\" title \"New bugs(accumulation)\" with lines, "
    echo -n "\"$Fi\" title \"Fixed bugs(accumulation)\" with lines, "
    echo -n "\"$No\" title \"Not-fixed bugs\" with lines, "
    echo -n "\"$To\" title \"Total bugs\" with lines, "
    echo -n "\"$Ta\" title \"Total bugs(accumulation)\" with lines"
    echo ""
    test "$PSopt" || echo "pause -1"
) > "$Gp"

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

exit

-------------------------------------------

begin 664 19990702.ps.gz
M'XL(""^A?#<``S$Y.3DP-S`R+G!S`)U8R6[;2!"]\RMJ#@&4`^7>N/D6.Q/,
MP0D$Q]#%R8$2:8D8FA1(RHDA^-^G>A5)+58&L45U]7M5KZJ[B^U\^&OVW?^4
MU8O<9U/B??APV^1I5S?7L*JVF[+NT/2Y7FZ?\ZK[4E==>PW_Y.5+WA7+%*=N
MZFV5%=7JIOY]#0%1/X&`*)*N9NDJ1_PD[?(J^XB&OZOLMGZ6KEKO"OUGQ;(#
M04`]L_S)L[9%OBHJ[^JV+NL&NF:;J]FK[W599+TQPLNBRG\56;>&8$H(T?:7
M=ET\=>"+4(^S$G:4P/.V?-.&]:8#3J>!@0]&7V'W7&."]1LLBBK3QCO8R4A#
MXSWLFD/H'*V'6(S!0`9B4H93P6`]M-VUZ_H7[&"Y;1JLTZ8NJ@[:KJG_S>&K
M!T#`)'</"FD2NG^'EFTW<H@KI8NUJ3=0Y:OCSF[_AS.?X2J^'/?W&:L'>BUW
M;=XUJ\52#?1R[B3]\><;%$^8'<YG:;N&-T]/V-\S6#G*RS:WX6YD."-WL$-T
MF9&U-QG*I],4F=4QRNP4Y1CX[F&!:!3V^!-URW]8$S>7XAPJ>*2`&Q4CEC][
MA=#P?MD<CR!O9GS2D4]JYD3?IX3U0<R`Y#QP!:('ZK@!*77JE!C8T)<PL,`&
MA$$Z=`0/^OJX@UL1XW3"OM+]AW")#>'1<?B8B%&F?$2-WZ,>1,>2V-^]H]E^
M=SSVEA-/CSE5!WMLNS`'_``PMY[L>3KN&QTMZ\VKZC)IEBEOLKNH<VZ><V5Q
M(X.0X_D`.X=E6;?Y)I4;6H5"Z,P=EQ,")%/E(=N4;&[S?;X'760L[1Y4/R0N
M7<38$WT^X?SW<JW<R=AJT"^!D>*RUR%Z`M=VFKR3]NT)&>?CKTWGMQ+.U,/*
MN.^1QHO_\/[BTRG5K>[8+O#I--2S=O7UB+BQ1>Z!QZMB%7U'12;Z)[C51GSA
MZ_?]K,&>M3*7@6MYLD<O^56;ON2>OCIT35JU)5X7/#*E^#+7G^TR+7,O(=#4
MG9H#/R!B@)956#7IJW?E+B?PA._>)[RQ`!7&AQHA4CX]/%PR(0_;KQ=&#'A`
ML58A2R)5BKV)@!!1C"9LXGTDUSC&A5PQSS>&((X-8D(^@GHO*U8LDG=8&C$)
M!C3*\1)SFH=/&BO+!$LU(,9"7$@<1D3DN?QZ1#:,R&)^+L4^<1B1<WYACGP8
MD<?\PASY,*+@_,(<Q3"BB-F%.8I1CF8O(7"NMA0-$(5;61E4^:C=-.K^Y=&(
MO4?#IPB"0*^^Y;$HHI?SF./QF/T!CSN>B"-R.4\X7I"P/^`%CA<F87(Y+]SS
M#@^Y.]K^P;F_D_4@$*DUR=+7%MJB6F*GKBOXFKX"_CE!HVO"K[%!T21)IKTR
MHENI$8DWVQ5VS/1YX]?;#LJB[1P.KV]>*.(01,CD[I]\RW_!8KMJ?TS2)?Z]
MM<7.5M35CX]N%P589P-F`1MU*1Y&0(,$;1$/L.6Y;Q%1WP0P9FV<Q>9;A`=/
MS_+8VD2LFQTU\N0'ROM2_,ZS"P1J^'&!";$*2#Q2*E"ITYRX;]RJI[&UZ3SP
M\FKTZ08Y^59W_I/3.-2D(7U-5(2A$>4[5?Z^;#:L3_>21^H$!"*RMD!KXD83
M(TK3`[ZPRB-Z]/0)/6'BY+CU9%9/X%2XU0Q)9&ODZL:,'F'TD'"DY_P::O@)
M?4=W66AK<GR7687C769N$ZLF;[NZR=6U0>K8X&4![PP/35J4>;/_KP3J_0?`
'?8NWL!``````
`
end