contrib / stats / mailmap.plon commit Merge branch 'nd/switch-and-restore' (f496b06)
   1#!/usr/bin/perl
   2
   3use warnings 'all';
   4use strict;
   5use Getopt::Long;
   6
   7my $match_emails;
   8my $match_names;
   9my $order_by = 'count';
  10Getopt::Long::Configure(qw(bundling));
  11GetOptions(
  12        'emails|e!' => \$match_emails,
  13        'names|n!'  => \$match_names,
  14        'count|c'   => sub { $order_by = 'count' },
  15        'time|t'    => sub { $order_by = 'stamp' },
  16) or exit 1;
  17$match_emails = 1 unless $match_names;
  18
  19my $email = {};
  20my $name = {};
  21
  22open(my $fh, '-|', "git log --format='%at <%aE> %aN'");
  23while(<$fh>) {
  24        my ($t, $e, $n) = /(\S+) <(\S+)> (.*)/;
  25        mark($email, $e, $n, $t);
  26        mark($name, $n, $e, $t);
  27}
  28close($fh);
  29
  30if ($match_emails) {
  31        foreach my $e (dups($email)) {
  32                foreach my $n (vals($email->{$e})) {
  33                        show($n, $e, $email->{$e}->{$n});
  34                }
  35                print "\n";
  36        }
  37}
  38if ($match_names) {
  39        foreach my $n (dups($name)) {
  40                foreach my $e (vals($name->{$n})) {
  41                        show($n, $e, $name->{$n}->{$e});
  42                }
  43                print "\n";
  44        }
  45}
  46exit 0;
  47
  48sub mark {
  49        my ($h, $k, $v, $t) = @_;
  50        my $e = $h->{$k}->{$v} ||= { count => 0, stamp => 0 };
  51        $e->{count}++;
  52        $e->{stamp} = $t unless $t < $e->{stamp};
  53}
  54
  55sub dups {
  56        my $h = shift;
  57        return grep { keys($h->{$_}) > 1 } keys($h);
  58}
  59
  60sub vals {
  61        my $h = shift;
  62        return sort {
  63                $h->{$b}->{$order_by} <=> $h->{$a}->{$order_by}
  64        } keys($h);
  65}
  66
  67sub show {
  68        my ($n, $e, $h) = @_;
  69        print "$n <$e> ($h->{$order_by})\n";
  70}