提交 3445686a 编写于 作者: J Joe Perches 提交者: Linus Torvalds

checkpatch: ignore existing CamelCase uses from include/...

When using --strict, CamelCase uses are described with CHECK: messages.
These CamelCase uses may be acceptable and should not generate these
messages when the variable is already defined in a file from the
include/...  path.

So, change checkpatch to read all the .h files in include/...  and look
for preexisting CamelCase #defines, typedefs and function prototypes.

Add these to the existing camelcase hash so that any uses in the patch or
file can be ignored.

There are currently ~3500 files in include/.  It takes about 10 cpu
seconds on my little netbook to grep for and preseed these existing uses.

That's about 4x the time for a similar git grep.

This preseeding is only done once when using --strict and only when there
is a CamelCase use found.

If a .git directory is found, it uses 'git ls-files include' If not, it
uses 'find $root/include -name "*.h"
Signed-off-by: NJoe Perches <joe@perches.com>
Cc: Andy Whitcroft <apw@canonical.com>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 22735ce8
...@@ -31,6 +31,7 @@ my $fix = 0; ...@@ -31,6 +31,7 @@ my $fix = 0;
my $root; my $root;
my %debug; my %debug;
my %ignore_type = (); my %ignore_type = ();
my %camelcase = ();
my @ignore = (); my @ignore = ();
my $help = 0; my $help = 0;
my $configuration_file = ".checkpatch.conf"; my $configuration_file = ".checkpatch.conf";
...@@ -349,7 +350,6 @@ sub build_types { ...@@ -349,7 +350,6 @@ sub build_types {
} }
build_types(); build_types();
our $Typecast = qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*}; our $Typecast = qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
# Using $balanced_parens, $LvalOrFunc, or $FuncArg # Using $balanced_parens, $LvalOrFunc, or $FuncArg
...@@ -369,6 +369,48 @@ sub deparenthesize { ...@@ -369,6 +369,48 @@ sub deparenthesize {
return $string; return $string;
} }
sub seed_camelcase_file {
my ($file) = @_;
return if (!(-f $file));
local $/;
open(my $include_file, '<', "$file")
or warn "$P: Can't read '$file' $!\n";
my $text = <$include_file>;
close($include_file);
my @lines = split('\n', $text);
foreach my $line (@lines) {
next if ($line !~ /(?:[A-Z][a-z]|[a-z][A-Z])/);
if ($line =~ /^[ \t]*(?:#[ \t]*define|typedef\s+$Type)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)/) {
$camelcase{$1} = 1;
}
elsif ($line =~ /^\s*$Declare\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*\(/) {
$camelcase{$1} = 1;
}
}
}
my $camelcase_seeded = 0;
sub seed_camelcase_includes {
return if ($camelcase_seeded);
my $files;
if (-d ".git") {
$files = `git ls-files include`;
} else {
$files = `find $root/include -name "*.h"`;
}
my @include_files = split('\n', $files);
foreach my $file (@include_files) {
seed_camelcase_file($file);
}
$camelcase_seeded = 1;
}
$chk_signoff = 0 if ($file); $chk_signoff = 0 if ($file);
my @rawlines = (); my @rawlines = ();
...@@ -1448,7 +1490,6 @@ sub process { ...@@ -1448,7 +1490,6 @@ sub process {
my %suppress_export; my %suppress_export;
my $suppress_statement = 0; my $suppress_statement = 0;
my %camelcase = ();
# Pre-scan the patch sanitizing the lines. # Pre-scan the patch sanitizing the lines.
# Pre-scan the patch looking for any __setup documentation. # Pre-scan the patch looking for any __setup documentation.
...@@ -3198,13 +3239,15 @@ sub process { ...@@ -3198,13 +3239,15 @@ sub process {
#Ignore Page<foo> variants #Ignore Page<foo> variants
$var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ && $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
#Ignore SI style variants like nS, mV and dB (ie: max_uV, regulator_min_uA_show) #Ignore SI style variants like nS, mV and dB (ie: max_uV, regulator_min_uA_show)
$var !~ /^(?:[a-z_]*?)_?[a-z][A-Z](?:_[a-z_]+)?$/ && $var !~ /^(?:[a-z_]*?)_?[a-z][A-Z](?:_[a-z_]+)?$/) {
!defined $camelcase{$var}) { seed_camelcase_includes() if ($check);
if (!defined $camelcase{$var}) {
$camelcase{$var} = 1; $camelcase{$var} = 1;
CHK("CAMELCASE", CHK("CAMELCASE",
"Avoid CamelCase: <$var>\n" . $herecurr); "Avoid CamelCase: <$var>\n" . $herecurr);
} }
} }
}
#no spaces allowed after \ in define #no spaces allowed after \ in define
if ($line=~/\#\s*define.*\\\s$/) { if ($line=~/\#\s*define.*\\\s$/) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册