diff options
-rwxr-xr-x | scripts/checkpatch.pl | 138 |
1 files changed, 111 insertions, 27 deletions
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index fa478074b8..28d71b3733 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -18,11 +18,12 @@ use Getopt::Long qw(:config no_auto_abbrev); my $quiet = 0; my $tree = 1; my $chk_signoff = 1; -my $chk_patch = 1; +my $chk_patch = undef; +my $chk_branch = undef; my $tst_only; my $emacs = 0; my $terse = 0; -my $file = 0; +my $file = undef; my $no_warnings = 0; my $summary = 1; my $mailback = 0; @@ -35,14 +36,19 @@ sub help { my ($exitcode) = @_; print << "EOM"; -Usage: $P [OPTION]... [FILE]... +Usage: + + $P [OPTION]... [FILE]... + $P [OPTION]... [GIT-REV-LIST] + Version: $V Options: -q, --quiet quiet --no-tree run without a kernel tree --no-signoff do not check for 'Signed-off-by' line - --patch treat FILE as patchfile (default) + --patch treat FILE as patchfile + --branch treat args as GIT revision list --emacs emacs compile window format --terse one line per report -f, --file treat FILE as regular source file @@ -69,6 +75,7 @@ GetOptions( 'tree!' => \$tree, 'signoff!' => \$chk_signoff, 'patch!' => \$chk_patch, + 'branch!' => \$chk_branch, 'emacs!' => \$emacs, 'terse!' => \$terse, 'f|file!' => \$file, @@ -93,6 +100,49 @@ if ($#ARGV < 0) { exit(1); } +if (!defined $chk_branch && !defined $chk_patch && !defined $file) { + $chk_branch = $ARGV[0] =~ /\.\./ ? 1 : 0; + $chk_patch = $chk_branch ? 0 : + $ARGV[0] =~ /\.patch$/ || $ARGV[0] eq "-" ? 1 : 0; + $file = $chk_branch || $chk_patch ? 0 : 1; +} elsif (!defined $chk_branch && !defined $chk_patch) { + if ($file) { + $chk_branch = $chk_patch = 0; + } else { + $chk_branch = $ARGV[0] =~ /\.\./ ? 1 : 0; + $chk_patch = $chk_branch ? 0 : 1; + } +} elsif (!defined $chk_branch && !defined $file) { + if ($chk_patch) { + $chk_branch = $file = 0; + } else { + $chk_branch = $ARGV[0] =~ /\.\./ ? 1 : 0; + $file = $chk_branch ? 0 : 1; + } +} elsif (!defined $chk_patch && !defined $file) { + if ($chk_branch) { + $chk_patch = $file = 0; + } else { + $chk_patch = $ARGV[0] =~ /\.patch$/ || $ARGV[0] eq "-" ? 1 : 0; + $file = $chk_patch ? 0 : 1; + } +} elsif (!defined $chk_branch) { + $chk_branch = $chk_patch || $file ? 0 : 1; +} elsif (!defined $chk_patch) { + $chk_patch = $chk_branch || $file ? 0 : 1; +} elsif (!defined $file) { + $file = $chk_patch || $chk_branch ? 0 : 1; +} + +if (($chk_patch && $chk_branch) || + ($chk_patch && $file) || + ($chk_branch && $file)) { + die "Only one of --file, --branch, --patch is permitted\n"; +} +if (!$chk_patch && !$chk_branch && !$file) { + die "One of --file, --branch, --patch is required\n"; +} + my $dbg_values = 0; my $dbg_possible = 0; my $dbg_type = 0; @@ -251,32 +301,66 @@ $chk_signoff = 0 if ($file); my @rawlines = (); my @lines = (); my $vname; -for my $filename (@ARGV) { - my $FILE; - if ($file) { - open($FILE, '-|', "diff -u /dev/null $filename") || - die "$P: $filename: diff failed - $!\n"; - } elsif ($filename eq '-') { - open($FILE, '<&STDIN'); - } else { - open($FILE, '<', "$filename") || - die "$P: $filename: open failed - $!\n"; - } - if ($filename eq '-') { - $vname = 'Your patch'; - } else { - $vname = $filename; - } - while (<$FILE>) { +if ($chk_branch) { + my @patches; + my $HASH; + open($HASH, "-|", "git", "log", "--format=%H", $ARGV[0]) || + die "$P: git log --format=%H $ARGV[0] failed - $!\n"; + + while (<$HASH>) { chomp; - push(@rawlines, $_); + push @patches, $_; + } + + close $HASH; + + die "$P: no revisions returned for revlist '$chk_branch'\n" + unless @patches; + + for my $hash (@patches) { + my $FILE; + open($FILE, '-|', "git", "show", $hash) || + die "$P: git show $hash - $!\n"; + $vname = $hash; + while (<$FILE>) { + chomp; + push(@rawlines, $_); + } + close($FILE); + if (!process($hash)) { + $exit = 1; + } + @rawlines = (); + @lines = (); } - close($FILE); - if (!process($filename)) { - $exit = 1; +} else { + for my $filename (@ARGV) { + my $FILE; + if ($file) { + open($FILE, '-|', "diff -u /dev/null $filename") || + die "$P: $filename: diff failed - $!\n"; + } elsif ($filename eq '-') { + open($FILE, '<&STDIN'); + } else { + open($FILE, '<', "$filename") || + die "$P: $filename: open failed - $!\n"; + } + if ($filename eq '-') { + $vname = 'Your patch'; + } else { + $vname = $filename; + } + while (<$FILE>) { + chomp; + push(@rawlines, $_); + } + close($FILE); + if (!process($filename)) { + $exit = 1; + } + @rawlines = (); + @lines = (); } - @rawlines = (); - @lines = (); } exit($exit); |