This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Portability fix for Test::Simple 'do' test.
[perl5.git] / Porting / checkAUTHORS.pl
1 #!/usr/bin/perl -w
2 use strict;
3 my ($committer, $patch, $author);
4 use utf8;
5 use Getopt::Long;
6 use Unicode::Collate;
7 use Text::Wrap;
8 $Text::Wrap::columns = 80;
9
10 my ($rank, $ta, $ack, $who, $tap) = (0) x 5;
11 my ($author_file, $percentage, $cumulative, $reverse);
12 my (%authors, %untraced, %patchers, %committers, %real_names);
13
14 my $result = GetOptions (
15              # modes
16              "who"            => \$who,
17              "rank"           => \$rank,
18              "thanks-applied" => \$ta,
19              "missing"        => \$ack ,
20              "tap"            => \$tap,
21
22              # modifiers
23              "authors=s"      => \$author_file,
24              "percentage"     => \$percentage,      # show as %age
25              "cumulative"     => \$cumulative,
26              "reverse"        => \$reverse,
27             );
28
29 if (!$result or ( $rank + $ta + $who + $ack + $tap != 1 ) or !@ARGV) {
30     usage();
31 }
32
33 $author_file ||= './AUTHORS';
34 die "Can't locate '$author_file'. Specify it with '--authors <path>'."
35   unless -f $author_file;
36
37 my $map = generate_known_author_map();
38
39 read_authors_files($author_file);
40
41
42 if ($rank) {
43   parse_commits_from_stdin();
44   display_ordered(\%patchers);
45 } elsif ($ta) {
46   parse_commits_from_stdin();
47   display_ordered(\%committers);
48 } elsif ($tap) {
49   parse_commits_from_stdin_authors();
50   display_test_output(\%patchers, \%authors, \%real_names);
51 } elsif ($ack) {
52   parse_commits_from_stdin();
53   display_missing_authors(\%patchers, \%authors, \%real_names);
54 } elsif ($who) {
55   parse_commits_from_stdin();
56   list_authors(\%patchers, \%authors);
57 }
58
59 exit(0);
60
61 sub usage {
62
63   die <<"EOS";
64 Usage: $0 [modes] [modifiers] <git-log-output-file>
65
66 Modes (use only one):
67    --who                          # show list of unique authors by full name
68    --rank                         # rank authors by patches
69    --thanks-applied               # ranks committers of others' patches
70    --missing                      # display authors not in AUTHORS
71    --tap                          # show authors present/missing as TAP
72
73 Modifiers:
74    --authors <authors-file>       # path to authors file (default: ./AUTHORS)
75    --percentage                   # show rankings as percentages
76    --cumulative                   # show rankings cumulatively
77    --reverse                      # show rankings in reverse
78
79 Generate git-log-output-file with git log --pretty=fuller rev1..rev2
80 (or pipe by specifying '-' for stdin).  For example:
81   \$ git log --pretty=fuller v5.12.0..v5.12.1 > gitlog
82   \$ perl Porting/checkAUTHORS.pl --rank --percentage gitlog
83 EOS
84 }
85
86 sub list_authors {
87     my ($patchers, $authors) = @_;
88     binmode(STDOUT, ":utf8");
89     print wrap '', '', join(', ', Unicode::Collate->new(level => 1)->sort(
90                       map { $authors->{$_} }
91                       keys %$patchers)) . ".\n";
92 }
93
94 sub parse_commits_from_stdin {
95     my @lines = split( /^commit\s*/sm, join( '', <> ) );
96     for (@lines) {
97         next if m/^$/;
98         next if m/^(\S*?)^Merge:/ism;    # skip merge commits
99         if (m/^(.*?)^Author:\s*(.*?)^AuthorDate:\s*.*?^Commit:\s*(.*?)^(.*)$/gism) {
100
101             # new patch
102             ( $patch, $author, $committer ) = ( $1, $2, $3 );
103             chomp($author);
104             unless ($author) { die $_ }
105             chomp($committer);
106             unless ($committer) { die $_ }
107             process( $committer, $patch, $author );
108         } else {
109             die "XXX $_ did not match";
110         }
111     }
112
113 }
114
115 # just grab authors. Quicker than parse_commits_from_stdin
116
117 sub parse_commits_from_stdin_authors {
118     while (<>) {
119         next unless /^Author:\s*(.*)$/;
120         my $author = $1;
121         $author = _raw_address($author);
122         $patchers{$author}++;
123     }
124 }
125
126
127 sub generate_known_author_map {
128     my %map;
129
130     my $prev = "";
131     while (<DATA>) {
132         chomp;
133         s/\\100/\@/g;
134         $_ = lc;
135         if ( my ( $correct, $alias ) = /^\s*([^#\s]\S*)\s+(.*\S)/ ) {
136             $correct =~ s/^\\043/#/;
137             if   ( $correct eq '+' ) { $correct = $prev }
138             else                     { $prev    = $correct }
139             $map{$alias} = $correct;
140         }
141     }
142
143     #
144     # Email addresses for we do not have names.
145     #
146     $map{$_} = "?"
147         for
148         "bah\100longitude.com",
149         "bbucklan\100jpl-devvax.jpl.nasa.gov",
150         "bilbo\100ua.fm",
151         "bob\100starlabs.net",
152         "cygwin\100cygwin.com",
153         "david\100dhaller.de", "erik\100cs.uni-jena.de", "info\100lingo.kiev.ua",    # Lingo Translation agency
154         "jms\100mathras.comcast.net",
155         "premchai21\100yahoo.com",
156         "pxm\100nubz.org",
157         "raf\100tradingpost.com.au",
158         "smoketst\100hp46t243.cup.hp.com", "root\100chronos.fi.muni.cz",             # no clue - jrv 20090803
159         "gomar\100md.media-web.de",    # no clue - jrv 20090803
160         "data-drift\100so.uio.no",     # no data. originally private message from 199701282014.VAA12645@selters.uio.no
161         "arbor\100al37al08.telecel.pt"
162         ,    # reported perlbug ticket 5196 - no actual code contribution. no real name - jrv 20091006
163         "oracle\100pcr8.pcr.com",    # Reported perlbug ticket 1015 - no patch - Probably Ed Eddington ed@pcr.com
164         "snaury\100gmail.com",       # Reported cpan ticket 35943, with patch for fix
165         ;
166
167     #
168     # Email addresses for people that don't have an email address in AUTHORS
169     # Presumably deliberately?
170     #
171
172     $map{$_} = '!' for
173
174         # Nick Ing-Simmons has passed away (2006-09-25).
175         "nick\100ing-simmons.net",
176         "nik\100tiuk.ti.com",
177         "nick.ing-simmons\100elixent.com",
178         "nick\100ni-s.u-net.com",
179         "nick.ing-simmons\100tiuk.ti.com",
180
181         # Iain Truskett has passed away (2003-12-29).
182         "perl\100dellah.anu.edu.au", "spoon\100dellah.org", "spoon\100cpan.org",
183
184         # Ton Hospel
185         "me-02\100ton.iguana.be", "perl-5.8.0\100ton.iguana.be", "perl5-porters\100ton.iguana.be",
186
187         # Beau Cox
188         "beau\100beaucox.com",
189
190         # Randy W. Sims
191         "ml-perl\100thepierianspring.org",
192
193         # perl internal addresses
194         "perl5-porters\100africa.nicoh.com",
195         "perlbug\100perl.org",,
196         "perl5-porters.nicoh.com",
197         "perlbug-followup\100perl.org",
198         "perlbug-comment\100perl.org",
199         "bug-module-corelist\100rt.cpan.org",
200         "bug-storable\100rt.cpan.org",
201         "bugs-perl5\100bugs6.perl.org",
202         "unknown",
203         "unknown\100unknown",
204         "unknown\100longtimeago",
205         "unknown\100perl.org",
206         "",
207         "(none)",
208         ;
209
210     return \%map;
211 }
212
213 sub read_authors_files {
214     my @authors = (@_);
215     return unless (@authors);
216     my (%count, %raw);
217     foreach my $filename (@authors) {
218         open FH, '<', $filename or die "Can't open $filename: $!";
219         binmode FH, ':encoding(UTF-8)';
220         while (<FH>) {
221             next if /^\#/;
222             next if /^-- /;
223             if (/^([^<]+)<([^>]+)>/) {
224                 # Easy line.
225                 my ($name, $email) = ($1, $2);
226                 $name =~ s/\s*\z//;
227                 $raw{$email} = $name;
228                 $count{$email}++;
229             } elsif (/^([- .'\w]+)[\t\n]/) {
230
231                 # Name only
232                 $untraced{$1}++;
233             } elsif ( length $_ ) {
234                 chomp;
235                 warn "Can't parse line '$_'";
236             } else {
237                 next;
238             }
239         }
240     }
241     foreach ( keys %raw ) {
242         print "E-mail $_ occurs $count{$_} times\n" if $count{$_} > 1;
243         my $lc = lc $_;
244         $authors{ $map->{$lc} || $lc } = $raw{$_};
245     }
246     $authors{$_} = $_ for qw(? !);
247 }
248
249 sub display_test_output {
250     my $patchers   = shift;
251     my $authors    = shift;
252     my $real_names = shift;
253     my $count = 0;
254     printf "1..%d\n", scalar keys %$patchers;
255     foreach ( sort keys %$patchers ) {
256         $count++;
257         if ($authors->{$_}) {
258             print "ok $count - ".$real_names->{$_} ." $_\n";
259         } else {
260             print "not ok $count - Contributor not found in AUTHORS: $_ ".($real_names->{$_} || '???' )."\n";
261             print STDERR ($real_names->{$_} || '???' )." <$_> not found in AUTHORS\n";
262         }
263
264     }
265 }
266
267 sub display_missing_authors {
268     my $patchers   = shift;
269     my $authors    = shift;
270     my $real_names = shift;
271     my %missing;
272     foreach ( sort keys %$patchers ) {
273         next if $authors->{$_};
274
275         # Sort by number of patches, then name.
276         $missing{ $patchers{$_} }->{$_}++;
277     }
278     foreach my $patches ( sort { $b <=> $a } keys %missing ) {
279         print "\n\n=head1 $patches patch(es)\n\n";
280         foreach my $author ( sort keys %{ $missing{$patches} } ) {
281             my $xauthor = $author;
282             $xauthor =~ s/@/\\100/g;    # xxx temp hack
283             print "" . ( $real_names->{$author} || $author ) . "\t\t\t<" . $xauthor . ">\n";
284         }
285     }
286 }
287
288 sub display_ordered {
289     my $what = shift;
290     my @sorted;
291     my $total;
292
293     while ( my ( $name, $count ) = each %$what ) {
294         push @{ $sorted[$count] }, $name;
295         $total += $count;
296     }
297
298     my $i = @sorted;
299     return unless @sorted;
300     my $sum = 0;
301     foreach my $i ( $reverse ? 0 .. $#sorted : reverse 0 .. $#sorted ) {
302         next unless $sorted[$i];
303         my $prefix;
304         $sum += $i * @{ $sorted[$i] };
305
306         # Value to display is either this one, or the cumulative sum.
307         my $value = $cumulative ? $sum : $i;
308         if ($percentage) {
309             $prefix = sprintf "%6.2f:\t", 100 * $value / $total;
310         } else {
311             $prefix = "$value:\t";
312         }
313         print wrap ( $prefix, "\t", join( " ", sort @{ $sorted[$i] } ), "\n" );
314     }
315 }
316
317 sub process {
318     my ( $committer, $patch, $author ) = @_;
319     return unless $author;
320     return unless $committer;
321
322     $author = _raw_address($author);
323     $patchers{$author}++;
324
325     $committer = _raw_address($committer);
326     if ( $committer ne $author ) {
327
328         # separate commit credit only if committing someone else's patch
329         $committers{$committer}++;
330     }
331 }
332
333 sub _raw_address {
334     my $addr = shift;
335     my $real_name;
336     if ($addr =~ /(?:\\?")?\s*\(via RT\) <perlbug-followup\@perl\.org>$/p) {
337         my $name = ${^PREMATCH};
338         $addr = 'perlbug-followup@perl.org';
339         #
340         # Try to find the author
341         #
342         if (exists $map->{$name}) {
343             $addr = $map->{$name};
344             $real_name = $authors{$addr};
345         }
346         else {
347             while (my ($email, $author_name) = each %authors) {
348                 if ($name eq $author_name) {
349                     $addr = $email;
350                     $real_name = $name;
351                     last;
352                 }
353             }
354         }
355     }
356     elsif ( $addr =~ /<.*>/ ) {
357         $addr =~ s/^\s*(.*)\s*<\s*(.*?)\s*>.*$/$2/;
358         $real_name = $1;
359     }
360     $addr =~ s/\[mailto://;
361     $addr =~ s/\]//;
362     $addr = lc $addr;
363     $addr = $map->{$addr} || $addr;
364     $addr =~ s/\\100/@/g;    # Sometimes, there are encoded @ signs in the git log.
365
366     if ($real_name) { $real_names{$addr} = $real_name }
367     return $addr;
368 }
369
370
371 __DATA__
372
373 #
374 # List of mappings. First entry the "correct" email address, as appears
375 # in the AUTHORS file. Second is any "alias" mapped to it.
376 #
377 # If the "correct" email address is a '+', the entry above it is reused;
378 # this for addresses with more than one alias.
379 #
380 # Note that all entries are in lowercase. Further, no '@' signs should
381 # appear; use \100 instead.
382 #
383 #
384 #  Committers.
385 #
386 adi                                     enache\100rdslink.ro
387 alanbur                                 alan.burlison\100sun.com
388 +                                       alan.burlison\100uk.sun.com
389 +                                       aburlison\100cix.compulink.co.uk
390 ams                                     ams\100toroid.org
391 +                                       ams\100wiw.org
392 chip                                    chip\100pobox.com
393 +                                       chip\100perl.com
394 +                                       salzench\100nielsenmedia.com
395 +                                       chip\100atlantic.net
396 +                                       chip\100rio.atlantic.net
397 +                                       salzench\100dun.nielsen.com
398 +                                       chip\100ci005.sv2.upperbeyond.com
399 craigb                                  craig.berry\100psinetcs.com
400 +                                       craig.berry\100metamorgs.com
401 +                                       craig.berry\100signaltreesolutions.com
402 +                                       craigberry\100mac.com
403 +                                       craig.a.berry\100gmail.com
404 +                                       craig a. berry)
405 davem                                   davem\100fdgroup.com
406 +                                       davem\100iabyn.nospamdeletethisbit.com
407 +                                       davem\100iabyn.com
408 +                                       davem\100fdgroup.co.uk
409 +                                       davem\100fdisolutions.com
410 +                                       davem\100iabyn.com
411 demerphq                                demerphq\100gmail.com
412 +                                       yves.orton\100de.mci.com
413 +                                       yves.orton\100mciworldcom.de
414 +                                       yves.orton\100booking.com
415 +                                       demerphq\100dromedary.booking.com
416 +                                       demerphq\100gemini.(none)
417 +                                       demerphq\100camel.booking.com
418 +                                       demerphq\100hotmail.com
419 doughera                                doughera\100lafayette.edu
420 +                                       doughera\100lafcol.lafayette.edu
421 +                                       doughera\100fractal.phys.lafayette.edu
422 +                                       doughera.lafayette.edu
423 +                                       doughera\100newton.phys.lafayette.edu
424
425 gbarr                                   gbarr\100pobox.com
426 +                                       bodg\100tiuk.ti.com
427 +                                       gbarr\100ti.com
428 +                                       graham.barr\100tiuk.ti.com
429 +                                       gbarr\100monty.mutatus.co.uk
430 gisle                                   gisle\100activestate.com
431 +                                       gisle\100aas.no
432 +                                       aas\100aas.no
433 +                                       aas\100bergen.sn.no
434 gsar                                    gsar\100activestate.com
435 +                                       gsar\100cpan.org
436 +                                       gsar\100engin.umich.edu
437 hv                                      hv\100crypt.compulink.co.uk
438 +                                       hv\100crypt.org
439 +                                       hv\100iii.co.uk
440 jhi                                     jhi\100iki.fi
441 +                                       jhietaniemi\100gmail.com
442 +                                       jhi\100kosh.hut.fi
443 +                                       jhi\100alpha.hut.fi
444 +                                       jhi\100cc.hut.fi
445 +                                       jhi\100hut.fi
446 +                                       jarkko.hietaniemi\100nokia.com
447 +                                       jarkko.hietaniemi\100cc.hut.fi
448 +                                       jarkko.hietaniemi\100booking.com
449 jesse                                   jesse\100bestpractical.com
450 +                                       jesse\100fsck.com
451 +                                       jesse\100perl.org
452 merijn                                  h.m.brand\100xs4all.nl
453 +                                       h.m.brand\100hccnet.nl
454 +                                       merijn\100l1.procura.nl
455 +                                       merijn\100a5.(none)
456 mhx                                     mhx-perl\100gmx.net
457 +                                       mhx\100r2d2.(none)
458 mst                                     mst\100shadowcat.co.uk
459 +                                       matthewt\100hercule.scsys.co.uk
460 nicholas                                nick\100unfortu.net
461 +                                       nick\100ccl4.org
462 +                                       nick\100talking.bollo.cx
463 +                                       nick\100plum.flirble.org
464 +                                       nick\100babyhippo.co.uk
465 +                                       nick\100bagpuss.unfortu.net
466 +                                       nick\100babyhippo.com
467 +                                       nicholas\100dromedary.ams6.corp.booking.com
468 +                                       Nicholas Clark (sans From field in mail header)
469 pudge                                   pudge\100pobox.com
470 rgs                                     rgarciasuarez\100free.fr
471 +                                       rgarciasuarez\100mandrakesoft.com
472 +                                       rgarciasuarez\100mandriva.com
473 +                                       rgarciasuarez\100gmail.com
474 +                                       raphel.garcia-suarez\100hexaflux.com
475 +                                       rgs@consttype.org
476 sky                                     sky\100nanisky.com
477 +                                       artur\100contiller.se
478 +                                       arthur\100contiller.se
479 smueller                                7k8lrvf02\100sneakemail.com
480 +                                       kjx9zthh3001\100sneakemail.com
481 +                                       dtr8sin02\100sneakemail.com
482 +                                       rt8363b02\100sneakemail.com
483 +                                       o6hhmk002\100sneakemail.com
484 +                                       smueller\100cpan.org
485 +                                       l2ot9pa02\100sneakemail.com
486 +                                       wyp3rlx02\100sneakemail.com
487 +                                       0mgwtfbbq\100sneakemail.com
488 +                                       xyey9001\100sneakemail.com
489 steveh                                  steve.m.hay\100googlemail.com
490 +                                       stevehay\100planit.com
491 +                                       steve.hay\100uk.radan.com
492 stevep                                  steve\100fisharerojo.org
493 +                                       steve.peters\100gmail.com
494 +                                       root\100dixie.cscaper.com
495 timb                                    Tim.Bunce\100pobox.com
496 +                                       tim.bunce\100ig.co.uk
497 tonyc                                   tony\100develop-help.com
498 +                                       tony\100openbsd32.tony.develop-help.com
499 +                                       tony\100saturn.(none)
500
501 #
502 # Mere mortals.
503 #
504 \043####\100juerd.nl                    juerd\100cpan.org
505 +                                       juerd\100c3.convolution.nl
506 +                                       juerd\100convolution.nl
507 a.r.ferreira\100gmail.com               aferreira\100shopzilla.com
508 abe\100ztreet.demon.nl                  abeltje\100cpan.org
509 abela\100hsc.fr                         abela\100geneanet.org
510 abigail\100abigail.be                   abigail\100foad.org
511 +                                       abigail\100abigail.nl
512 +                                       abigail\100fnx.com
513 aburt\100isis.cs.du.edu                 isis!aburt
514 ach\100mpe.mpg.de                       ach\100rosat.mpe-garching.mpg.de
515 adavies\100ptc.com                      alex.davies\100talktalk.net
516 ajohnson\100nvidia.com                  ajohnson\100wischip.com
517 +                                       anders\100broadcom.com
518 alexm\100netli.com                      alexm\100w-m.ru
519 alex-p5p\100earth.li                    alex\100rcon.rog
520 alexmv\100mit.edu                       alex\100chmrr.net
521 alian\100cpan.org                       alian\100alianwebserver.com
522 allen\100grumman.com                    allen\100gateway.grumman.com
523 allen\100huarp.harvard.edu              nort\100bottesini.harvard.edu
524 +                                       nort\100qnx.com
525 allens\100cpan.org                      easmith\100beatrice.rutgers.edu
526 +                                       root\100dogberry.rutgers.edu
527 andreas.koenig\100anima.de              andreas.koenig.gmwojprw\100franz.ak.mind.de
528 +                                       andreas.koenig.7os6vvqr\100franz.ak.mind.de
529 +                                       a.koenig\100mind.de
530 +                                       k\100anna.in-berlin.de
531 +                                       andk\100cpan.org
532 +                                       koenig\100anna.mind.de
533 +                                       k\100anna.mind.de
534 +                                       root\100ak-71.mind.de
535 +                                       root\100ak-75.mind.de
536 +                                       k\100sissy.in-berlin.de
537 +                                       a.koenig\100kulturbox.de
538 +                                       k\100sissy.in-berlin.de
539 +                                       root\100dubravka.in-berlin.de
540 anno4000\100lublin.zrz.tu-berlin.de     anno4000\100mailbox.tu-berlin.de
541 +                                       siegel\100zrz.tu-berlin.de
542 apocal@cpan.org                         perl\1000ne.us
543 arnold\100gnu.ai.mit.edu                arnold\100emoryu2.arpa
544 +                                       gatech!skeeve!arnold
545 arodland\100cpan.org                    andrew\100hbslabs.com
546 arussell\100cs.uml.edu                  adam\100adam-pc.(none)
547 ash\100cpan.org                         ash_cpan\100firemirror.com
548 avarab\100gmail.com                     avar\100cpan.org
549
550 bailey\100newman.upenn.edu              bailey\100hmivax.humgen.upenn.edu
551 +                                       bailey\100genetics.upenn.edu
552 +                                       bailey.charles\100gmail.com
553 bah\100ecnvantage.com                   bholzman\100longitude.com
554 barries\100slaysys.com                  root\100jester.slaysys.com
555 bkedryna\100home.com                    bart\100cg681574-a.adubn1.nj.home.com
556 bcarter\100gumdrop.flyinganvil.org      q.eibcartereio.=~m-b.{6}-cgimosx\100gumdrop.flyinganvil.org
557 ben_tilly\100operamail.com              btilly\100gmail.com
558 +                                       ben_tilly\100hotmail.com
559 ben\100morrow.me.uk                     mauzo\100csv.warwick.ac.uk
560 +                                       mauzo\100.(none)
561 bepi\100perl.it                         enrico.sorcinelli\100gmail.com
562 bert\100alum.mit.edu                    bert\100genscan.com
563 bigbang7\100gmail.com                   ddascalescu+github\100gmail.com
564 blgl\100stacken.kth.se                  blgl\100hagernas.com
565 +                                       2bfjdsla52kztwejndzdstsxl9athp\100gmail.com
566 brian.d.foy\100gmail.com                bdfoy\100cpan.org
567 BQW10602\100nifty.com                   sadahiro\100cpan.org
568 bulk88\100hotmail.com                   bulk88
569
570 chad.granum\100dreamhost.com            exodist7\100gmail.com
571 choroba\100cpan.org                     choroba\100weed.(none)
572 chromatic\100wgz.org                    chromatic\100rmci.net
573 ckuskie\100cadence.com                  colink\100perldreamer.com
574 claes\100surfar.nu                      claes\100versed.se
575 clintp\100geeksalad.org                 cpierce1\100ford.com
576 clkao\100clkao.org                      clkao\100bestpractical.com
577 corion\100corion.net                    corion\100cpan.org
578 cp\100onsitetech.com                    publiustemp-p5p\100yahoo.com
579 +                                       publiustemp-p5p3\100yahoo.com
580 cpan\100audreyt.org                     autrijus\100egb.elixus.org
581 +                                       autrijus\100geb.elixus.org
582 +                                       autrijus\100gmail.com
583 +                                       autrijus\100ossf.iis.sinica.edu.tw
584 +                                       autrijus\100autrijus.org
585 +                                       audreyt\100audreyt.org
586 cpan\100ton.iguana.be                   me-01\100ton.iguana.be
587 crt\100kiski.net                        perl\100ctweten.amsite.com
588
589 dairiki\100dairiki.org                  dairiki at dairiki.org
590 dagolden\100cpan.org                    xdaveg\100gmail.com
591 +                                       xdg\100xdg.me
592 damian\100conway.org                    damian\100cs.monash.edu.au
593 dan\100sidhe.org                        sugalsd\100lbcc.cc.or.us
594 +                                       sugalskd\100osshe.edu
595 daniel\100bitpusher.com                 daniel\100biz.bitpusher.com
596 dave\100mag-sol.com                     dave\100dave.org.uk
597 david.dyck\100fluke.com                 dcd\100tc.fluke.com
598 david\100justatheory.com                david\100wheeler.net
599 +                                       david\100kineticode.com
600 +                                       david\100wheeler.com
601 +                                       david\100wheeler.net
602 whatever\100davidnicol.com              davidnicol\100gmail.com
603 dennis\100booking.com                   dennis\100camel.ams6.corp.booking.com
604 +                                       dennis.kaarsemaker\100booking.com
605 +                                       dennis\100kaarsemaker.net
606 dev-perl\100pimb.org                    knew-p5p\100pimb.org
607 +                                       lists-p5p\100pimb.org
608 djberg86\100attbi.com                   djberg96\100attbi.com
609 dk\100tetsuo.karasik.eu.org             dmitry\100karasik.eu.org
610 domo\100computer.org                    shouldbedomo\100mac.com
611 +                                       domo\100slipper.ip.lu
612 +                                       domo\100tcp.ip.lu
613 dougm\100covalent.net                   dougm\100opengroup.org
614 +                                       dougm\100osf.org
615 dougw\100cpan.org                       doug_wilson\100intuit.com
616 dwegscheid\100qtm.net                   wegscd\100whirlpool.com
617 edwardp\100excitehome.net               epeschko\100den-mdev1
618 +                                       epeschko\100elmer.tci.com
619 +                                       esp5\100pge.com
620 egf7\100columbia.edu                    efifer\100sanwaint.com
621 eggert\100twinsun.com                   eggert\100sea.sm.unisys.com
622 etj\100cpan.org                         mohawk2\100users.noreply.github.com
623
624 fugazi\100zyx.net                       larrysh\100cpan.org
625 +                                       lshatzer\100islanddata.com
626
627 gbacon\100itsc.uah.edu                  gbacon\100adtrn-srv4.adtran.com
628 gerberb\100zenez.com                    root\100devsys0.zenez.com
629 gfuji\100cpan.org                       g.psy.va\100gmail.com
630 gerard\100ggoossen.net                  gerard\100tty.nl
631 gibreel\100pobox.com                    stephen.zander\100interlock.mckesson.com
632 +                                       srz\100loopback
633 gideon\100cpan.org                      gidisrael\100gmail.com
634 gnat\100frii.com                        gnat\100prometheus.frii.com
635 gp\100familiehaase.de                   gerrit\100familiehaase.de
636 grazz\100pobox.com                      grazz\100nyc.rr.com
637 gward\100ase.com                        greg\100bic.mni.mcgill.ca
638 haggai\100cpan.org                      alanhaggai\100alanhaggai.org
639 +                                       alanhaggai\100gmail.com
640 hansmu\100xs4all.nl                     hansm\100icgroup.nl
641 +                                       hansm\100icgned.nl
642 +                                       hans\100icgned.nl
643 +                                       hans\100icgroup.nl
644 +                                       hansm\100euronet.nl
645 +                                       hansm\100euro.net
646 hio\100ymir.co.jp                       hio\100hio.jp
647 hops\100sco.com                         hops\100scoot.pdev.sco.com
648
649 ian.goodacre\100xtra.co.nz              ian\100debian.lan
650 ingo_weinhold\100gmx.de                 bonefish\100cs.tu-berlin.de
651
652 james\100mastros.biz                    theorb\100desert-island.me.uk
653 jan\100jandubois.com                    jand\100activestate.com
654 +                                       jan.dubois\100ibm.net
655 japhy\100pobox.com                      japhy\100pobox.org
656 +                                       japhy\100perlmonk.org
657 +                                       japhy\100cpan.org
658 +                                       jeffp\100crusoe.net
659 jari.aalto\100poboxes.com               jari.aalto\100cante.net
660 jarausch\100numa1.igpm.rwth-aachen.de   helmutjarausch\100unknown
661 jasons\100cs.unm.edu                    jasons\100sandy-home.arc.unm.edu
662 jbuehler\100hekimian.com                jhpb\100hekimian.com
663 jcromie\100100divsol.com                jcromie\100cpan.org
664 +                                       jim.cromie\100gmail.com
665 jd\100cpanel.net                        lightsey\100debian.org
666 jdhedden\100cpan.org                    jerry\100hedden.us
667 +                                       jdhedden\1001979.usna.com
668 +                                       jdhedden\100gmail.com
669 +                                       jdhedden\100yahoo.com
670 +                                       jhedden\100pn100-02-2-356p.corp.bloomberg.com
671 +                                       jdhedden\100solydxk
672 jeremy\100zawodny.com                   jzawodn\100wcnet.org
673 jesse\100sig.bsh.com                    jesse\100ginger
674 jfriedl\100yahoo.com                    jfriedl\100yahoo-inc.com
675 jfs\100fluent.com                       jfs\100jfs.fluent.com
676 jhannah\100mutationgrid.com             jay\100jays.net
677 +                                       jhannah\100omnihotels.com
678 jidanni\100jidanni.org                  jidanni\100hoffa.dreamhost.com
679 jjore\100cpan.org                       twists\100gmail.com
680 jkeenan\100cpan.org                     jkeen\100verizon.net
681 +                                       jkeenan\100dromedary-001.ams6.corp.booking.com
682 jns\100integration-house.com            jns\100gellyfish.com
683 +                                       gellyfish\100gellyfish.com
684 john\100atlantech.com                   john\100titanic.atlantech.com
685 john\100johnwright.org                  john.wright\100hp.com
686 joseph\100cscaper.com                   joseph\1005sigma.com
687 joshua\100rodd.us                       jrodd\100pbs.org
688 jtobey\100john-edwin-tobey.org          jtobey\100user1.channel1.com
689 jpeacock\100messagesystems.com          john.peacock\100havurah-software.org
690 +                                       jpeacock\100havurah-software.org
691 +                                       jpeacock\100dsl092-147-156.wdc1.dsl.speakeasy.net
692 +                                       jpeacock\100jpeacock-hp.doesntexist.org
693 +                                       jpeacock\100cpan.org
694 +                                       jpeacock\100rowman.com
695 james.schneider\100db.com               jschneid\100netilla.com
696 jpl.jpl\100gmail.com                    jpl\100research.att.com
697 jql\100accessone.com                    jql\100jql.accessone.com
698 jsm28\100hermes.cam.ac.uk               jsm28\100cam.ac.uk
699
700 kane\100dwim.org                        kane\100xs4all.net
701 +                                       kane\100cpan.org
702 +                                       kane\100xs4all.nl
703 +                                       jos\100dwim.org
704 +                                       jib\100ripe.net
705 keith.s.thompson\100gmail.com           kst\100mib.org
706 ken\100mathforum.org                    kenahoo\100gmail.com
707 +                                       ken.williams\100thomsonreuters.com
708 kentfredric\100gmail.com                kentnl\100cpan.org
709 kmx\100volny.cz                         kmx\100volny.cz
710 +                                       kmx\100cpan.org
711 kroepke\100dolphin-services.de          kay\100dolphin-services.de
712 kst\100mib.org                          kst\100cts.com
713 +                                       kst\100SDSC.EDU
714 kstar\100wolfetech.com                  kstar\100cpan.org
715 +                                       kurt_starsinic\100ml.com
716 +                                       kstar\100www.chapin.edu
717 +                                       kstar\100chapin.edu
718 larry\100wall.org                       lwall\100jpl-devvax.jpl.nasa.gov
719 +                                       lwall\100netlabs.com
720 +                                       larry\100netlabs.com
721 +                                       lwall\100sems.com
722 +                                       lwall\100scalpel.netlabs.com
723 laszlo.molnar\100eth.ericsson.se        molnarl\100cdata.tvnet.hu
724 +                                       ml1050\100freemail.hu
725 lewart\100uiuc.edu                      lewart\100vadds.cvm.uiuc.edu
726 +                                       d-lewart\100uiuc.edu
727 lkundrak\100v3.sk                       lubo.rintel\100gooddata.com
728 lstein\100cshl.org                      lstein\100formaggio.cshl.org
729 +                                       lstein\100genome.wi.mit.edu
730 l.mai\100web.de                         plokinom\100gmail.com
731 lupe\100lupe-christoph.de               lupe\100alanya.m.isar.de
732 lutherh\100stratcom.com                 lutherh\100infinet.com
733 mab\100wdl.loral.com                    markb\100rdcf.sm.unisys.com
734 marcel\100codewerk.com                  gr\100univie.ac.at
735 +                                       hanekomu\100gmail.com
736 marcgreen\100cpan.org                   marcgreen\100wpi.edu
737 markleightonfisher\100gmail.com         fisherm\100tce.com
738 +                                       mark-fisher\100mindspring.com
739 mark.p.lutz\100boeing.com               tecmpl1\100triton.ca.boeing.com
740 marnix\100gmail.com                     pttesac!marnix!vanam
741 marty+p5p\100kasei.com                  marty\100martian.org
742 mats\100sm6sxl.net                      mats\100sm5sxl.net
743 mbarbon\100dsi.unive.it                 mattia.barbon\100libero.it
744 +                                       mattia\100barbon.org
745 mcmahon\100ibiblio.org                  mcmahon\100metalab.unc.edu
746 me\100davidglasser.net                  glasser\100tang-eleven-seventy-nine.mit.edu
747 merijnb\100iloquent.nl                  merijnb\100ms.com
748 +                                       merijnb\100iloquent.com
749 merlyn\100stonehenge.com                merlyn\100gadget.cscaper.com
750 mestre.smash\100gmail.com               smash\100cpan.org
751 mgjv\100comdyn.com.au                   mgjv\100tradingpost.com.au
752 mlh\100swl.msd.ray.com                  webtools\100uewrhp03.msd.ray.com
753 michael.schroeder\100informatik.uni-erlangen.de mls\100suse.de
754 mike\100stok.co.uk                      mike\100exegenix.com
755 miyagawa\100bulknews.net                    miyagawa\100edge.co.jp
756 mjtg\100cam.ac.uk                       mjtg\100cus.cam.ac.uk
757 mikedlr\100tardis.ed.ac.uk              mikedlr\100it.com.pl
758 moritz\100casella.verplant.org          moritz\100faui2k3.org
759 +                                       moritz lenz
760
761 neale\100VMA.TABNSW.COM.AU              neale\100pucc.princeton.edu
762 neeracher\100mac.com                    neeri\100iis.ee.ethz.ch
763 neil\100bowers.com                      neilb\100cre.canon.co.uk
764
765 nospam-abuse\100bloodgate.com           tels\100bloodgate.com
766 +                                       perl_dummy\100bloodgate.com
767
768 ian.phillipps\100iname.com              ian_phillipps\100yahoo.co.uk
769 +                                       ian\100dial.pipex.com
770 ignasi.roca\100fujitsu-siemens.com      ignasi.roca\100fujitsu.siemens.es
771 ikegami\100adaelis.com                  eric\100fmdev10.(none)
772 ilmari\100ilmari.org                    ilmari\100vesla.ilmari.org
773 illpide\100telecel.pt                   arbor\100al37al08.telecel.pt
774 # see http://www.nntp.perl.org/group/perl.perl5.porters/2001/01/msg28925.html
775 #
776 ilya\100math.berkeley.edu               ilya\100math.ohio-state.edu
777 +                                       nospam-abuse\100ilyaz.org
778 +                                       [9]ilya\100math.ohio-state.edu
779 ilya\100martynov.org                    ilya\100juil.nonet
780
781 joshua.pritikin\100db.com               joshua\100paloalto.com
782
783 litt\100acm.org                         tlhackque\100yahoo.com
784
785 meyering@asic.sc.ti.com                 jim\100meyering.net
786
787 okamoto\100corp.hp.com                  okamoto\100hpcc123.corp.hp.com
788 orwant\100oreilly.com                   orwant\100media.mit.edu
789
790 p5-authors\100crystalflame.net          perl\100crystalflame.net
791 +                                       rs\100crystalflame.net
792 +                                       coral\100eekeek.org
793 +                                       coral\100moonlight.crystalflame.net
794 +                                       rs\100oregonnet.com
795 +                                       rs\100topsy.com
796 paul.green\100stratus.com               paul_greenvos\100vos.stratus.com
797 +                                       pgreen\100seussnt.stratus.com
798 paul.marquess\100btinternet.com         paul_marquess\100yahoo.co.uk
799 +                                       paul.marquess\100ntlworld.com
800 +                                       paul.marquess\100openwave.com
801 +                                       pmarquess\100bfsec.bt.co.uk
802 +                                       pmqs\100cpan.org
803 +                                       paul\100paul-desktop.(none)
804 Pavel.Zakouril\100mff.cuni.cz           root\100egg.karlov.mff.cuni.cz
805 pcg\100goof.com                         schmorp\100schmorp.de
806 perl\100cadop.com                       cdp\100hpescdp.fc.hp.com
807 perl\100greerga.m-l.org                 greerga\100m-l.org
808 perl\100profvince.com                   vince\100profvince.com
809 perl-rt\100wizbit.be                    p5p\100perl.wizbit.be
810 # Maybe we should special case this to get real names out?
811 Peter.Dintelmann\100Dresdner-Bank.com   peter.dintelmann\100dresdner-bank.com
812 # NOTE: There is an intentional trailing space in the line above
813 pfeifer\100wait.de                      pfeifer\100charly.informatik.uni-dortmund.de
814 +                                       upf\100de.uu.net
815 ribasushi@cpan.org                      rabbit\100rabbit.us
816 +                                       rabbit+bugs\100rabbit.us
817 perl\100aaroncrane.co.uk                arc\100cpan.org
818 phil\100perkpartners.com                phil\100finchcomputer.com
819 pimlott\100idiomtech.com                andrew\100pimlott.net
820 +                                       pimlott\100abel.math.harvard.edu
821 pixel\100mandriva.com                   pixel\100mandrakesoft.com
822 pne\100cpan.org                         philip.newton\100gmx.net
823 +                                       philip.newton\100datenrevision.de
824 +                                       pnewton\100gmx.de
825 pprymmer\100factset.com                 pvhp\100forte.com
826 khw\100cpan.org                         khw\100karl.(none)
827 +                                       public\100khwilliamson.com
828 +                                       khw\100khw-desktop.(none)
829
830 radu\100netsoft.ro                      rgreab\100fx.ro
831 rajagopa\100pauline.schrodinger.com     rajagopa\100schrodinger.com
832 raphael.manfredi\100pobox.com           raphael_manfredi\100grenoble.hp.com
833 module@renee-baecker.de                 renee.baecker\100smart-websolutions.de
834 +                                       reneeb\100reneeb-desktop.(none)
835 +                                       github@renee-baecker.de
836 +                                       otrs\100ubuntu.(none)
837 +                                       perl\100renee-baecker.de
838 +                                       reb\100perl-services.de
839 richard.foley\100rfi.net                richard.foley\100t-online.de
840 +                                       richard.foley\100ubs.com
841 +                                       richard.foley\100ubsw.com
842 rick\100consumercontact.com             rick\100bort.ca
843 +                                       rick.delaney\100rogers.com
844 +                                       rick\100bort.ca
845 +                                       rick.delaney\100home.com
846 rjbs\100cpan.org                        rjbs-perl-p5p\100lists.manxome.org
847 +                                       perl.p5p\100rjbs.manxome.org
848 rjk\100linguist.dartmouth.edu           rjk\100linguist.thayer.dartmouth.edu
849 +                                       rjk-perl-p5p\100tamias.net
850 +                                       rjk\100tamias.net
851 rjray\100redhat.com                     rjray\100uswest.com
852 rmgiroux\100acm.org                     rmgiroux\100hotmail.com
853 +                                       mgiroux\100bear.com
854 rmbarker\100cpan.org                    rmb1\100cise.npl.co.uk
855 +                                       robin.barker\100npl.co.uk
856 +                                       rmb\100cise.npl.co.uk
857 +                                       robin\100spade-ubuntu.(none)
858 +                                       r.m.barker\100btinternet.com
859 +                                       rmbarker.cpan\100btinternet.com
860 robertmay\100cpan.org                   rob\100themayfamily.me.uk
861 roberto\100keltia.freenix.fr            roberto\100eurocontrol.fr
862 robin\100cpan.org                       robin\100kitsite.com
863 roderick\100argon.org                   roderick\100gate.net
864 +                                       roderick\100ibcinc.com
865 argrath\100ub32.org                     root\100ub32.org
866 rootbeer\100teleport.com                rootbeer\100redcat.com
867 +                                       tomphoenix\100unknown
868 rurban\100x-ray.at                      rurban\100cpan.org
869 +                                       rurban\100cpanel.net
870 rvtol+news\100isolution.nl              rvtol\100isolution.nl
871 sartak\100bestpractical.com             sartak\100gmail.com
872 +                                       code\100sartak.org
873 sadinoff\100olf.com                     danny-cpan\100sadinoff.com
874 schubiger\100cpan.org                   steven\100accognoscere.org
875 +                                       sts\100accognoscere.org
876 +                                       schubiger\100gmail.com
877 +                                       stsc\100refcnt.org
878 schwern\100pobox.com                    schwern\100gmail.com
879 +                                       schwern\100athens.arena-i.com
880 +                                       schwern\100blackrider.aocn.com
881 +                                       schwern\100ool-18b93024.dyn.optonline.net
882 scotth\100sgi.com                       author scotth\100sgi.com 842220273 +0000
883 +                                       schotth\100sgi.com
884 schwab\100suse.de                       schwab\100issan.informatik.uni-dortmund.de
885 +                                       schwab\100ls5.informatik.uni-dortmund.de
886 sebastien\100aperghis.net               maddingue\100free.fr
887 +                                       saper\100cpan.org
888 shigeya\100wide.ad.jp                   shigeya\100foretune.co.jp
889 shlomif\100cpan.org                     shlomif\100vipe.technion.ac.il
890 +                                       shlomif\100iglu.org.il
891 +                                       shlomif+processed-by-perl\100gmail.com
892 +                                       shlomif\100shlomifish.org
893 simon\100simon-cozens.org               simon\100pembro4.pmb.ox.ac.uk
894 +                                       simon\100brecon.co.uk
895 +                                       simon\100othersideofthe.earth.li
896 +                                       simon\100cozens.net
897 +                                       simon\100netthink.co.uk
898 lannings\100who.int                     lannings\100gmail.com
899 +                                       slanning\100cpan.org
900 slaven\100rezic.de                      slaven.rezic\100berlin.de
901 +                                       srezic\100iconmobile.com
902 +                                       srezic\100cpan.org
903 +                                       eserte\100cs.tu-berlin.de
904 +                                       eserte\100vran.herceg.de
905 smcc\100mit.edu                         smcc\100ocf.berkeley.edu
906 +                                       smcc\100csua.berkeley.edu
907 +                                       alias\100mcs.com
908 +                                       smccam\100uclink4.berkeley.edu
909 spider\100orb.nashua.nh.us              spider\100web.zk3.dec.com
910 +                                       spider\100leggy.zk3.dec.com
911 +                                       spider-perl\100orb.nashua.nh.us
912 +                                       spider\100peano.zk3.dec.com
913 +                                       spider.boardman\100orb.nashua.nh.us>
914 +                                       spidb\100cpan.org
915 +                                       spider.boardman\100orb.nashua.nh.us
916 +                                       root\100peano.zk3.dec.com
917 spiros\100lokku.com                     s.denaxas\100gmail.com
918 spp\100ds.net                           spp\100psa.pencom.com
919 +                                       spp\100psasolar.colltech.com
920 +                                       spp\100spotter.yi.org
921 stef\100mongueurs.net                   stef\100payrard.net
922 +                                       s.payrard\100wanadoo.fr
923 +                                       properler\100freesurf.fr
924 +                                       stef\100francenet.fr
925 stevan\100cpan.org                      stevan.little\100gmail.com
926 +                                       stevan.little\100iinteractive.com
927 sthoenna\100efn.org                     ysth\100raven.shiftboard.com
928 sisyphus1\100optusnet.com.au            sisyphus\100cpan.org
929
930 tassilo.parseval\100post.rwth-aachen.de tassilo.von.parseval\100rwth-aachen.de
931 tchrist\100perl.com                     tchrist\100mox.perl.com
932 +                                       tchrist\100jhereg.perl.com
933 thomas.dorner\100start.de               tdorner\100amadeus.net
934 tjenness\100cpan.org                    t.jenness\100jach.hawaii.edu
935 +                                       timj\100jach.hawaii.edu
936 tobez\100tobez.org                      tobez\100plab.ku.dk
937 toddr\100cpan.org                       toddr\100cpanel.net
938 tom\100compton.nu                       thh\100cyberscience.com
939 tom.horsley\100mail.ccur.com            tom.horsley\100ccur.com
940 +                                       tom\100amber.ssd.hcsc.com
941
942 vkonovalov\100lucent.com                vkonovalov\100peterstar.ru
943 +                                       konovalo\100mail.wplus.net
944 +                                       vadim\100vkonovalov.ru
945 +                                       vkonovalov\100spb.lucent.com
946 +                                       vkonovalov\100alcatel-lucent.com
947 +                                       vadim.konovalov\100alcatel-lucent.com
948
949 whatever\100davidnicol.com              davidnicol\100gmail.com
950 wolfgang.laun\100alcatel.at             wolfgang.laun\100chello.at
951 +                                       wolfgang.laun\100thalesgroup.com
952 +                                       wolfgang.laun\100gmail.com
953 wolfsage\100gmail.com                   mhorsfall\100darmstadtium.(none)
954 yath\100yath.de                         yath-perlbug\100yath.de
955