Blame view

scripts/parse-maintainers.pl 3.72 KB
7683e9e52   Linus Torvalds   Properly alphabet...
1
  #!/usr/bin/perl -w
b24413180   Greg Kroah-Hartman   License cleanup: ...
2
  # SPDX-License-Identifier: GPL-2.0
7683e9e52   Linus Torvalds   Properly alphabet...
3
4
  
  use strict;
1e6270d07   Joe Perches   parse-maintainers...
5
6
7
8
9
10
  use Getopt::Long qw(:config no_auto_abbrev);
  
  my $input_file = "MAINTAINERS";
  my $output_file = "MAINTAINERS.new";
  my $output_section = "SECTION.new";
  my $help = 0;
7683e9e52   Linus Torvalds   Properly alphabet...
11

fe9090301   Joe Perches   parse-maintainers...
12
  my $P = $0;
7683e9e52   Linus Torvalds   Properly alphabet...
13

1e6270d07   Joe Perches   parse-maintainers...
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
  if (!GetOptions(
  		'input=s' => \$input_file,
  		'output=s' => \$output_file,
  		'section=s' => \$output_section,
  		'h|help|usage' => \$help,
  	    )) {
      die "$P: invalid argument - use --help if necessary
  ";
  }
  
  if ($help != 0) {
      usage();
      exit 0;
  }
  
  sub usage {
      print <<EOT;
  usage: $P [options] <pattern matching regexes>
  
    --input => MAINTAINERS file to read (default: MAINTAINERS)
    --output => sorted MAINTAINERS file to write (default: MAINTAINERS.new)
    --section => new sorted MAINTAINERS file to write to (default: SECTION.new)
  
  If <pattern match regexes> exist, then the sections that match the
  regexes are not written to the output file but are written to the
  section file.
  
  EOT
  }
61f741645   Joe Perches   parse-maintainers...
43
  # sort comparison functions
7683e9e52   Linus Torvalds   Properly alphabet...
44
45
46
47
48
49
50
51
52
  sub by_category($$) {
      my ($a, $b) = @_;
  
      $a = uc $a;
      $b = uc $b;
  
      # This always sorts last
      $a =~ s/THE REST/ZZZZZZ/g;
      $b =~ s/THE REST/ZZZZZZ/g;
61f741645   Joe Perches   parse-maintainers...
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
      return $a cmp $b;
  }
  
  sub by_pattern($$) {
      my ($a, $b) = @_;
      my $preferred_order = 'MRPLSWTQBCFXNK';
  
      my $a1 = uc(substr($a, 0, 1));
      my $b1 = uc(substr($b, 0, 1));
  
      my $a_index = index($preferred_order, $a1);
      my $b_index = index($preferred_order, $b1);
  
      $a_index = 1000 if ($a_index == -1);
      $b_index = 1000 if ($b_index == -1);
  
      if (($a1 =~ /^F$/ && $b1 =~ /^F$/) ||
  	($a1 =~ /^X$/ && $b1 =~ /^X$/)) {
  	return $a cmp $b;
      }
  
      if ($a_index < $b_index) {
  	return -1;
      } elsif ($a_index == $b_index) {
  	return 0;
      } else {
  	return 1;
      }
7683e9e52   Linus Torvalds   Properly alphabet...
81
  }
fe9090301   Joe Perches   parse-maintainers...
82
83
84
85
86
87
  sub trim {
      my $s = shift;
      $s =~ s/\s+$//;
      $s =~ s/^\s+//;
      return $s;
  }
