Skip to content

Instantly share code, notes, and snippets.

Last active December 11, 2015 12:08
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
What would you like to do?
'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:
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} &&
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`;
push @commits, $count;
return reverse @commits;
Copy link

kablamo commented Jan 30, 2013

I decided to make put this in a real repo. If you have any suggestions or pull requests please do it over here:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment