public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: "Kok, Auke" <auke-jan.h.kok@intel.com>
To: Joe Perches <joe@perches.com>
Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org,
	torvalds@linux-foundation.org
Subject: Re: [PATCH] [1/2many] - FInd the maintainer(s) for a patch -	scripts/get_maintainer.pl
Date: Mon, 13 Aug 2007 08:43:18 -0700	[thread overview]
Message-ID: <46C07C16.6060406@intel.com> (raw)
In-Reply-To: <1186984174.10249.7.camel@localhost>

Joe Perches wrote:
> I grew weary of looking up the appropriate
> maintainer email address(es) to CC: for a patch.
> 
> I added flags to the MAINTAINERS file
> 
> F:	file pattern
> 
> for each maintained block and a script to parse
> the modified blocks for maintainer and list
> email addresses.
> 
> perl scripts/get_maintainer.pl <patch>
> 
> gives the appropriate maintainer(s).
> 
> Modifications since last post:
> 
> Added options to control email address style and multiple address separator
> 
> Please apply.

Well, I came up with this implementation, so I definately support it and the way 
Joe implemented it:

Acked-by: Auke Kok <auke-jan.h.kok@intel.com>

Cheers,

Auke


> 
> diff --git a/scripts/get_maintainer.pl b/scripts/get_maintainer.pl
> new file mode 100755
> index 0000000..3e5cc6c
> --- /dev/null
> +++ b/scripts/get_maintainer.pl
> @@ -0,0 +1,217 @@
> +#!/usr/bin/perl -w
> +# (c) 2007, Joe Perches <joe@perches.com>
> +#           created from checkpatch.pl
> +# Licensed under the terms of the GNU GPL License version 2
> +
> +use strict;
> +
> +my $P = $0;
> +$P =~ s@.*/@@g;
> +
> +my $V = '0.02';
> +
> +use Getopt::Long qw(:config no_auto_abbrev);
> +
> +my $tree = "./";
> +my $email_maintainer = 1;
> +my $email_maintainer_name = 1;
> +my $email_list = 1;
> +my $email_subscriber_list = 0;
> +my $email_separator = ", ";
> +my %saw;
> +
> +GetOptions(
> +	   'tree=s' => \$tree,
> +	   'm!' => \$email_maintainer,
> +	   'n!' => \$email_maintainer_name,
> +	   'l!' => \$email_list,
> +	   's!' => \$email_subscriber_list,
> +	   'separator=s' => \$email_separator,
> +	   ) or exit;
> +
> +my $exit = 0;
> +
> +if ($#ARGV < 0 ||
> +    ($email_maintainer == 0 && $email_list == 0 && $email_subscriber_list == 0)) {
> +    print "usage: $P [options] patchfile\n";
> +    print "version: $V\n";
> +    print "  --tree [path] => linux kernel source path\n";
> +    print "  --m => include maintainer(s) if any\n";
> +    print "  --n => include maintainer name 'Full Name <addr\@domain.tld>'\n";
> +    print "  --l => include list(s) if any\n";
> +    print "  --s => include subscriber only list(s) if any\n";
> +    print "  --separator [, ] => separator for multiple addresses\n";
> +    print "Default: [--m --l --separator \", \"]\n";
> +    print "Be sure to select something...\n";
> +    exit(1);
> +}
> +
> +if ($tree && !top_of_kernel_tree($tree)) {
> +    if (${tree} ne "") {
> +	print "'${tree}' ";
> +    } else {
> +	print "The current directory ";
> +    }
> +    print "doesn't appear to be a linux kernel source tree\n";
> +    exit(2);
> +}
> +
> +## Read MAINTAINERS for type/value pairs
> +
> +my @typevalue = ();
> +open(MAINT, "<${tree}MAINTAINERS") || die "$P: Can't open ${tree}MAINTAINERS\n";
> +while (<MAINT>) {
> +    if (m/^(\C):\s*(.*)/) {
> +	my $type = $1;
> +	my $value = $2;
> +	if ($type eq "F") {              ##Filename pattern matching
> +	    $value =~ s@\.@\\\.@g;       ##Convert . to \.
> +	    $value =~ s/\*/\.\*/g;       ##Convert * to .*
> +	}
> +	push(@typevalue, "$type:$value");
> +    } elsif (!/^(\s)*$/) {
> +	push(@typevalue, $_);
> +    }
> +}
> +close(MAINT);
> +
> +## Find the patched filenames
> +
> +my @patchedfiles = ();
> +open(PATCH, "<$ARGV[0]") or die "Can't open $ARGV[0]\n";
> +while (<PATCH>) {
> +    if (m/^\+\+\+\s+(\S+)/) {
> +	my $file = $1;
> +	$file =~ s@^[^/]*/@@;
> +	$file =~ s@\n@@;
> +	push(@patchedfiles, $file);
> +    }
> +}
> +close(PATCH);
> +
> +# Sort and uniq patchedfiles
> +
> +undef %saw;
> +@patchedfiles = sort @patchedfiles;
> +@patchedfiles = grep(!$saw{$_}++, @patchedfiles);
> +
> +# Find responsible parties
> +
> +my @email_to = ();
> +foreach (@patchedfiles) {
> +    my $patchedfile = $_;
> +    my $tvi = 0;
> +
> +    foreach (@typevalue) {
> +	if (m/^(\C):(.*)/) {
> +	    my $type = $1;
> +	    my $value = $2;
> +	    if ($type eq 'F') {
> +		if (file_match_pattern($patchedfile, $value)) {
> +		    my $ptvi = $tvi - 1;
> +		    while ($ptvi >= 0) {
> +			my $tv = $typevalue[$ptvi];
> +			if ($tv =~ m/^(\C):(.*)/) {
> +			    my $ptype = $1;
> +			    my $pvalue = $2;
> +			    if ($ptype eq "L") {
> +				my $subscr = $pvalue;
> +				if ($subscr =~ m/\s*\(subscribers-only\)/) {
> +				    if ($email_subscriber_list > 0) {
> +					$subscr =~ s/\s*\(subscribers-only\)//g;
> +					push(@email_to, $subscr);
> +				    }
> +				} else {
> +				    if ($email_list > 0) {
> +					push(@email_to, $pvalue);
> +				    }
> +				}
> +			    } elsif ($ptype eq "M") {
> +				if ($email_maintainer > 0) {
> +				    if ($ptvi >= 0) {
> +					my $tv = $typevalue[$ptvi - 1];
> +					if ($tv =~ m/^(\C):(.*)/) {
> +					    if ($1 eq "P" && $email_maintainer_name > 0) {
> +						push(@email_to, "$2 <$pvalue>");
> +					    } else {
> +						push(@email_to, $pvalue);
> +					    }
> +					}
> +				    } else {
> +					push(@email_to, $pvalue);
> +				    }
> +				}
> +			    }
> +			    $ptvi--;
> +			} else {
> +			    $ptvi = -1;
> +			}
> +		    }
> +		}
> +	    }
> +	}
> +	$tvi++;
> +    }
> +}
> +
> +## sort and uniq email_to
> +
> +@email_to = sort @email_to;
> +undef %saw;
> +@email_to = grep(!$saw{$_}++, @email_to);
> +
> +## add lk if noone else...
> +
> +my $address_cnt = @email_to;
> +if ($address_cnt == 0 && $email_list > 0) {
> +    push(@email_to, "linux-kernel\@vger.kernel.org");
> +}
> +print(join($email_separator, @email_to));
> +print("\n");
> +
> +exit($exit);
> +
> +sub file_match_pattern {
> +    my ($file, $pattern) = @_;
> +    if (substr($pattern, -1) eq "/") {
> +	if ($file =~ m@^$pattern@) {
> +	    return 1;
> +	}
> +    } else {
> +	if ($file =~ m@^$pattern@) {
> +	    my $s1 = ($file =~ tr@/@@);
> +	    my $s2 = ($pattern =~ tr@/@@);
> +	    if ($s1 == $s2) {
> +		return 1;
> +	    }
> +	}
> +    }
> +    return 0;
> +}
> +
> +sub top_of_kernel_tree {
> +	my ($tree) = @_;
> +
> +	if ($tree ne "" && substr($tree,length($tree)-1,1) ne "/") {
> +	    $tree = $tree . "/";
> +	}
> +	if (   (-f "${tree}COPYING")
> +	    && (-f "${tree}CREDITS")
> +	    && (-f "${tree}Kbuild")
> +	    && (-f "${tree}MAINTAINERS")
> +	    && (-f "${tree}Makefile")
> +	    && (-f "${tree}README")
> +	    && (-d "${tree}Documentation")
> +	    && (-d "${tree}arch")
> +	    && (-d "${tree}include")
> +	    && (-d "${tree}drivers")
> +	    && (-d "${tree}fs")
> +	    && (-d "${tree}init")
> +	    && (-d "${tree}ipc")
> +	    && (-d "${tree}kernel")
> +	    && (-d "${tree}lib")
> +	    && (-d "${tree}scripts")) {
> +		return 1;
> +	}
> +	return 0;
> +}
> 
> 
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/

  parent reply	other threads:[~2007-08-13 16:37 UTC|newest]

