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