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