7683e9e52   Linus Torvalds   Properly alphabet...
88
  sub alpha_output {
fe9090301   Joe Perches   parse-maintainers...
89
      my ($hashref, $filename) = (@_);
1e6270d07   Joe Perches   parse-maintainers...
90
      return if ! scalar(keys %$hashref);
fe9090301   Joe Perches   parse-maintainers...
91
92
      open(my $file, '>', "$filename") or die "$P: $filename: open failed - $!
  ";
1e6270d07   Joe Perches   parse-maintainers...
93
      my $separator;
fe9090301   Joe Perches   parse-maintainers...
94
      foreach my $key (sort by_category keys %$hashref) {
61f741645   Joe Perches   parse-maintainers...
95
  	if ($key eq " ") {
fe9090301   Joe Perches   parse-maintainers...
96
  	    print $file $$hashref{$key};
61f741645   Joe Perches   parse-maintainers...
97
  	} else {
1e6270d07   Joe Perches   parse-maintainers...
98
99
100
101
102
103
104
105
  	    if (! defined $separator) {
  		$separator = "
  ";
  	    } else {
  		print $file $separator;
  	    }
  	    print $file $key . "
  ";
fe9090301   Joe Perches   parse-maintainers...
106
107
108
109
  	    foreach my $pattern (sort by_pattern split('
  ', %$hashref{$key})) {
  		print $file ($pattern . "
  ");
61f741645   Joe Perches   parse-maintainers...
110
111
  	    }
  	}
7683e9e52   Linus Torvalds   Properly alphabet...
112
      }
fe9090301   Joe Perches   parse-maintainers...
113
      close($file);
7683e9e52   Linus Torvalds   Properly alphabet...
114
115
116
  }
  
  sub file_input {
fe9090301   Joe Perches   parse-maintainers...
117
      my ($hashref, $filename) = (@_);
7683e9e52   Linus Torvalds   Properly alphabet...
118
119
      my $lastline = "";
      my $case = " ";
fe9090301   Joe Perches   parse-maintainers...
120
121
122
123
      $$hashref{$case} = "";
  
      open(my $file, '<', "$filename") or die "$P: $filename: open failed - $!
  ";
7683e9e52   Linus Torvalds   Properly alphabet...
124

fe9090301   Joe Perches   parse-maintainers...
125
      while (<$file>) {
7683e9e52   Linus Torvalds   Properly alphabet...
126
127
128
129
130
131
132
          my $line = $_;
  
          # Pattern line?
          if ($line =~ m/^([A-Z]):\s*(.*)/) {
              $line = $1 . ":\t" . trim($2) . "
  ";
              if ($lastline eq "") {
fe9090301   Joe Perches   parse-maintainers...
133
                  $$hashref{$case} = $$hashref{$case} . $line;
7683e9e52   Linus Torvalds   Properly alphabet...
134
135
136
                  next;
              }
              $case = trim($lastline);
fe9090301   Joe Perches   parse-maintainers...
137
138
              exists $$hashref{$case} and die "Header '$case' already exists";
              $$hashref{$case} = $line;
7683e9e52   Linus Torvalds   Properly alphabet...
139
140
141
142
143
              $lastline = "";
              next;
          }
  
          if ($case eq " ") {
fe9090301   Joe Perches   parse-maintainers...
144
              $$hashref{$case} = $$hashref{$case} . $lastline;
7683e9e52   Linus Torvalds   Properly alphabet...
145
146
147
148
149
150
              $lastline = $line;
              next;
          }
          trim($lastline) eq "" or die ("Odd non-pattern line '$lastline' for '$case'");
          $lastline = $line;
      }
fe9090301   Joe Perches   parse-maintainers...
151
152
      $$hashref{$case} = $$hashref{$case} . $lastline;
      close($file);
7683e9e52   Linus Torvalds   Properly alphabet...
153
  }
fe9090301   Joe Perches   parse-maintainers...
154
  my %hash;
b95c29a20   Joe Perches   parse-maintainers...
155
  my %new_hash;
fe9090301   Joe Perches   parse-maintainers...
156

1e6270d07   Joe Perches   parse-maintainers...
157
  file_input(\%hash, $input_file);
b95c29a20   Joe Perches   parse-maintainers...
158
159
160
161
162
163
164
165
166
  
  foreach my $type (@ARGV) {
      foreach my $key (keys %hash) {
  	if ($key =~ /$type/ || $hash{$key} =~ /$type/) {
  	    $new_hash{$key} = $hash{$key};
  	    delete $hash{$key};
  	}
      }
  }
1e6270d07   Joe Perches   parse-maintainers...
167
168
  alpha_output(\%hash, $output_file);
  alpha_output(\%new_hash, $output_section);
61f741645   Joe Perches   parse-maintainers...
169

7683e9e52   Linus Torvalds   Properly alphabet...
170
  exit(0);