Отслеживание статистики правок в git

Скрипт позволяющий высчитывать статистику правок (кол-во добавленных строчек, удаленных строчек) за месяц по неделям.

Пример вывода скрипта:

4 week ago: 03.10.2012 .. 10.10.2012
     Author1 
        2 files changed
        14 insertions(+)
        0 deletions(-)

3 week ago: 10.10.2012 .. 17.10.2012
     Author1 
        32 files changed
        134 insertions(+)
        86 deletions(-)

2 week ago: 17.10.2012 .. 24.10.2012
1 week ago: 24.10.2012 .. 31.10.2012
     Author1 
        3 files changed
        2 insertions(+)
        4 deletions(-)

     Author2 
        79 files changed
        10900 insertions(+)
        938 deletions(-)

     Author1 
        97 files changed
        11917 insertions(+)
        11779 deletions(-)

Totals 
     Author1 
        0.75 (3) files changed
        0.5 (2) insertions(+)
        1 (4) deletions(-)

     Author2 
        19.75 (79) files changed
        2725 (10900) insertions(+)
        234.5 (938) deletions(-)

     Author1 
        32.75 (131) files changed
        3016.25 (12065) insertions(+)
        2966.25 (11865) deletions(-)

Сам скрипт:

#!/usr/bin/perl -w

use strict;
use warnings;

use DateTime;

my $dateFormat = '%d.%m.%Y';
my @globalStats = ();

push @globalStats, printWeek(4);
push @globalStats, printWeek(3);
push @globalStats, printWeek(2);
push @globalStats, printWeek(1);

printGlobals(@globalStats);

#--

sub printWeek {
    my ($week) = @_;

    my %globalStats = ();

    my $start  = DateTime->now()
        ->subtract( weeks => $week )
        ->strftime($dateFormat);
    my $end  = DateTime->now()
        ->subtract( weeks => $week - 1 )
        ->strftime($dateFormat);

    print "$week week ago: $start .. $endn";

    my $stats = parseWeek($week);

    for my $author (sort keys %$stats) {
        my ($files_changed, $insertions, $deletions) = 0;

        grep {
            $files_changed += $_->{files_changed};
            $insertions += $_->{insertions};
            $deletions += $_->{deletions};
        } @{$stats->{$author}};

        $globalStats{$author} = {
            files_changed => $files_changed,
            insertions => $insertions,
            deletions => $deletions
        };

        printTotals($author,
            $files_changed,
            $insertions,
            $deletions);
    }

    return %globalStats;
}

sub parseWeek {
    my ($week) = @_;

    my ($weekSince, $weekUntil) = 
        ($week, $week - 1);

    my %authors = ();
    my $author = undef;

    my $raw = `git log --shortstat --since="$weekSince week ago" --until="$weekUntil week ago" --pretty=short`;

    my @lines = split "n", $raw;

    for (@lines) {
        if (/^Author:(.*)/) {
            $author = $1;
        }

        if (/(d+) files changed/) {
            my $files_changed = $1;
            my $insertions = 0;
            my $deletions = 0;

            $insertions = $1 if (/(d+) insertions/);
            $deletions = $1 if (/(d+) deletions/);

            push @{ $authors{$author} }, {
                files_changed => $files_changed,
                insertions => $insertions,
                deletions => $deletions
            };
        }
    }

    return %authors;
}

sub printGlobals {
    my $globalStats = shift;
    
    my %totals = ();

    for my $stat (@{$globalStats}) {
        my @authors = keys %{$stat};

        grep {
            unless (exists $totals{$_}) {
                $totals{$_} = {
                    files_changed => 0,
                    insertions => 0,
                    deletions => 0
                };
            }
            
            $totals{$_}->{files_changed} += $stat->{$_}->{files_changed};
            $totals{$_}->{insertions} += $stat->{$_}->{insertions};
            $totals{$_}->{deletions} += $stat->{$_}->{deletions};
        } @authors;
    };

    print "Totals n";
    for my $author (sort keys %totals) {
        printTotals($author,
            ($totals{$author}->{files_changed}/4) . " ($totals{$author}->{files_changed})",
            ($totals{$author}->{insertions}/4) . " ($totals{$author}->{insertions})",
            ($totals{$author}->{deletions}/4) . " ($totals{$author}->{deletions})");
    }
}

sub printTotals {
    my ($author, $files_changed, $insertions, $deletions) = @_;
    print "t$authorn";
    print "tt$files_changed files changedn";
    print "tt$insertions insertions(+)n";
    print "tt$deletions deletions(-)n";
    print "n";    
}
Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s