Last active
December 11, 2015 12:08
-
-
Save kablamo/4598480 to your computer and use it in GitHub Desktop.
'git spark -days 30 Batman' gives you a sparkline graph of Batman's commit history over the last 30 days
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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
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