Thread overview: 77+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-08-13  5:49 [PATCH] [1/2many] - FInd the maintainer(s) for a patch - scripts/get_maintainer.pl Joe Perches
2007-08-13  6:42 ` Michal Piotrowski
2007-08-13  7:16 ` Al Viro
2007-08-13 16:22   ` Sam Ravnborg
2007-08-13 17:40   ` Rene Herman
2007-08-13 15:43 ` Kok, Auke [this message]
2007-08-13 19:40   ` Richard Knutsson
2007-08-13 20:28     ` Kok, Auke
2007-08-13 20:43       ` Richard Knutsson
2007-08-13 17:09 ` Ray Lee
2007-08-13 18:11   ` Valdis.Kletnieks
2007-08-13 21:04   ` Adrian Bunk
2007-08-13 17:33 ` Mariusz Kozlowski
2007-08-13 17:42   ` Arjan van de Ven
2007-08-13 18:07     ` Mariusz Kozlowski
2007-08-13 18:10     ` Rene Herman
2007-08-13 18:32     ` Satyam Sharma
2007-08-13 19:21       ` Jan Engelhardt
2007-08-13 19:53         ` Richard Knutsson
2007-08-13 20:05         ` Valdis.Kletnieks
2007-08-13 18:41     ` Krzysztof Halasa
2007-08-13 19:02       ` Krzysztof Halasa
2007-08-13 20:16       ` Theodore Tso
2007-08-13 20:37     ` Trond Myklebust
2007-08-14  1:19       ` Arjan van de Ven
2007-08-14  1:48         ` John W. Linville
2007-08-14  1:51         ` Rene Herman
2007-08-14  2:04           ` Rene Herman
2007-08-14  9:20           ` Alan Cox
2007-08-14 13:47             ` Arjan van de Ven
2007-08-14 14:28               ` Adrian Bunk
2007-08-14 14:33                 ` Arjan van de Ven
2007-08-14 15:53             ` Rene Herman
2007-08-14 17:00               ` Joe Perches
2007-08-14 18:03                 ` Rene Herman
2007-08-14 18:28                   ` Joe Perches
2007-08-14 18:33                     ` Rene Herman
2007-08-14 18:40                     ` Linus Torvalds
2007-08-14 18:54                       ` Joe Perches
2007-08-14 19:33                       ` Al Viro
2007-08-14 19:57                         ` Joe Perches
2007-08-15  1:19                         ` Rene Herman
2007-08-15 13:33                           ` Satyam Sharma
2007-08-15 13:39                             ` Rene Herman
2007-08-15 13:52                               ` Kyle Moffett
2007-08-16 10:58                                 ` Rene Herman
2007-08-16 11:08                                   ` Rene Herman
2007-08-16 11:26                                     ` Salikh Zakirov
2007-08-16 11:57                                       ` Rene Herman
2007-08-16 15:40                                   ` Al Viro
2007-08-16 15:53                                     ` Rene Herman
2007-08-16 19:00                                   ` Junio C Hamano
2007-08-17  4:24                                     ` Rene Herman
2007-08-15 19:37                         ` Krzysztof Halasa
2007-08-15 23:19                           ` Al Viro
2007-08-15  1:35                       ` Richard Knutsson
2007-08-15  9:29                       ` Stefan Richter
2007-08-15 15:31                         ` Ray Lee
2007-08-16 20:36                       ` Joe Perches
2007-08-15  1:31                 ` Junio C Hamano
2007-08-15  2:12                   ` Joe Perches
2007-08-15  5:25                     ` Junio C Hamano
2007-08-15  5:42                       ` Rene Herman
2007-08-15  9:39                     ` Stefan Richter
2007-08-15 11:44                       ` Rene Herman
2007-08-15 17:26                         ` Joe Perches
2007-08-17  2:13                   ` Joe Perches
2007-08-17  2:30                     ` Joe Perches
2007-08-17 17:54                       ` [PATCH] - git-send-email.perl Joe Perches
2007-08-17 23:38                         ` Junio C Hamano
2007-08-18  1:51                           ` Joe Perches
2007-08-14 14:22         ` [PATCH] [1/2many] - FInd the maintainer(s) for a patch - scripts/get_maintainer.pl Adrian Bunk
2007-08-14 14:33           ` Arjan van de Ven
2007-08-14 14:45           ` John W. Linville
2007-08-14  2:15     ` Manu Abraham
  -- strict thread matches above, loose matches on Subject: below --
2007-08-13  6:09 Joe Perches
2007-08-13 16:24 ` Sam Ravnborg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=46C07C16.6060406@intel.com \
    --to=auke-jan.h.kok@intel.com \
    --cc=akpm@linux-foundation.org \
    --cc=joe@perches.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox