From 939680ee42dc1c1b11c5adb9111db5d94bbb5bb6 Mon Sep 17 00:00:00 2001 From: Simon Ruderich Date: Thu, 1 Mar 2018 10:15:30 +0100 Subject: [PATCH] Add --line-numbers option MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Suggested and helped by Stefan Pöschel . --- bin/blhc | 34 +++++++++++++++++++++++++++------- t/tests.t | 15 ++++++++++++++- 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/bin/blhc b/bin/blhc index b51d186..fb4123c 100755 --- a/bin/blhc +++ b/bin/blhc @@ -349,7 +349,7 @@ sub array_equal { } sub error_flags { - my ($message, $missing_flags_ref, $flag_renames_ref, $line) = @_; + my ($message, $missing_flags_ref, $flag_renames_ref, $line, $number) = @_; # Get string value of qr//-escaped regexps and if requested rename them. my @missing_flags = map { @@ -357,6 +357,7 @@ sub error_flags { } @{$missing_flags_ref}; my $flags = join ' ', @missing_flags; + printf '%d:', $number if defined $number; printf '%s (%s)%s %s', error_color($message, 'red'), $flags, error_color(':', 'yellow'), $line; @@ -364,8 +365,9 @@ sub error_flags { return; } sub error_non_verbose_build { - my ($line) = @_; + my ($line, $number) = @_; + printf '%d:', $number if defined $number; printf '%s%s %s', error_color('NONVERBOSE BUILD', 'red'), error_color(':', 'yellow'), @@ -604,6 +606,7 @@ my $option_arch = undef; my $option_buildd = 0; my $option_debian = 0; $option_color = 0; +my $option_line_numbers = 0; if (not Getopt::Long::GetOptions( 'help|h|?' => \$option_help, 'version' => \$option_version, @@ -622,6 +625,7 @@ if (not Getopt::Long::GetOptions( 'arch=s' => \$option_arch, 'buildd' => \$option_buildd, 'debian' => \$option_debian, + 'line-numbers' => \$option_line_numbers, )) { require Pod::Usage; Pod::Usage::pod2usage(2); @@ -759,7 +763,10 @@ foreach my $file (@ARGV) { $disable_harden_pie = 1; } + my $number = 0; while (my $line = <$fh>) { + $number++; + # Detect architecture automatically unless overridden. For buildd logs # only, doesn't use the dpkg-buildpackage header. Necessary to ignore # build logs which aren't built (wrong architecture, build error, @@ -879,11 +886,15 @@ foreach my $file (@ARGV) { # is_non_verbose_build() (which is quite slow) in the second loop when # it's already clear if a line is non-verbose or not. my @input_nonverbose = (); + # Input line number. + my @input_number = (); my $continuation = 0; my $complete_line = undef; my $non_verbose; while (my $line = <$fh>) { + $number++; + # And stop at the end of the build log. Package details (reported by # the buildd logs) are not important for us. This also prevents false # positives. @@ -1025,6 +1036,7 @@ foreach my $file (@ARGV) { push @input, $line; push @input_nonverbose, $non_verbose; + push @input_number, $number if $option_line_numbers; } } @@ -1181,7 +1193,7 @@ LINE: and is_non_verbose_build($line, \$skip, \@input, $i, $parallel)) { if (not $option_buildd) { - error_non_verbose_build($line); + error_non_verbose_build($line, $input_number[$i]); $exit |= $exit_code{non_verbose_build}; } else { $statistics{commands_nonverbose}++; @@ -1325,7 +1337,8 @@ LINE: # Assume dpkg-buildflags returns the correct flags. and index($line, '`dpkg-buildflags --get CFLAGS`') == -1) { if (not $option_buildd) { - error_flags('CFLAGS missing', \@missing, \%flag_renames, $input[$i]); + error_flags('CFLAGS missing', \@missing, \%flag_renames, + $input[$i], $input_number[$i]); $exit |= $exit_code{flags_missing}; } else { $statistics{compile_missing}++; @@ -1338,7 +1351,8 @@ LINE: # Assume dpkg-buildflags returns the correct flags. and index($line, '`dpkg-buildflags --get CXXFLAGS`') == -1) { if (not $option_buildd) { - error_flags('CXXFLAGS missing', \@missing, \%flag_renames, $input[$i]); + error_flags('CXXFLAGS missing', \@missing, \%flag_renames, + $input[$i], $input_number[$i]); $exit |= $exit_code{flags_missing}; } else { $statistics{compile_cpp_missing}++; @@ -1352,7 +1366,8 @@ LINE: # Assume dpkg-buildflags returns the correct flags. and index($line, '`dpkg-buildflags --get CPPFLAGS`') == -1) { if (not $option_buildd) { - error_flags('CPPFLAGS missing', \@missing, \%flag_renames, $input[$i]); + error_flags('CPPFLAGS missing', \@missing, \%flag_renames, + $input[$i], $input_number[$i]); $exit |= $exit_code{flags_missing}; } else { $statistics{preprocess_missing}++; @@ -1364,7 +1379,8 @@ LINE: # Assume dpkg-buildflags returns the correct flags. and index($line, '`dpkg-buildflags --get LDFLAGS`') == -1) { if (not $option_buildd) { - error_flags('LDFLAGS missing', \@missing, \%flag_renames, $input[$i]); + error_flags('LDFLAGS missing', \@missing, \%flag_renames, + $input[$i], $input_number[$i]); $exit |= $exit_code{flags_missing}; } else { $statistics{link_missing}++; @@ -1503,6 +1519,10 @@ compiler command line argument. Use colored (ANSI) output for warning messages. +=item B<--line-numbers> + +Display line numbers. + =item B<--ignore-arch> I Ignore build logs from architectures matching I. I is a string. diff --git a/t/tests.t b/t/tests.t index 26822a0..3aa79b1 100644 --- a/t/tests.t +++ b/t/tests.t @@ -19,7 +19,7 @@ use strict; use warnings; -use Test::More tests => 228; +use Test::More tests => 232; sub is_blhc { @@ -650,6 +650,10 @@ is_blhc 'configure-check', '', 4, 'NONVERBOSE BUILD: CC = gcc -std=gnu99 -std=gnu99 test.c '; +is_blhc 'configure-check', '--line-numbers', 4, + '5:NONVERBOSE BUILD: CC = gcc -std=gnu99 -std=gnu99 test.c +'; + is_blhc 'make', '', 1, $empty; @@ -884,6 +888,15 @@ CPPFLAGS missing (-D_FORTIFY_SOURCE=2): gcc -c `dpkg-buildflags --get LDFLAGS` t LDFLAGS missing (-Wl,-z,relro): gcc -o test test.o `dpkg-buildflags --get CFLAGS` '; +is_blhc 'debian', '--line-numbers', 8, + '9:CPPFLAGS missing (-D_FORTIFY_SOURCE=2): gcc -g -O2 -fstack-protector-strong -Wformat -Wformat-security -Werror=format-security -Wall -c test.c +13:CPPFLAGS missing (-D_FORTIFY_SOURCE=2): gcc -c `dpkg-buildflags --get CFLAGS` test.c +14:CPPFLAGS missing (-D_FORTIFY_SOURCE=2): g++ -c `dpkg-buildflags --get CXXFLAGS` test.cc +15:CFLAGS missing (-g -O2 -fstack-protector-strong -Wformat -Werror=format-security): gcc -c `dpkg-buildflags --get LDFLAGS` test.c +15:CPPFLAGS missing (-D_FORTIFY_SOURCE=2): gcc -c `dpkg-buildflags --get LDFLAGS` test.c +19:LDFLAGS missing (-Wl,-z,relro): gcc -o test test.o `dpkg-buildflags --get CFLAGS` +'; + is_blhc 'debian-cmake', '', 32, 'INVALID CMAKE: 2.8.7-1 '; -- 2.43.2