Skip to content

Commit

Permalink
checkpatch: add support to check already applied git commits
Browse files Browse the repository at this point in the history
It's sometimes useful to scan already committed patches.

Add --git <revision range> to scan specific or multiple commits.

Single commits are scanned with
	--git <rev>
Multiple commits are scanned with
	--git <range>
	--git <commit>-<count>

[[email protected]:
o Don't exec git for each <commit>-<count>,
  use a single "git log -<count> <commit>"
o Consolidate the git exec for the <range> and <commit>-<count> variants
o Output 12 character commit hash ids
o Don't scan git commit merges
o Use -M to reduce the size of rename commits]

Signed-off-by: "Du, Changbin" <[email protected]>
Signed-off-by: Joe Perches <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Du, Changbin authored and torvalds committed May 21, 2016
1 parent 3beb42e commit 4a593c3
Showing 1 changed file with 47 additions and 1 deletion.
48 changes: 47 additions & 1 deletion scripts/checkpatch.pl
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
my $terse = 0;
my $showfile = 0;
my $file = 0;
my $git = 0;
my $check = 0;
my $check_orig = 0;
my $summary = 1;
Expand Down Expand Up @@ -69,6 +70,16 @@ sub help {
--emacs emacs compile window format
--terse one line per report
--showfile emit diffed file position, not input file position
-g, --git treat FILE as a single commit or git revision range
single git commit with:
<rev>
<rev>^
<rev>~n
multiple git commits with:
<rev1>..<rev2>
<rev1>...<rev2>
<rev>-<count>
git merges are ignored
-f, --file treat FILE as regular source file
--subjective, --strict enable more subjective tests
--list-types list the possible message types
Expand Down Expand Up @@ -174,6 +185,7 @@ sub list_types {
'terse!' => \$terse,
'showfile!' => \$showfile,
'f|file!' => \$file,
'g|git!' => \$git,
'subjective!' => \$check,
'strict!' => \$check,
'ignore=s' => \@ignore,
Expand Down Expand Up @@ -788,10 +800,42 @@ sub git_commit_info {
my @fixed_deleted = ();
my $fixlinenr = -1;

# If input is git commits, extract all commits from the commit expressions.
# For example, HEAD-3 means we need check 'HEAD, HEAD~1, HEAD~2'.
die "$P: No git repository found\n" if ($git && !-e ".git");

if ($git) {
my @commits = ();
for my $commit_expr (@ARGV) {
my $git_range;
if ($commit_expr =~ m/-/) {
my @tmp = split(/-/, $commit_expr);
die "$P: incorrect git commits expression $commit_expr$!\n"
if (@tmp != 2);
$git_range = "-$tmp[1] $tmp[0]";
} elsif ($commit_expr =~ m/\.\./) {
$git_range = "$commit_expr";
}
if (defined $git_range) {
my $lines = `git log --no-merges --pretty=format:'%H' $git_range`;
foreach my $line (split(/\n/, $lines)) {
unshift(@commits, $line);
}
} else {
unshift(@commits, $commit_expr);
}
}
die "$P: no git commits after extraction!\n" if (@commits == 0);
@ARGV = @commits;
}

my $vname;
for my $filename (@ARGV) {
my $FILE;
if ($file) {
if ($git) {
open($FILE, '-|', "git format-patch -M --stdout -1 $filename") ||
die "$P: $filename: git format-patch failed - $!\n";
} elsif ($file) {
open($FILE, '-|', "diff -u /dev/null $filename") ||
die "$P: $filename: diff failed - $!\n";
} elsif ($filename eq '-') {
Expand All @@ -802,6 +846,8 @@ sub git_commit_info {
}
if ($filename eq '-') {
$vname = 'Your patch';
} elsif ($git) {
$vname = "Commit " . substr($filename, 0, 12) . `git log -1 --pretty=format:' ("%s")' $filename`;
} else {
$vname = $filename;
}
Expand Down

0 comments on commit 4a593c3

Please sign in to comment.