On Sun, 2017-07-23 at 13:32 -0700, Joe Perches wrote:
> Allow for MAINTAINERS to become a directory and if it is,
> read all the files in the directory for maintained sections.

ping?

> Also look for all files named MAINTAINERS in all subdirectories
> excluding the .git directory.
> 
> This adds ~.3 seconds of CPU on an Intel i5-6200 with an SSD.
> 
> Miscellanea:
> 
> o Create a read_maintainer_file subroutine from the existing code
> o Test only the existence of MAINTAINERS, not whether it's a file
> 
> Signed-off-by: Joe Perches <j...@perches.com>
> ---
> 
> v2: Search for MAINTAINERS in subdirectories, ignoring .git
> 
>  scripts/get_maintainer.pl | 84 
> +++++++++++++++++++++++++++++++++--------------
>  1 file changed, 59 insertions(+), 25 deletions(-)
> 
> diff --git a/scripts/get_maintainer.pl b/scripts/get_maintainer.pl
> index 3bd5f4f30235..56d5d3ef4c81 100755
> --- a/scripts/get_maintainer.pl
> +++ b/scripts/get_maintainer.pl
> @@ -18,6 +18,7 @@ my $V = '0.26';
>  
>  use Getopt::Long qw(:config no_auto_abbrev);
>  use Cwd;
> +use File::Find;
>  
>  my $cur_path = fastgetcwd() . '/';
>  my $lk_path = "./";
> @@ -307,36 +308,69 @@ if (!top_of_kernel_tree($lk_path)) {
>  
>  my @typevalue = ();
>  my %keyword_hash;
> +my @mfiles = ();
>  
> -open (my $maint, '<', "${lk_path}MAINTAINERS")
> -    or die "$P: Can't open MAINTAINERS: $!\n";
> -while (<$maint>) {
> -    my $line = $_;
> -
> -    if ($line =~ m/^([A-Z]):\s*(.*)/) {
> -     my $type = $1;
> -     my $value = $2;
> -
> -     ##Filename pattern matching
> -     if ($type eq "F" || $type eq "X") {
> -         $value =~ s@\.@\\\.@g;       ##Convert . to \.
> -         $value =~ s/\*/\.\*/g;       ##Convert * to .*
> -         $value =~ s/\?/\./g;         ##Convert ? to .
> -         ##if pattern is a directory and it lacks a trailing slash, add one
> -         if ((-d $value)) {
> -             $value =~ s@([^/])$@$1/@;
> +sub read_maintainer_file {
> +    my ($file) = @_;
> +
> +    open (my $maint, '<', "$file")
> +     or die "$P: Can't open MAINTAINERS file '$file': $!\n";
> +    while (<$maint>) {
> +     my $line = $_;
> +
> +     if ($line =~ m/^([A-Z]):\s*(.*)/) {
> +         my $type = $1;
> +         my $value = $2;
> +
> +         ##Filename pattern matching
> +         if ($type eq "F" || $type eq "X") {
> +             $value =~ s@\.@\\\.@g;       ##Convert . to \.
> +             $value =~ s/\*/\.\*/g;       ##Convert * to .*
> +             $value =~ s/\?/\./g;         ##Convert ? to .
> +             ##if pattern is a directory and it lacks a trailing slash, add 
> one
> +             if ((-d $value)) {
> +                 $value =~ s@([^/])$@$1/@;
> +             }
> +         } elsif ($type eq "K") {
> +             $keyword_hash{@typevalue} = $value;
>           }
> -     } elsif ($type eq "K") {
> -         $keyword_hash{@typevalue} = $value;
> +         push(@typevalue, "$type:$value");
> +     } elsif (!(/^\s*$/ || /^\s*\#/)) {
> +         $line =~ s/\n$//g;
> +         push(@typevalue, $line);
>       }
> -     push(@typevalue, "$type:$value");
> -    } elsif (!/^(\s)*$/) {
> -     $line =~ s/\n$//g;
> -     push(@typevalue, $line);
> +    }
> +    close($maint);
> +}
> +
> +sub find_is_maintainer_file {
> +    my $file = $File::Find::name;
> +    if (-f $file && $file =~ m@/MAINTAINERS$@) {
> +     push(@mfiles, $file);
> +    }
> +}
> +
> +sub find_ignore_git {
> +    return grep { $_ !~ /^\.git$/; } @_;
> +}
> +
> +if (-d "${lk_path}MAINTAINERS") {
> +    opendir(DIR, "${lk_path}MAINTAINERS") or die $!;
> +    my @files = readdir(DIR);
> +    closedir(DIR);
> +    foreach my $file (@files) {
> +     push(@mfiles, "${lk_path}MAINTAINERS/$file") if ($file !~ /^\./);
>      }
>  }
> -close($maint);
>  
> +find( { wanted => \&find_is_maintainer_file,
> +     preprocess => \&find_ignore_git,
> +     no_chdir => 1,
> +      }, "${lk_path}");
> +
> +foreach my $file (@mfiles) {
> +    read_maintainer_file("$file");
> +}
>  
>  #
>  # Read mail address map
> @@ -873,7 +907,7 @@ sub top_of_kernel_tree {
>      if (   (-f "${lk_path}COPYING")
>       && (-f "${lk_path}CREDITS")
>       && (-f "${lk_path}Kbuild")
> -     && (-f "${lk_path}MAINTAINERS")
> +     && (-e "${lk_path}MAINTAINERS")
>       && (-f "${lk_path}Makefile")
>       && (-f "${lk_path}README")
>       && (-d "${lk_path}Documentation")

Reply via email to