Commit 92f3f19c519d2eb18812a38312b05075cf0407db

Authored by Luis R. Rodriguez
Committed by Sam Ravnborg
1 parent 82fa39552f

checkincludes.pl: add option to remove duplicates in place

checkincludes.pl is more useful if it actually removed the lines.  This
adds support for that with -r.

[akpm@linux-foundation.org: improve usage message]
Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>

Showing 1 changed file with 59 additions and 7 deletions Side-by-side Diff

scripts/checkincludes.pl
1 1 #!/usr/bin/perl
2 2 #
3   -# checkincludes: Find files included more than once in (other) files.
  3 +# checkincludes: find/remove files included more than once
  4 +#
4 5 # Copyright abandoned, 2000, Niels Kristian Bech Jensen <nkbj@image.dk>.
  6 +# Copyright 2009 Luis R. Rodriguez <mcgrof@gmail.com>
  7 +#
  8 +# This script checks for duplicate includes. It also has support
  9 +# to remove them in place. Note that this will not take into
  10 +# consideration macros so you should run this only if you know
  11 +# you do have real dups and do not have them under #ifdef's. You
  12 +# could also just review the results.
5 13  
6 14 sub usage {
7   - print "Usage: checkincludes.pl <file list>\n";
  15 + print "Usage: checkincludes.pl [-r]\n";
  16 + print "By default we just warn of duplicates\n";
  17 + print "To remove duplicated includes in place use -r\n";
8 18 exit 1;
9 19 }
10 20  
  21 +my $remove = 0;
  22 +
11 23 if ($#ARGV < 0) {
12   - usage();
  24 + usage();
13 25 }
14 26  
  27 +if ($#ARGV >= 1) {
  28 + if ($ARGV[0] =~ /^-/) {
  29 + if ($ARGV[0] eq "-r") {
  30 + $remove = 1;
  31 + shift;
  32 + } else {
  33 + usage();
  34 + }
  35 + }
  36 +}
  37 +
15 38 foreach $file (@ARGV) {
16 39 open(FILE, $file) or die "Cannot open $file: $!.\n";
17 40  
18 41 my %includedfiles = ();
  42 + my @file_lines = ();
19 43  
20 44 while (<FILE>) {
21 45 if (m/^\s*#\s*include\s*[<"](\S*)[>"]/o) {
22 46 ++$includedfiles{$1};
23 47 }
  48 + push(@file_lines, $_);
24 49 }
25 50  
26 51 close(FILE);
27   -
28   - foreach $filename (keys %includedfiles) {
29   - if ($includedfiles{$filename} > 1) {
30   - print "$file: $filename is included more than once.\n";
  52 +
  53 + if (!$remove) {
  54 + foreach $filename (keys %includedfiles) {
  55 + if ($includedfiles{$filename} > 1) {
  56 + print "$file: $filename is included more than once.\n";
  57 + }
31 58 }
  59 + next;
32 60 }
  61 +
  62 + open(FILE,">$file") || die("Cannot write to $file: $!");
  63 +
  64 + my $dups = 0;
  65 + foreach (@file_lines) {
  66 + if (m/^\s*#\s*include\s*[<"](\S*)[>"]/o) {
  67 + foreach $filename (keys %includedfiles) {
  68 + if ($1 eq $filename) {
  69 + if ($includedfiles{$filename} > 1) {
  70 + $includedfiles{$filename}--;
  71 + $dups++;
  72 + } else {
  73 + print FILE $_;
  74 + }
  75 + }
  76 + }
  77 + } else {
  78 + print FILE $_;
  79 + }
  80 + }
  81 + if ($dups > 0) {
  82 + print "$file: removed $dups duplicate includes\n";
  83 + }
  84 + close(FILE);
33 85 }