Porting/Maintainers.pm --check added functionality
Robin Barker [Wed, 10 Oct 2007 18:11:36 +0000 (19:11 +0100)]
From: "Robin Barker" <Robin.Barker@npl.co.uk>
Message-ID: <2C2E01334A940D4792B3E115F95B7226C9D1F2@exchsvr1.npl.ad.local>

p4raw-id: //depot/perl@32097

Porting/Maintainers.pm

index f71db98..ce773ea 100644 (file)
@@ -67,11 +67,14 @@ sub get_maintainer_modules {
 
 sub usage {
     print <<__EOF__;
-$0: Usage: $0 [[--maintainer M --module M --files --check]|file ...]
+$0: Usage: $0 [[--maintainer M --module M --files]|[--check] file ...]
 --maintainer M list all maintainers matching M
 --module M     list all modules matching M
 --files                list all files
 --check                check consistency of Maintainers.pl
+                       with a file     checks if it has a maintainer
+                       with a dir      checks all files have a maintainer
+                       otherwise       checks for multiple maintainers
 --opened       list all modules of files opened by perforce
 Matching is case-ignoring regexp, author matching is both by
 the short id and by the full name and email.  A "module" may
@@ -160,6 +163,13 @@ sub show_results {
                }
            }
        }
+    } elsif ($Check) {
+        if( @Files ) {
+           missing_maintainers( qr{\.(?:[chty]|p[lm]|xs)\z}msx, @Files)
+       }
+       else { 
+           duplicated_maintainers();
+       }
     } elsif (@Files) {
        my %ModuleByFile;
 
@@ -233,21 +243,25 @@ sub show_results {
            }
        }
     }
-    elsif ($Check) {
-       duplicated_maintainers();
-    }
     else {
        usage();
     }
 }
 
-sub duplicated_maintainers {
-    my %files;
+sub warn_maintainer(_);
+my %files;
+
+sub maintainers_files {
+    %files = ();
     for my $k (keys %Modules) {
        for my $f (get_module_files($k)) {
            ++$files{$f};
        }
     }
+}
+
+sub duplicated_maintainers {
+    maintainers_files();
     for my $f (keys %files) {
        if ($files{$f} > 1) {
            warn "File $f appears $files{$f} times in Maintainers.pl\n";
@@ -255,5 +269,19 @@ sub duplicated_maintainers {
     }
 }
 
+sub missing_maintainers {
+    my($check, @path) = @_;
+    maintainers_files();
+    my @dir;
+    for (@path) { if( -d ) { push @dir, $_ } else { warn_maintainer() } }
+    find sub { warn_maintainer($File::Find::name) if /$check/; }, @dir
+       if @dir;
+}
+
+sub warn_maintainer(_) {
+    my $name = shift;
+    warn "File $name has no maintainer\n" if not $files{$name};
+}
+
 1;