'git spark -days 30 Batman' gives you a sparkline graph of Batman's commit history over the last 30 days
#!/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/; | |
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); | |
my $max = max @data; | |
my $sparkArgs = $scale | |
? join(" ", $scale, 0, @data) | |
: join(" ", @data); | |
print "Commits by $author over the last $value $units\n"; | |
print "total: $total avg: $avg max: $max\n"; | |
print join(" ", @data) . "\n"; | |
my $out = `spark $sparkArgs`; | |
my $utf8out = decode('utf8', $out); | |
print encode('utf8', substr($utf8out, 2)); | |
} | |
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"; | |
my $count = `$cmd`; | |
chomp($count); | |
push @commits, $count; | |
} | |
return reverse @commits; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This comment has been minimized.
I decided to make put this in a real repo. If you have any suggestions or pull requests please do it over here: https://github.com/kablamo/git-spark