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")