#! /usr/bin/perl -w my $GNUPLOT = '/usr/bin/gnuplot' ; use strict ; use Repocafe ; my $DAYS = 7 ; my $DIFF = $DAYS * 24 * 60 * 60 ; my $SCALE = 1024 * 1024 ; my $prog = substr($0,rindex($0,'/')+1) ; my $Usage = < ; perl mk_stats -f ) ---------------------------------------- USAGE sub Usage { die "$_[0]$Usage" ; } sub Error { die "$prog: $_[0]\n" ; } sub Warn { warn "$prog: $_[0]\n" ; } # usage: &GetOptions(ARG,ARG,..) defines $opt_ID as 1 or user spec'ed value # usage: &GetOptions(\%opt,ARG,ARG,..) defines $opt{ID} as 1 or user value # ARG = 'ID' | 'ID=SPC' | 'ID:SPC' for no-arg, required-arg or optional-arg # ID = perl identifier # SPC = i|f|s for integer, fixedpoint real or string argument use Getopt::Long ; Getopt::Long::config('no_ignore_case') ; our %opt = () ; Usage('') unless GetOptions ( \%opt, qw(v q d f p help) ) ; if ( $opt{help} ) { print $Usage ; exit 0 ; } Usage("Arg count\n") unless @ARGV == 0 ; Repocafe::set_opt ( %opt ) ; my $Cafe = Repocafe -> new ( $opt{c} ) ; my $conf = $Cafe -> conf ; my $REPO_DIR = $conf -> dir_repos ; my $PLOT_DIR = $conf -> dir_www . "/images" ; my $PLOT_TMP = $conf -> dir_admin . "/tmp" ; my $PLOT_DAT = "$PLOT_TMP/totals" ; sub aprx_eq { my ( $x, $y ) = @_ ; abs ( $x - $y ) < 500 ; } sub aprx_ne { my ( $x, $y ) = @_ ; not aprx_eq $x, $y ; } sub aprx_lt { my ( $x, $y ) = @_ ; $x < $y and aprx_ne $x, $y ; } sub aprx_le { my ( $x, $y ) = @_ ; $x < $y or aprx_eq $x, $y ; } my $time = $^T ; my @date = gmtime $time ; $date [ 4 ] ++ ; $date [ 5 ] += 1900 ; my $date = sprintf "%4d-%02d-%02d", @date [ 5, 4, 3 ] ; printf "time %s\ndate %s\n", $time, $date if $opt{d} ; my $repos = $Cafe -> repos -> get_by_qwe ( '' ) ; my $repo_stats = $Cafe -> stats ; sub save_stats { my $repo_stats = shift ; my $repo = shift ; my $stat = shift ; my $rid = $repo -> id ; my $rev = $repo -> version ; my $size = $repo -> size ; my $rec = {} ; my $sav = defined ( $stat ) ? 'upd' : 'new' ; if ( $sav eq 'upd' ) { my $id = $stat -> { id } ; $rec = $repo_stats -> get_rec ( $id ) ; die "can't get_rec stat $id" unless defined $rec ; } else { $rec = $repo_stats -> TAB -> null ; $rec -> set ( 'rid' , $rid ) ; } if ( $opt{v} ) { printf "save = %s\n", $sav ; print $rec -> dump ( $sav ) ; } $rec -> set ( 'rev' , $rev ) ; $rec -> set ( 'size' , $size ) ; $rec -> set ( 'time' , $time ) ; $rec -> set ( 'date' , $date ) ; my $err = $rec -> check_new_upd ( $sav ) || '' ; if ( $err ) { printf "*** %s\n", $err ; } elsif ( $opt{f} ) { if ( $sav eq 'new' ) { $rec -> insert ; } else { $rec -> update ; } } elsif ( $opt{v} ) { print "-----------\n" ; print $rec -> dump ( $sav ) ; } $rec ; } sub save_all_stats { my $repo_stats = shift ; my $since = $^T - int ( 6.5 * 24 * 60 * 60 ) ; my $stats = $repo_stats -> get_upd_stats ( $since ) ; my $fmt = "%s %6s %5s %10s %s\n" ; printf $fmt, 'x', 'rid', 'rev', 'size', 'name' ; for my $repo ( sort { $a -> { id } <=> $b -> { id } } @$repos ) { my $nam = $repo -> repo_name ; my $rid = $repo -> { id } ; my $rec = save_stats $repo_stats, $repo, $stats -> { $rid } ; printf $fmt , ( exists ( $stats -> { $rid } ) ? 'u' : 'I' ) , $rec -> val ( 'rid' ) , $rec -> val ( 'rev' ) , $rec -> val ( 'size' ) , $nam ; } } sub gen_plot { my $repo_stats = shift ; my $stats = $repo_stats -> get_all_stats ; my %size = () ; my %tots = () ; for my $stat ( @$stats ) { my $rid = $stat -> { rid } ; my $time = $stat -> { time } ; my $size = $stat -> { size } ; my $k = int ( ( $^T - $time ) / $DIFF + 0.5 ) ; my $mark = $^T - $k * $DIFF ; $size { $mark } { $rid } = $size ; } for my $mark ( keys %size ) { for my $rid ( keys %{ $size { $mark } } ) { $tots { $mark } += $size { $mark } { $rid } ; } } my $min_cnt = 100000000 ; my $max_cnt = 0 ; my $min_siz = 0 ; my $max_siz = 0 ; open DAT, ">$PLOT_DAT" or Error "can't write $PLOT_DAT ($!)" ; for my $mark ( sort { $a <=> $b } keys %tots ) { my $size = $tots { $mark } / $SCALE ; my $count = scalar keys %{ $size { $mark } } ; next if $count < 20 ; my $line = sprintf "%d %4s %8.3f %s\n" , $mark , $count , $size , scalar ( localtime $mark ) ; print $line ; print DAT $line ; $min_cnt = $count if $count < $min_cnt ; $max_cnt = $count if $count > $max_cnt ; $min_siz = $size if $count < $min_siz ; $max_siz = $size if $count > $max_siz ; } close DAT ; $min_cnt *= 0.9 ; $max_cnt += int ( $max_cnt / 50 + 0.5 ) ; $max_siz *= 1.1 ; my $plot1 = <