| 1 | #! /usr/bin/perl |
| 2 | |
| 3 | my (%Y, %M); |
| 4 | open my $fh, "-|", "git", "log", |
| 5 | "--date=format:%Y", "--pretty=format:%ad %aN", @ARGV |
| 6 | or die "git log: $!"; |
| 7 | while (<$fh>) { |
| 8 | /(\d+)\s+(.*)$/ or die "wtf? $_"; |
| 9 | my ($y, $who) = ($1, $2); |
| 10 | push @{$Y{$who}}, $y; |
| 11 | if (!exists $M{$who} || $y < $M{$who}) { $M{$who} = $y; } |
| 12 | } |
| 13 | close $fh or die "git log (rc = $?)"; |
| 14 | |
| 15 | my ($S, $O, $L); |
| 16 | sub out () { |
| 17 | defined $L or return; |
| 18 | defined $S and $S .= ", "; |
| 19 | if ($O < $L - 1) { $S .= "$O--$L" } |
| 20 | elsif ($O != $L) { $S .= "$O, $L" } |
| 21 | else { $S .= "$L" } |
| 22 | } |
| 23 | |
| 24 | for my $who (sort { $M{$a} <=> $M{$b} } keys %Y) { |
| 25 | my @y = sort { $a <=> $b } @{$Y{$who}}; |
| 26 | undef $S; undef $L; |
| 27 | for my $y (@y) { |
| 28 | if (!defined $L) { $O = $L = $y; } |
| 29 | elsif ($y == $L + 1) { $L = $y; } |
| 30 | elsif ($y != $L) { out(); $O = $L = $y; } |
| 31 | } |
| 32 | out(); |
| 33 | print "$who: $S\n" |
| 34 | } |