Re: [PATCH V2] get_maintainer: Prepare for separate MAINTAINERS files

From: Joe Perches
Date: Wed Aug 02 2017 - 04:04:15 EST


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 <joe@xxxxxxxxxxx>
> ---
>
> 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")