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