Blame view

scripts/parse-maintainers.pl 2.75 KB
81f7e3824   Eric Lee   Initial Release, ...
1
2
3
4
5
6
7
8
9
10
11
12
13
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
43
44
45
46
47
48
49
50
51
52
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
  #!/usr/bin/perl -w
  # SPDX-License-Identifier: GPL-2.0
  
  use strict;
  
  my $P = $0;
  
  # sort comparison functions
  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;
  
      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;
      }
  }
  
  sub trim {
      my $s = shift;
      $s =~ s/\s+$//;
      $s =~ s/^\s+//;
      return $s;
  }
  
  sub alpha_output {
      my ($hashref, $filename) = (@_);
  
      open(my $file, '>', "$filename") or die "$P: $filename: open failed - $!
  ";
      foreach my $key (sort by_category keys %$hashref) {
  	if ($key eq " ") {
  	    chomp $$hashref{$key};
  	    print $file $$hashref{$key};
  	} else {
  	    print $file "
  " . $key . "
  ";
  	    foreach my $pattern (sort by_pattern split('
  ', %$hashref{$key})) {
  		print $file ($pattern . "
  ");
  	    }
  	}
      }
      close($file);
  }
  
  sub file_input {
      my ($hashref, $filename) = (@_);
  
      my $lastline = "";
      my $case = " ";
      $$hashref{$case} = "";
  
      open(my $file, '<', "$filename") or die "$P: $filename: open failed - $!
  ";
  
      while (<$file>) {
          my $line = $_;
  
          # Pattern line?
          if ($line =~ m/^([A-Z]):\s*(.*)/) {
              $line = $1 . ":\t" . trim($2) . "
  ";
              if ($lastline eq "") {
                  $$hashref{$case} = $$hashref{$case} . $line;
                  next;
              }
              $case = trim($lastline);
              exists $$hashref{$case} and die "Header '$case' already exists";
              $$hashref{$case} = $line;
              $lastline = "";
              next;
          }
  
          if ($case eq " ") {
              $$hashref{$case} = $$hashref{$case} . $lastline;
              $lastline = $line;
              next;
          }
          trim($lastline) eq "" or die ("Odd non-pattern line '$lastline' for '$case'");
          $lastline = $line;
      }
      $$hashref{$case} = $$hashref{$case} . $lastline;
      close($file);
  }
  
  my %hash;
  my %new_hash;
  
  file_input(\%hash, "MAINTAINERS");
  
  foreach my $type (@ARGV) {
      foreach my $key (keys %hash) {
  	if ($key =~ /$type/ || $hash{$key} =~ /$type/) {
  	    $new_hash{$key} = $hash{$key};
  	    delete $hash{$key};
  	}
      }
  }
  
  alpha_output(\%hash, "MAINTAINERS.new");
  alpha_output(\%new_hash, "SECTION.new");
  
  exit(0);