This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
431ddb9822024c2b7c0e9a8cea618cd99f730ead
[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 jesse                                   jesse\100bestpractical.com
447 +                                       jesse\100fsck.com
448 +                                       jesse\100perl.org
449 merijn                                  h.m.brand\100xs4all.nl
450 +                                       h.m.brand\100hccnet.nl
451 +                                       merijn\100l1.procura.nl
452 +                                       merijn\100a5.(none)
453 mhx                                     mhx-perl\100gmx.net
454 +                                       mhx\100r2d2.(none)
455 mst                                     mst\100shadowcat.co.uk
456 +                                       matthewt\100hercule.scsys.co.uk
457 nicholas                                nick\100unfortu.net
458 +                                       nick\100ccl4.org
459 +                                       nick\100talking.bollo.cx
460 +                                       nick\100plum.flirble.org
461 +                                       nick\100babyhippo.co.uk
462 +                                       nick\100bagpuss.unfortu.net
463 +                                       nick\100babyhippo.com
464 +                                       nicholas\100dromedary.ams6.corp.booking.com
465 +                                       Nicholas Clark (sans From field in mail header)
466 pudge                                   pudge\100pobox.com
467 rgs                                     rgarciasuarez\100free.fr
468 +                                       rgarciasuarez\100mandrakesoft.com
469 +                                       rgarciasuarez\100mandriva.com
470 +                                       rgarciasuarez\100gmail.com
471 +                                       raphel.garcia-suarez\100hexaflux.com
472 +                                       rgs@consttype.org
473 sky                                     sky\100nanisky.com
474 +                                       artur\100contiller.se
475 +                                       arthur\100contiller.se
476 smueller                                7k8lrvf02\100sneakemail.com
477 +                                       kjx9zthh3001\100sneakemail.com
478 +                                       dtr8sin02\100sneakemail.com
479 +                                       rt8363b02\100sneakemail.com
480 +                                       o6hhmk002\100sneakemail.com
481 +                                       smueller\100cpan.org
482 +                                       l2ot9pa02\100sneakemail.com
483 +                                       wyp3rlx02\100sneakemail.com
484 +                                       0mgwtfbbq\100sneakemail.com
485 +                                       xyey9001\100sneakemail.com
486 steveh                                  steve.m.hay\100googlemail.com
487 +                                       stevehay\100planit.com
488 +                                       steve.hay\100uk.radan.com
489 stevep                                  steve\100fisharerojo.org
490 +                                       steve.peters\100gmail.com
491 +                                       root\100dixie.cscaper.com
492 timb                                    Tim.Bunce\100pobox.com
493 +                                       tim.bunce\100ig.co.uk
494 tonyc                                   tony\100develop-help.com
495 +                                       tony\100openbsd32.tony.develop-help.com
496 +                                       tony\100saturn.(none)
497
498 #
499 # Mere mortals.
500 #
501 \043####\100juerd.nl                    juerd\100cpan.org
502 +                                       juerd\100c3.convolution.nl
503 +                                       juerd\100convolution.nl
504 a.r.ferreira\100gmail.com               aferreira\100shopzilla.com
505 abe\100ztreet.demon.nl                  abeltje\100cpan.org
506 abela\100hsc.fr                         abela\100geneanet.org
507 abigail\100abigail.be                   abigail\100foad.org
508 +                                       abigail\100abigail.nl
509 +                                       abigail\100fnx.com
510 aburt\100isis.cs.du.edu                 isis!aburt
511 ach\100mpe.mpg.de                       ach\100rosat.mpe-garching.mpg.de
512 adavies\100ptc.com                      alex.davies\100talktalk.net
513 ajohnson\100nvidia.com                  ajohnson\100wischip.com
514 +                                       anders\100broadcom.com
515 alexm\100netli.com                      alexm\100w-m.ru
516 alex-p5p\100earth.li                    alex\100rcon.rog
517 alexmv\100mit.edu                       alex\100chmrr.net
518 alian\100cpan.org                       alian\100alianwebserver.com
519 allen\100grumman.com                    allen\100gateway.grumman.com
520 allen\100huarp.harvard.edu              nort\100bottesini.harvard.edu
521 +                                       nort\100qnx.com
522 allens\100cpan.org                      easmith\100beatrice.rutgers.edu
523 +                                       root\100dogberry.rutgers.edu
524 andreas.koenig\100anima.de              andreas.koenig.gmwojprw\100franz.ak.mind.de
525 +                                       andreas.koenig.7os6vvqr\100franz.ak.mind.de
526 +                                       a.koenig\100mind.de
527 +                                       k\100anna.in-berlin.de
528 +                                       andk\100cpan.org
529 +                                       koenig\100anna.mind.de
530 +                                       k\100anna.mind.de
531 +                                       root\100ak-71.mind.de
532 +                                       root\100ak-75.mind.de
533 +                                       k\100sissy.in-berlin.de
534 +                                       a.koenig\100kulturbox.de
535 +                                       k\100sissy.in-berlin.de
536 +                                       root\100dubravka.in-berlin.de
537 anno4000\100lublin.zrz.tu-berlin.de     anno4000\100mailbox.tu-berlin.de
538 +                                       siegel\100zrz.tu-berlin.de
539 apocal@cpan.org                         perl\1000ne.us
540 arnold\100gnu.ai.mit.edu                arnold\100emoryu2.arpa
541 +                                       gatech!skeeve!arnold
542 arodland\100cpan.org                    andrew\100hbslabs.com
543 arussell\100cs.uml.edu                  adam\100adam-pc.(none)
544 ash\100cpan.org                         ash_cpan\100firemirror.com
545 avarab\100gmail.com                     avar\100cpan.org
546
547 bailey\100newman.upenn.edu              bailey\100hmivax.humgen.upenn.edu
548 +                                       bailey\100genetics.upenn.edu
549 +                                       bailey.charles\100gmail.com
550 bah\100ecnvantage.com                   bholzman\100longitude.com
551 barries\100slaysys.com                  root\100jester.slaysys.com
552 bkedryna\100home.com                    bart\100cg681574-a.adubn1.nj.home.com
553 bcarter\100gumdrop.flyinganvil.org      q.eibcartereio.=~m-b.{6}-cgimosx\100gumdrop.flyinganvil.org
554 ben_tilly\100operamail.com              btilly\100gmail.com
555 +                                       ben_tilly\100hotmail.com
556 ben\100morrow.me.uk                     mauzo\100csv.warwick.ac.uk
557 +                                       mauzo\100.(none)
558 bepi\100perl.it                         enrico.sorcinelli\100gmail.com
559 bert\100alum.mit.edu                    bert\100genscan.com
560 bigbang7\100gmail.com                   ddascalescu+github\100gmail.com
561 blgl\100stacken.kth.se                  blgl\100hagernas.com
562 +                                       2bfjdsla52kztwejndzdstsxl9athp\100gmail.com
563 brian.d.foy\100gmail.com                bdfoy\100cpan.org
564 BQW10602\100nifty.com                   sadahiro\100cpan.org
565 bulk88\100hotmail.com                   bulk88
566
567 chromatic\100wgz.org                    chromatic\100rmci.net
568 ckuskie\100cadence.com                  colink\100perldreamer.com
569 claes\100surfar.nu                      claes\100versed.se
570 clintp\100geeksalad.org                 cpierce1\100ford.com
571 clkao\100clkao.org                      clkao\100bestpractical.com
572 corion\100corion.net                    corion\100cpan.org
573 cp\100onsitetech.com                    publiustemp-p5p\100yahoo.com
574 +                                       publiustemp-p5p3\100yahoo.com
575 cpan\100audreyt.org                     autrijus\100egb.elixus.org
576 +                                       autrijus\100geb.elixus.org
577 +                                       autrijus\100gmail.com
578 +                                       autrijus\100ossf.iis.sinica.edu.tw
579 +                                       autrijus\100autrijus.org
580 +                                       audreyt\100audreyt.org
581 cpan\100ton.iguana.be                   me-01\100ton.iguana.be
582 crt\100kiski.net                        perl\100ctweten.amsite.com
583
584 dairiki\100dairiki.org                  dairiki at dairiki.org
585 dagolden\100cpan.org                    xdaveg\100gmail.com
586 damian\100conway.org                    damian\100cs.monash.edu.au
587 dan\100sidhe.org                        sugalsd\100lbcc.cc.or.us
588 +                                       sugalskd\100osshe.edu
589 daniel\100bitpusher.com                 daniel\100biz.bitpusher.com
590 david.dyck\100fluke.com                 dcd\100tc.fluke.com
591 david\100kineticode.com                 david\100wheeler.com
592 +                                       david\100wheeler.net
593 dennis\100booking.com                   dennis\100camel.ams6.corp.booking.com
594 +                                       dennis.kaarsemaker\100booking.com
595 +                                       dennis\100kaarsemaker.net
596 dev-perl\100pimb.org                    knew-p5p\100pimb.org
597 +                                       lists-p5p\100pimb.org
598 djberg86\100attbi.com                   djberg96\100attbi.com
599 dk\100tetsuo.karasik.eu.org             dmitry\100karasik.eu.org
600 domo\100computer.org                    shouldbedomo\100mac.com
601 +                                       domo\100slipper.ip.lu
602 +                                       domo\100tcp.ip.lu
603 dougm\100covalent.net                   dougm\100opengroup.org
604 +                                       dougm\100osf.org
605 dougw\100cpan.org                       doug_wilson\100intuit.com
606 dwegscheid\100qtm.net                   wegscd\100whirlpool.com
607 edwardp\100excitehome.net               epeschko\100den-mdev1
608 +                                       epeschko\100elmer.tci.com
609 +                                       esp5\100pge.com
610 egf7\100columbia.edu                    efifer\100sanwaint.com
611 eggert\100twinsun.com                   eggert\100sea.sm.unisys.com
612
613 fugazi\100zyx.net                       larrysh\100cpan.org
614 +                                       lshatzer\100islanddata.com
615
616 gbacon\100itsc.uah.edu                  gbacon\100adtrn-srv4.adtran.com
617 gerberb\100zenez.com                    root\100devsys0.zenez.com
618 gfuji\100cpan.org                       g.psy.va\100gmail.com
619 gerard\100ggoossen.net                  gerard\100tty.nl
620 gibreel\100pobox.com                    stephen.zander\100interlock.mckesson.com
621 +                                       srz\100loopback
622 gideon\100cpan.org                      gidisrael\100gmail.com
623 gnat\100frii.com                        gnat\100prometheus.frii.com
624 gp\100familiehaase.de                   gerrit\100familiehaase.de
625 grazz\100pobox.com                      grazz\100nyc.rr.com
626 gward\100ase.com                        greg\100bic.mni.mcgill.ca
627 haggai\100cpan.org                      alanhaggai\100alanhaggai.org
628 +                                       alanhaggai\100gmail.com
629 hansmu\100xs4all.nl                     hansm\100icgroup.nl
630 +                                       hansm\100icgned.nl
631 +                                       hans\100icgned.nl
632 +                                       hans\100icgroup.nl
633 +                                       hansm\100euronet.nl
634 +                                       hansm\100euro.net
635 hio\100ymir.co.jp                       hio\100hio.jp
636 hops\100sco.com                         hops\100scoot.pdev.sco.com
637
638 ian.goodacre\100xtra.co.nz              ian\100debian.lan
639 ingo_weinhold\100gmx.de                 bonefish\100cs.tu-berlin.de
640
641 james\100mastros.biz                    theorb\100desert-island.me.uk
642 jand\100activestate.com                 jan.dubois\100ibm.net
643 japhy\100pobox.com                      japhy\100pobox.org
644 +                                       japhy\100perlmonk.org
645 +                                       japhy\100cpan.org
646 +                                       jeffp\100crusoe.net
647 jari.aalto\100poboxes.com               jari.aalto\100cante.net
648 jarausch\100numa1.igpm.rwth-aachen.de   helmutjarausch\100unknown
649 jasons\100cs.unm.edu                    jasons\100sandy-home.arc.unm.edu
650 jbuehler\100hekimian.com                jhpb\100hekimian.com
651 jcromie\100100divsol.com                jcromie\100cpan.org
652 +                                       jim.cromie\100gmail.com
653 jdhedden\100cpan.org                    jerry\100hedden.us
654 +                                       jdhedden\1001979.usna.com
655 +                                       jdhedden\100gmail.com
656 +                                       jdhedden\100yahoo.com
657 +                                       jhedden\100pn100-02-2-356p.corp.bloomberg.com
658 jeremy\100zawodny.com                   jzawodn\100wcnet.org
659 jesse\100sig.bsh.com                    jesse\100ginger
660 jfriedl\100yahoo.com                    jfriedl\100yahoo-inc.com
661 jfs\100fluent.com                       jfs\100jfs.fluent.com
662 jhannah\100mutationgrid.com             jay\100jays.net
663 +                                       jhannah\100omnihotels.com
664 jidanni\100jidanni.org                  jidanni\100hoffa.dreamhost.com
665 jjore\100cpan.org                       twists\100gmail.com
666 jkeenan\100cpan.org                     jkeen\100verizon.net
667 +                                       jkeenan\100dromedary-001.ams6.corp.booking.com
668 jns\100integration-house.com            jns\100gellyfish.com
669 +                                       gellyfish\100gellyfish.com
670 john\100atlantech.com                   john\100titanic.atlantech.com
671 john\100johnwright.org                  john.wright\100hp.com
672 joseph\100cscaper.com                   joseph\1005sigma.com
673 joshua\100rodd.us                       jrodd\100pbs.org
674 jtobey\100john-edwin-tobey.org          jtobey\100user1.channel1.com
675 jpeacock\100messagesystems.com          john.peacock\100havurah-software.org
676 +                                       jpeacock\100havurah-software.org
677 +                                       jpeacock\100dsl092-147-156.wdc1.dsl.speakeasy.net
678 +                                       jpeacock\100jpeacock-hp.doesntexist.org
679 +                                       jpeacock\100cpan.org
680 +                                       jpeacock\100rowman.com
681 jpl.jpl\100gmail.com                    jpl\100research.att.com
682 jql\100accessone.com                    jql\100jql.accessone.com
683 jsm28\100hermes.cam.ac.uk               jsm28\100cam.ac.uk
684
685 kane\100dwim.org                        kane\100xs4all.net
686 +                                       kane\100cpan.org
687 +                                       kane\100xs4all.nl
688 +                                       jos\100dwim.org
689 +                                       jib\100ripe.net
690 keith.s.thompson\100gmail.com           kst\100mib.org
691 ken\100mathforum.org                    kenahoo\100gmail.com
692 +                                       ken.williams\100thomsonreuters.com
693 kentfredric\100gmail.com                kentnl\100cpan.org
694 kroepke\100dolphin-services.de          kay\100dolphin-services.de
695 kst\100mib.org                          kst\100cts.com
696 +                                       kst\100SDSC.EDU
697 kstar\100wolfetech.com                  kstar\100cpan.org
698 +                                       kurt_starsinic\100ml.com
699 +                                       kstar\100www.chapin.edu
700 +                                       kstar\100chapin.edu
701 larry\100wall.org                       lwall\100jpl-devvax.jpl.nasa.gov
702 +                                       lwall\100netlabs.com
703 +                                       larry\100netlabs.com
704 +                                       lwall\100sems.com
705 +                                       lwall\100scalpel.netlabs.com
706 laszlo.molnar\100eth.ericsson.se        molnarl\100cdata.tvnet.hu
707 +                                       ml1050\100freemail.hu
708 lewart\100uiuc.edu                      lewart\100vadds.cvm.uiuc.edu
709 +                                       d-lewart\100uiuc.edu
710 lkundrak\100v3.sk                      lubo.rintel\100gooddata.com
711 lstein\100cshl.org                      lstein\100formaggio.cshl.org
712 +                                       lstein\100genome.wi.mit.edu
713 lupe\100lupe-christoph.de               lupe\100alanya.m.isar.de
714 lutherh\100stratcom.com                 lutherh\100infinet.com
715 mab\100wdl.loral.com                    markb\100rdcf.sm.unisys.com
716 marcel\100codewerk.com                  gr\100univie.ac.at
717 +                                       hanekomu\100gmail.com
718 marcgreen\100cpan.org                   marcgreen\100wpi.edu
719 markleightonfisher\100gmail.com         fisherm\100tce.com
720 mark.p.lutz\100boeing.com               tecmpl1\100triton.ca.boeing.com
721 marnix\100gmail.com                     pttesac!marnix!vanam
722 marty+p5p\100kasei.com                  marty\100martian.org
723 mats\100sm6sxl.net                      mats\100sm5sxl.net
724 mbarbon\100dsi.unive.it                 mattia.barbon\100libero.it
725 mcmahon\100ibiblio.org                  mcmahon\100metalab.unc.edu
726 me\100davidglasser.net                  glasser\100tang-eleven-seventy-nine.mit.edu
727 merijnb\100iloquent.nl                  merijnb\100ms.com
728 +                                       merijnb\100iloquent.com
729 merlyn\100stonehenge.com                merlyn\100gadget.cscaper.com
730 mestre.smash\100gmail.com               smash\100cpan.org
731 mgjv\100comdyn.com.au                   mgjv\100tradingpost.com.au
732 mlh\100swl.msd.ray.com                  webtools\100uewrhp03.msd.ray.com
733 michael.schroeder\100informatik.uni-erlangen.de mls\100suse.de
734 mike\100stok.co.uk                      mike\100exegenix.com
735 miyagawa\100bulknews.net                    miyagawa\100edge.co.jp
736 mjtg\100cam.ac.uk                       mjtg\100cus.cam.ac.uk
737 mikedlr\100tardis.ed.ac.uk              mikedlr\100it.com.pl
738 moritz\100casella.verplant.org          moritz\100faui2k3.org
739 +                                       moritz lenz
740
741 neale\100VMA.TABNSW.COM.AU              neale\100pucc.princeton.edu
742 neeracher\100mac.com                    neeri\100iis.ee.ethz.ch
743 neil\100bowers.com                      neilb\100cre.canon.co.uk
744
745 nospam-abuse\100bloodgate.com           tels\100bloodgate.com
746 +                                       perl_dummy\100bloodgate.com
747
748 ian.phillipps\100iname.com              ian_phillipps\100yahoo.co.uk
749 +                                       ian\100dial.pipex.com
750 ignasi.roca\100fujitsu-siemens.com      ignasi.roca\100fujitsu.siemens.es
751 ikegami\100adaelis.com                  eric\100fmdev10.(none)
752 ilmari\100ilmari.org                    ilmari\100vesla.ilmari.org
753 illpide\100telecel.pt                   arbor\100al37al08.telecel.pt
754 # see http://www.nntp.perl.org/group/perl.perl5.porters/2001/01/msg28925.html
755 #
756 ilya\100math.berkeley.edu               ilya\100math.ohio-state.edu
757 +                                       nospam-abuse\100ilyaz.org
758 +                                       [9]ilya\100math.ohio-state.edu
759 ilya\100martynov.org                    ilya\100juil.nonet
760
761 joshua.pritikin\100db.com               joshua\100paloalto.com
762
763 litt\100acm.org                         tlhackque\100yahoo.com
764
765 meyering@asic.sc.ti.com                 jim\100meyering.net
766
767 okamoto\100corp.hp.com                  okamoto\100hpcc123.corp.hp.com
768 orwant\100oreilly.com                   orwant\100media.mit.edu
769
770 p5-authors\100crystalflame.net          perl\100crystalflame.net
771 +                                       rs\100crystalflame.net
772 +                                       coral\100eekeek.org
773 +                                       coral\100moonlight.crystalflame.net
774 +                                       rs\100oregonnet.com
775 +                                       rs\100topsy.com
776 paul.green\100stratus.com               paul_greenvos\100vos.stratus.com
777 +                                       pgreen\100seussnt.stratus.com
778 paul.marquess\100btinternet.com         paul_marquess\100yahoo.co.uk
779 +                                       paul.marquess\100ntlworld.com
780 +                                       paul.marquess\100openwave.com
781 +                                       pmarquess\100bfsec.bt.co.uk
782 +                                       pmqs\100cpan.org
783 +                                       paul\100paul-desktop.(none)
784 Pavel.Zakouril\100mff.cuni.cz           root\100egg.karlov.mff.cuni.cz
785 pcg\100goof.com                         schmorp\100schmorp.de
786 perl\100cadop.com                       cdp\100hpescdp.fc.hp.com
787 perl\100greerga.m-l.org                 greerga\100m-l.org
788 perl\100profvince.com                   vince\100profvince.com
789 perl-rt\100wizbit.be                    p5p\100perl.wizbit.be
790 # Maybe we should special case this to get real names out?
791 Peter.Dintelmann\100Dresdner-Bank.com   peter.dintelmann\100dresdner-bank.com
792 # NOTE: There is an intentional trailing space in the line above
793 pfeifer\100wait.de                      pfeifer\100charly.informatik.uni-dortmund.de
794 +                                       upf\100de.uu.net
795 ribasushi@cpan.org                      rabbit\100rabbit.us
796 +                                       rabbit+bugs\100rabbit.us
797 perl\100aaroncrane.co.uk                arc\100cpan.org
798 phil\100perkpartners.com                phil\100finchcomputer.com
799 pimlott\100idiomtech.com                andrew\100pimlott.net
800 +                                       pimlott\100abel.math.harvard.edu
801 pixel\100mandriva.com                   pixel\100mandrakesoft.com
802 pne\100cpan.org                         philip.newton\100gmx.net
803 +                                       philip.newton\100datenrevision.de
804 +                                       pnewton\100gmx.de
805 pprymmer\100factset.com                 pvhp\100forte.com
806 khw\100cpan.org                         khw\100karl.(none)
807 +                                       public\100khwilliamson.com
808 +                                       khw\100khw-desktop.(none)
809
810 radu\100netsoft.ro                      rgreab\100fx.ro
811 rajagopa\100pauline.schrodinger.com     rajagopa\100schrodinger.com
812 raphael.manfredi\100pobox.com           raphael_manfredi\100grenoble.hp.com
813 module@renee-baecker.de                 renee.baecker\100smart-websolutions.de
814 +                                       reneeb\100reneeb-desktop.(none)
815 +                                       github@renee-baecker.de
816 +                                       otrs\100ubuntu.(none)
817 +                                       perl\100renee-baecker.de
818 richard.foley\100rfi.net                richard.foley\100t-online.de
819 +                                       richard.foley\100ubs.com
820 +                                       richard.foley\100ubsw.com
821 rick\100consumercontact.com             rick\100bort.ca
822 +                                       rick.delaney\100rogers.com
823 +                                       rick\100bort.ca
824 +                                       rick.delaney\100home.com
825 rjbs\100cpan.org                        rjbs-perl-p5p\100lists.manxome.org
826 +                                       perl.p5p\100rjbs.manxome.org
827 rjk\100linguist.dartmouth.edu           rjk\100linguist.thayer.dartmouth.edu
828 +                                       rjk-perl-p5p\100tamias.net
829 +                                       rjk\100tamias.net
830 rjray\100redhat.com                     rjray\100uswest.com
831 rmgiroux\100acm.org                     rmgiroux\100hotmail.com
832 +                                       mgiroux\100bear.com
833 rmbarker\100cpan.org                    rmb1\100cise.npl.co.uk
834 +                                       robin.barker\100npl.co.uk
835 +                                       rmb\100cise.npl.co.uk
836 +                                       robin\100spade-ubuntu.(none)
837 +                                       r.m.barker\100btinternet.com
838 +                                       rmbarker.cpan\100btinternet.com
839 robertmay\100cpan.org                   rob\100themayfamily.me.uk
840 roberto\100keltia.freenix.fr            roberto\100eurocontrol.fr
841 robin\100cpan.org                       robin\100kitsite.com
842 roderick\100argon.org                   roderick\100gate.net
843 +                                       roderick\100ibcinc.com
844 argrath\100ub32.org                     root\100ub32.org
845 rootbeer\100teleport.com                rootbeer\100redcat.com
846 +                                       tomphoenix\100unknown
847 rurban\100x-ray.at                      rurban\100cpan.org
848 +                                       rurban\100cpanel.net
849 sartak\100bestpractical.com             sartak\100gmail.com
850 +                                       code\100sartak.org
851 sadinoff\100olf.com                     danny-cpan\100sadinoff.com
852 schubiger\100cpan.org                   steven\100accognoscere.org
853 +                                       sts\100accognoscere.org
854 +                                       schubiger\100gmail.com
855 +                                       stsc\100refcnt.org
856 schwern\100pobox.com                    schwern\100gmail.com
857 +                                       schwern\100athens.arena-i.com
858 +                                       schwern\100blackrider.aocn.com
859 +                                       schwern\100ool-18b93024.dyn.optonline.net
860 scotth\100sgi.com                       author scotth\100sgi.com 842220273 +0000
861 +                                       schotth\100sgi.com
862 schwab\100suse.de                       schwab\100issan.informatik.uni-dortmund.de
863 +                                       schwab\100ls5.informatik.uni-dortmund.de
864 sebastien\100aperghis.net               maddingue\100free.fr
865 +                                       saper\100cpan.org
866 shigeya\100wide.ad.jp                   shigeya\100foretune.co.jp
867 shlomif\100cpan.org                     shlomif\100vipe.technion.ac.il
868 +                                       shlomif\100iglu.org.il
869 +                                       shlomif+processed-by-perl\100gmail.com
870 +                                       shlomif\100shlomifish.org
871 simon\100simon-cozens.org               simon\100pembro4.pmb.ox.ac.uk
872 +                                       simon\100brecon.co.uk
873 +                                       simon\100othersideofthe.earth.li
874 +                                       simon\100cozens.net
875 +                                       simon\100netthink.co.uk
876 lannings\100who.int                     lannings\100gmail.com
877 +                                       slanning\100cpan.org
878 slaven\100rezic.de                      slaven.rezic\100berlin.de
879 +                                       srezic\100iconmobile.com
880 +                                       srezic\100cpan.org
881 +                                       eserte\100cs.tu-berlin.de
882 +                                       eserte\100vran.herceg.de
883 smcc\100mit.edu                         smcc\100ocf.berkeley.edu
884 +                                       smcc\100csua.berkeley.edu
885 +                                       alias\100mcs.com
886 +                                       smccam\100uclink4.berkeley.edu
887 spider\100orb.nashua.nh.us              spider\100web.zk3.dec.com
888 +                                       spider\100leggy.zk3.dec.com
889 +                                       spider-perl\100orb.nashua.nh.us
890 +                                       spider\100peano.zk3.dec.com
891 +                                       spider.boardman\100orb.nashua.nh.us>
892 +                                       spidb\100cpan.org
893 +                                       spider.boardman\100orb.nashua.nh.us
894 +                                       root\100peano.zk3.dec.com
895 spiros\100lokku.com                     s.denaxas\100gmail.com
896 spp\100ds.net                           spp\100psa.pencom.com
897 +                                       spp\100psasolar.colltech.com
898 +                                       spp\100spotter.yi.org
899 stef\100mongueurs.net                   stef\100payrard.net
900 +                                       s.payrard\100wanadoo.fr
901 +                                       properler\100freesurf.fr
902 +                                       stef\100francenet.fr
903 sthoenna\100efn.org                     ysth\100raven.shiftboard.com
904 sisyphus1\100optusnet.com.au            sisyphus\100cpan.org
905
906 tassilo.parseval\100post.rwth-aachen.de tassilo.von.parseval\100rwth-aachen.de
907 tchrist\100perl.com                     tchrist\100mox.perl.com
908 +                                       tchrist\100jhereg.perl.com
909 thomas.dorner\100start.de               tdorner\100amadeus.net
910 tjenness\100cpan.org                    t.jenness\100jach.hawaii.edu
911 +                                       timj\100jach.hawaii.edu
912 tobez\100tobez.org                      tobez\100plab.ku.dk
913 toddr\100cpan.org                       toddr\100cpanel.net
914 tom\100compton.nu                       thh\100cyberscience.com
915 tom.horsley\100mail.ccur.com            tom.horsley\100ccur.com
916 +                                       tom\100amber.ssd.hcsc.com
917
918 vkonovalov\100lucent.com                vkonovalov\100peterstar.ru
919 +                                       konovalo\100mail.wplus.net
920 +                                       vadim\100vkonovalov.ru
921 +                                       vkonovalov\100spb.lucent.com
922 +                                       vkonovalov\100alcatel-lucent.com
923 +                                       vadim.konovalov\100alcatel-lucent.com
924
925 whatever\100davidnicol.com              davidnicol\100gmail.com
926 wolfgang.laun\100alcatel.at             wolfgang.laun\100chello.at
927 +                                       wolfgang.laun\100thalesgroup.com
928 +                                       wolfgang.laun\100gmail.com
929 wolfsage\100gmail.com                   mhorsfall\100darmstadtium.(none)
930 yath\100yath.de                         yath-perlbug\100yath.de
931