scripts/get_maintainer.pl: add sections in pattern match depth order
Joe Perches [Tue, 22 Sep 2009 00:04:14 +0000 (17:04 -0700)]
Before this change, matched sections were added in the order
of appearance in the normally alphabetic section order of
the MAINTAINERS file.

For instance, finding the maintainer for drivers/scsi/wd7000.c
would first find "SCSI SUBSYSTEM", then "WD7000 SCSI SUBSYSTEM",
then "THE REST".

before patch:

$ ./scripts/get_maintainer.pl --nogit -f drivers/scsi/wd7000.c
James E.J. Bottomley <James.Bottomley@HansenPartnership.com>
Miroslav Zagorac <zaga@fly.cc.fer.hr>
linux-scsi@vger.kernel.org
linux-kernel@vger.kernel.org

get_maintainer.pl now selects matched sections by longest pattern match.
Longest is the number of "/"s and any specific file pattern.

This changes the example output order of MAINTAINERS to whatever is
selected in "WD7000 SUBSYSTEM", then "SCSI SYSTEM", then "THE REST".

after patch:

$ ./scripts/get_maintainer.pl --nogit -f drivers/scsi/wd7000.c
Miroslav Zagorac <zaga@fly.cc.fer.hr>
James E.J. Bottomley <James.Bottomley@HansenPartnership.com>
linux-scsi@vger.kernel.org
linux-kernel@vger.kernel.org

Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

scripts/get_maintainer.pl

index 35781e0..fb446e0 100755 (executable)
@@ -211,6 +211,7 @@ foreach my $file (@files) {
            if ($type eq 'X') {
                if (file_match_pattern($file, $value)) {
                    $exclude = 1;
+                   last;
                }
            }
        }
@@ -218,18 +219,24 @@ foreach my $file (@files) {
 
     if (!$exclude) {
        my $tvi = 0;
+       my %hash;
        foreach my $line (@typevalue) {
            if ($line =~ m/^(\C):\s*(.*)/) {
                my $type = $1;
                my $value = $2;
                if ($type eq 'F') {
                    if (file_match_pattern($file, $value)) {
-                       add_categories($tvi);
+                       my $pattern_depth = ($value =~ tr@/@@);
+                       $pattern_depth++ if (!(substr($value,-1,1) eq "/"));
+                       $hash{$tvi} = $pattern_depth;
                    }
                }
            }
            $tvi++;
        }
+       foreach my $line (sort {$hash{$b} <=> $hash{$a}} keys %hash) {
+           add_categories($line);
+       }
     }
 
     if ($email && $email_git) {