App-Git-Spark

 view release on metacpan or  search on metacpan

bin/git-spark  view on Meta::CPAN

#!/usr/bin/env perl
# Inspired by @trisweb:
# http://github.com/holman/spark/wiki/Wicked-Cool-Usage 

use strict;
use warnings;

use Getopt::Long::Descriptive;
use Encode qw/encode decode/;
use DateTime;
use List::AllUtils qw/max sum/;
use Math::Round qw/round/;
use Term::Spark qw/show_graph/;

binmode STDOUT, ':encoding(UTF-8)';
    
our $VERSION = '0.006'; # VERSION
# PODNAME: git-spark


my ($option, $usage) = describe_options(
    'usage: git spark %o [AUTHOR]',
    ['hours|o=i'      => 'Commits from the last x hours'],
    ['days|d=i'       => 'Commits from the last x days'],
    ['weeks|w=i'      => 'Commits from the last x weeks'],
    ['months|m=i'     => 'Commits from the last x months'],
    ['years|y=i'      => 'Commits from the last x years'],
    ['scale|s=i'      => 'Set the max value of the graph. Use this option to compare this graph with other graphs.'],
    ['help|h'         => 'Show this message'],
);

my $author = $ARGV[0] || $ENV{USER};
my $scale  = $option->scale || 0;

print($usage), exit 0 if $option->help;
print($usage), exit 0 
    if (!$option->hours  && 
        !$option->days   && 
        !$option->weeks  && 
        !$option->months && 
        !$option->years);

foreach my $key (qw/hours days weeks months years/) {
    spark($option->$key, $key, $author, $scale) if $option->$key;
}

sub spark {
    my ($value, $units, $author, $scale) = @_;

    my @data  = countCommits(@_);
    my $total = sum @data;
    my $avg   = round($total / ($#data + 1));
    my $max   = max @data;

    print "Commits by $author over the last $value $units\n";
    print "total: $total   avg: $avg   max: $max\n";
    print join(" ", @data) . "\n";
    print show_graph( max => $max, values => \@data ), "\n";
}

sub countCommits {
    my ($value, $units, $author) = @_;

    my @commits;
    foreach my $i (0..($value - 1)) {
        my $cmd = "git log " .
                  "--author=${author} " .
                  "--before='${i} ${units}' " . 
                  "--after='" . ($i + 1) . " ${units}' " .
                  "--format=oneline | wc -l";



( run in 0.559 second using v1.01-cache-2.11-cpan-437f7b0c052 )