checkpatch: colorize output to terminal

Add optional colors to make seeing message types a bit easier.
The default is to show them on a tty.

Inspired by Linux commits 57230297116fa ("checkpatch: colorize output
to terminal") and 737c0767758b ("checkpatch: change format of --color
argument to --color[=WHEN]").

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
This commit is contained in:
Paolo Bonzini 2018-11-29 09:52:58 +01:00
parent c182b61996
commit 1db4269f34

View File

@ -7,6 +7,7 @@
use strict; use strict;
use warnings; use warnings;
use Term::ANSIColor qw(:constants);
my $P = $0; my $P = $0;
$P =~ s@.*/@@g; $P =~ s@.*/@@g;
@ -26,6 +27,7 @@ my $tst_only;
my $emacs = 0; my $emacs = 0;
my $terse = 0; my $terse = 0;
my $file = undef; my $file = undef;
my $color = "auto";
my $no_warnings = 0; my $no_warnings = 0;
my $summary = 1; my $summary = 1;
my $mailback = 0; my $mailback = 0;
@ -64,6 +66,8 @@ Options:
is all off) is all off)
--test-only=WORD report only warnings/errors containing WORD --test-only=WORD report only warnings/errors containing WORD
literally literally
--color[=WHEN] Use colors 'always', 'never', or only when output
is a terminal ('auto'). Default is 'auto'.
-h, --help, --version display this help and exit -h, --help, --version display this help and exit
When FILE is - read standard input. When FILE is - read standard input.
@ -72,6 +76,14 @@ EOM
exit($exitcode); exit($exitcode);
} }
# Perl's Getopt::Long allows options to take optional arguments after a space.
# Prevent --color by itself from consuming other arguments
foreach (@ARGV) {
if ($_ eq "--color" || $_ eq "-color") {
$_ = "--color=$color";
}
}
GetOptions( GetOptions(
'q|quiet+' => \$quiet, 'q|quiet+' => \$quiet,
'tree!' => \$tree, 'tree!' => \$tree,
@ -89,6 +101,8 @@ GetOptions(
'debug=s' => \%debug, 'debug=s' => \%debug,
'test-only=s' => \$tst_only, 'test-only=s' => \$tst_only,
'color=s' => \$color,
'no-color' => sub { $color = 'never'; },
'h|help' => \$help, 'h|help' => \$help,
'version' => \$help 'version' => \$help
) or help(1); ) or help(1);
@ -144,6 +158,16 @@ if (!$chk_patch && !$chk_branch && !$file) {
die "One of --file, --branch, --patch is required\n"; die "One of --file, --branch, --patch is required\n";
} }
if ($color =~ /^always$/i) {
$color = 1;
} elsif ($color =~ /^never$/i) {
$color = 0;
} elsif ($color =~ /^auto$/i) {
$color = (-t STDOUT);
} else {
die "Invalid color mode: $color\n";
}
my $dbg_values = 0; my $dbg_values = 0;
my $dbg_possible = 0; my $dbg_possible = 0;
my $dbg_type = 0; my $dbg_type = 0;
@ -371,7 +395,9 @@ if ($chk_branch) {
close($FILE); close($FILE);
$vname = substr($hash, 0, 12) . ' (' . $git_commits{$hash} . ')'; $vname = substr($hash, 0, 12) . ' (' . $git_commits{$hash} . ')';
if ($num_patches > 1 && $quiet == 0) { if ($num_patches > 1 && $quiet == 0) {
print "$i/$num_patches Checking commit $vname\n"; my $prefix = "$i/$num_patches";
$prefix = BLUE . BOLD . $prefix . RESET if $color;
print "$prefix Checking commit $vname\n";
$vname = "Patch $i/$num_patches"; $vname = "Patch $i/$num_patches";
} else { } else {
$vname = "Commit " . $vname; $vname = "Commit " . $vname;
@ -1181,14 +1207,23 @@ sub possible {
my $prefix = ''; my $prefix = '';
sub report { sub report {
if (defined $tst_only && $_[0] !~ /\Q$tst_only\E/) { my ($level, $msg) = @_;
if (defined $tst_only && $msg !~ /\Q$tst_only\E/) {
return 0; return 0;
} }
my $line = $prefix . $_[0];
$line = (split('\n', $line))[0] . "\n" if ($terse); my $output = '';
$output .= BOLD if $color;
$output .= $prefix;
$output .= RED if $color && $level eq 'ERROR';
$output .= MAGENTA if $color && $level eq 'WARNING';
$output .= $level . ':';
$output .= RESET if $color;
$output .= ' ' . $msg . "\n";
push(our @report, $line); $output = (split('\n', $output))[0] . "\n" if ($terse);
push(our @report, $output);
return 1; return 1;
} }
@ -1196,13 +1231,13 @@ sub report_dump {
our @report; our @report;
} }
sub ERROR { sub ERROR {
if (report("ERROR: $_[0]\n")) { if (report("ERROR", $_[0])) {
our $clean = 0; our $clean = 0;
our $cnt_error++; our $cnt_error++;
} }
} }
sub WARN { sub WARN {
if (report("WARNING: $_[0]\n")) { if (report("WARNING", $_[0])) {
our $clean = 0; our $clean = 0;
our $cnt_warn++; our $cnt_warn++;
} }