#!/usr/bin/perl -w use strict; my ($author, $desc, %map); my $pstate = 1; while (<>) { # skip to '^commit ' if ($pstate == 1) { next unless /^commit /; $pstate++; } # get author elsif ($pstate == 2) { next unless /^author (.*) \S+ \S+ \S+ \S+ \S+ \S+\s*$/; $author = $1; $pstate++; } # skip to blank line elsif ($pstate == 3) { next unless /^\s*$/; $pstate++; } # skip to non-blank line elsif ($pstate == 4) { next if /^\s*$/; chomp; $desc = $_; &shortlog_entry($author, $desc); $pstate = 1; } else { die "invalid parse state $pstate"; } } &shortlog_output; exit(0); sub shortlog_entry($$) { my ($tmp_author, $tmp_desc) = @_; my ($obj); $tmp_desc =~ s#/pub/scm/linux/kernel/git/#/.../#g; $tmp_desc =~ s/^\[PATCH] //g; $tmp_desc =~ s/^\s+//g; if (exists $map{$tmp_author}) { # grab ref $obj = $map{$tmp_author}; # add desc to array push(@$obj, $tmp_desc); } else { # create ref to new array my @arr = ($tmp_desc); $obj = \@arr; # store new entry in author map $map{$tmp_author} = $obj; } } sub shortlog_output { my ($obj); foreach $author (sort keys %map) { print "$author:\n"; $obj = $map{$author}; foreach $desc (@$obj) { print " $desc\n"; } print "\n"; } }