Skip to content

Commit

Permalink
checkpatch: add test for commit id formatting style in commit log
Browse files Browse the repository at this point in the history
Commit logs have various forms of commit id references.

Try to standardize on a 12 character long lower case commit id along
with a description of parentheses and the quoted subject line.

ie: commit 0123456789ab ("commit description")

If git and a git tree exists, look up the commit id and emit the
appropriate line as part of the message.

Signed-off-by: Joe Perches <joe@perches.com>
Requested-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Joe Perches authored and Linus Torvalds committed Aug 7, 2014
1 parent e367455 commit d311cd4
Showing 1 changed file with 54 additions and 0 deletions.
54 changes: 54 additions & 0 deletions scripts/checkpatch.pl
Original file line number Diff line number Diff line change
Expand Up @@ -550,6 +550,34 @@ sub seed_camelcase_includes {
}
}

sub git_commit_info {
my ($commit, $id, $desc) = @_;

return ($id, $desc) if ((which("git") eq "") || !(-e ".git"));

my $output = `git log --no-color --format='%H %s' -1 $commit 2>&1`;
$output =~ s/^\s*//gm;
my @lines = split("\n", $output);

if ($lines[0] =~ /^error: short SHA1 $commit is ambiguous\./) {
# Maybe one day convert this block of bash into something that returns
# all matching commit ids, but it's very slow...
#
# echo "checking commits $1..."
# git rev-list --remotes | grep -i "^$1" |
# while read line ; do
# git log --format='%H %s' -1 $line |
# echo "commit $(cut -c 1-12,41-)"
# done
} elsif ($lines[0] =~ /^fatal: ambiguous argument '$commit': unknown revision or path not in the working tree\./) {
} else {
$id = substr($lines[0], 0, 12);
$desc = substr($lines[0], 41);
}

return ($id, $desc);
}

$chk_signoff = 0 if ($file);

my @rawlines = ();
Expand Down Expand Up @@ -674,6 +702,18 @@ sub format_email {
return $formatted_email;
}

sub which {
my ($bin) = @_;

foreach my $path (split(/:/, $ENV{PATH})) {
if (-e "$path/$bin") {
return "$path/$bin";
}
}

return "";
}

sub which_conf {
my ($conf) = @_;

Expand Down Expand Up @@ -1958,6 +1998,20 @@ sub process {
"Remove Gerrit Change-Id's before submitting upstream.\n" . $herecurr);
}

# Check for improperly formed commit descriptions
if ($in_commit_log &&
$line =~ /\bcommit\s+[0-9a-f]{5,}/i &&
$line !~ /\b[Cc]ommit [0-9a-f]{12,16} \("/) {
$line =~ /\b(c)ommit\s+([0-9a-f]{5,})/i;
my $init_char = $1;
my $orig_commit = lc($2);
my $id = '01234567890ab';
my $desc = 'commit description';
($id, $desc) = git_commit_info($orig_commit, $id, $desc);
ERROR("GIT_COMMIT_ID",
"Please use 12 to 16 chars for the git commit ID like: '${init_char}ommit $id (\"$desc\")'\n" . $herecurr);
}

# Check for wrappage within a valid hunk of the file
if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
ERROR("CORRUPTED_PATCH",
Expand Down

0 comments on commit d311cd4

Please sign in to comment.