#! /usr/bin/perl my (%Y, %M); open my $fh, "-|", "git", "log", "--date=format:%Y", "--pretty=format:%ad %aN", @ARGV or die "git log: $!"; while (<$fh>) { /(\d+)\s+(.*)$/ or die "wtf? $_"; my ($y, $who) = ($1, $2); push @{$Y{$who}}, $y; if (!exists $M{$who} || $y < $M{$who}) { $M{$who} = $y; } } close $fh or die "git log (rc = $?)"; my ($S, $O, $L); sub out () { defined $L or return; defined $S and $S .= ", "; if ($O < $L - 1) { $S .= "$O--$L" } elsif ($O != $L) { $S .= "$O, $L" } else { $S .= "$L" } } for my $who (sort { $M{$a} <=> $M{$b} } keys %Y) { my @y = sort { $a <=> $b } @{$Y{$who}}; undef $S; undef $L; for my $y (@y) { if (!defined $L) { $O = $L = $y; } elsif ($y == $L + 1) { $L = $y; } elsif ($y != $L) { out(); $O = $L = $y; } } out(); print "$who: $S\n" }