CVS-Metrics

 view release on metacpan or  search on metacpan

lib/Graph.pm  view on Meta::CPAN

our $VERSION = '0.18';

use GD;
use CVS::Metrics::TaggedChart;

sub EnergyGD {
    my $cvs_log = shift;
    my ($tags, $path, $title, $width, $height, $tag_from, $tag_to) = @_;

    my $data = $cvs_log->_Energy($tags, $path);
    my $img = CVS::Metrics::TaggedChart->new($width, $height);
    if (defined $tag_from and defined $tag_to) {
        my @tags2 = @{$tags};
        my @data_pre;
        my @tags_pre;
        while ($tags2[0] ne $tag_from) {
            push @tags_pre, shift @tags2;
            push @data_pre, shift @{$data};
            push @data_pre, shift @{$data};
        }
        if (scalar @tags_pre) {
            push @tags_pre, $tags2[0];
            push @data_pre, ${$data}[0], ${$data}[1];
            $img->setData(\@data_pre, 'blue up');
            $img->setTag(\@tags_pre);
        }
        unless ($tag_to eq 'HEAD') {
            my @data_post;
            my @tags_post;
            if ($tags2[-1] eq 'HEAD') {
                unshift @tags_post, pop @tags2;
                unshift @data_post, pop @{$data};
                unshift @data_post, pop @{$data};
            }
            while ($tags2[-1] ne $tag_to) {
                unshift @tags_post, pop @tags2;
                unshift @data_post, pop @{$data};
                unshift @data_post, pop @{$data};
            }
            if (scalar @tags_post) {
                unshift @tags_post, $tags2[-1];
                unshift @data_post, ${$data}[-2], ${$data}[-1];
                $img->setData(\@data_post, 'blue up');
                $img->setTag(\@tags_post);
            }
        }
        $img->setData($data, 'red up');
        $img->setTag(\@tags2);
    }
    else {
        $img->setData($data, 'blue up');
        $img->setTag($tags);
    }
    $img->setGraphOptions(
            title           => $title,
            horAxisLabel    => 'delta (added or modified files)',
            vertAxisLabel   => 'size (nb files)',
    );
    $img->draw();
    my $gd = $img->getGDobject();
    $gd->transparent(-1);
    return $gd;
}

sub EnergyCv {
    my $cvs_log = shift;
    my ($tags, $path, $title, $width, $height, $toplevel) = @_;

    my $data = $cvs_log->_Energy($tags, $path);
    my $img = CVS::Metrics::TaggedChart->new($width, $height);
    $img->setData($data, 'blue up');
    $img->setTag($tags);
    $img->setGraphOptions(
            title           => $title,
            horAxisLabel    => 'delta (added or modified files)',
            vertAxisLabel   => 'size (nb files)',
    );
    return $img->canvas($toplevel);
}

sub ActivityGD {
    my $cvs_log = shift;
    my ($path, $title, $start_date, $width, $height, $date_from, $date_to) = @_;

    use GD::Graph::bars;
    use GD::Graph::mixed;

    my ($days, $data) = $cvs_log->_Activity($path, $start_date);

    my $sum = 0;
    my $nb = 0;
    foreach (@{$data}) {
        next unless ($_);
        $sum += $_;
        $nb ++;
    }
    my $average = 1;
    $average = $sum / $nb if ($sum and $nb);

    my $range_day = 30;
    while ((scalar(@{$days}) % $range_day) != 1) {
        unshift @{$days}, ${$days}[0] - 1;
        unshift @{$data}, 0;
    }

    my @days2;
    foreach (@{$days}) {
        push @days2, $_ - ${$days}[-1];
    }

    $width = 200 - ${$days}[0] if ($width < 200 - ${$days}[0]);

    if (defined $date_from and defined $date_to) {
        my $now = int(time() / 86400);
        my $day_from = _get_day($date_from) || 0;
        my $day_to = _get_day($date_to) || 0;
        my @data1;
        my @data2;
        my $i = 0;
        foreach (reverse @{$data}) {
            if (        $i <= ($now - $day_from)



( run in 2.357 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )