perl: check for perl warnings while running tests

We set "use warnings" in most of our perl code to catch problems. But as
the name implies, warnings just emit a message to stderr and don't
otherwise affect the program. So our tests are quite likely to miss that
warnings are being spewed, as most of them do not look at stderr.

We could ask perl to make all warnings fatal, but this is likely
annoying for non-developers, who would rather have a running program
with a warning than something that refuses to work at all.

So instead, let's teach the perl code to respect an environment variable
(GIT_PERL_FATAL_WARNINGS) to increase the severity of the warnings. This
can be set for day-to-day running if people want to be really pedantic,
but the primary use is to trigger it within the test suite.

We could also trigger that for every test run, but likewise even the
tests failing may be annoying to distro builders, etc (just as -Werror
would be for compiling C code). So we'll tie it to a special test-mode
variable (GIT_TEST_PERL_FATAL_WARNINGS) that can be set in the
environment or as a Makefile knob, and we'll automatically turn the knob
when DEVELOPER=1 is set. That should give developers and CI the more
careful view without disrupting normal users or packagers.

Note that the mapping from the GIT_TEST_* form to the GIT_* form in
test-lib.sh is necessary even if they had the same name: the perl
scripts need it to be normalized to a perl truth value, and we also have
to make sure it's exported (we might have gotten it from the
environment, but we might also have gotten it from GIT-BUILD-OPTIONS
directly).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King 2020-10-21 23:24:00 -04:00 коммит произвёл Junio C Hamano
Родитель 69986e19ff
Коммит 5338ed2b26
22 изменённых файлов: 30 добавлений и 19 удалений

Просмотреть файл

@ -2767,6 +2767,9 @@ ifdef GIT_INTEROP_MAKE_OPTS
endif
ifdef GIT_TEST_INDEX_VERSION
@echo GIT_TEST_INDEX_VERSION=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_INDEX_VERSION)))'\' >>$@+
endif
ifdef GIT_TEST_PERL_FATAL_WARNINGS
@echo GIT_TEST_PERL_FATAL_WARNINGS=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_PERL_FATAL_WARNINGS)))'\' >>$@+
endif
@if cmp $@+ $@ >/dev/null 2>&1; then $(RM) $@+; else mv $@+ $@; fi

Просмотреть файл

@ -45,3 +45,5 @@ ifeq ($(filter gcc5,$(COMPILER_FEATURES)),)
DEVELOPER_CFLAGS += -Wno-uninitialized
endif
endif
GIT_TEST_PERL_FATAL_WARNINGS = YesPlease

Просмотреть файл

@ -2,7 +2,7 @@
# Copyright (C) 2006, Eric Wong <normalperson@yhbt.net>
# License: GPL v2 or later
use 5.008;
use warnings;
use warnings $ENV{GIT_PERL_FATAL_WARNINGS} ? qw(FATAL all) : ();
use strict;
use vars qw/ $AUTHOR $VERSION
$oid $oid_short $oid_length

Просмотреть файл

@ -12,7 +12,7 @@
package Error;
use strict;
use warnings;
use warnings $ENV{GIT_PERL_FATAL_WARNINGS} ? qw(FATAL all) : ();
use vars qw($VERSION);
use 5.004;

Просмотреть файл

@ -9,7 +9,7 @@ package Git;
use 5.008;
use strict;
use warnings;
use warnings $ENV{GIT_PERL_FATAL_WARNINGS} ? qw(FATAL all) : ();
use File::Temp ();
use File::Spec ();

Просмотреть файл

@ -1,7 +1,7 @@
package Git::I18N;
use 5.008;
use strict;
use warnings;
use warnings $ENV{GIT_PERL_FATAL_WARNINGS} ? qw(FATAL all) : ();
BEGIN {
require Exporter;
if ($] < 5.008003) {

Просмотреть файл

@ -1,6 +1,6 @@
package Git::IndexInfo;
use strict;
use warnings;
use warnings $ENV{GIT_PERL_FATAL_WARNINGS} ? qw(FATAL all) : ();
use Git qw/command_input_pipe command_close_pipe/;
sub new {

Просмотреть файл

@ -1,7 +1,7 @@
package Git::LoadCPAN;
use 5.008;
use strict;
use warnings;
use warnings $ENV{GIT_PERL_FATAL_WARNINGS} ? qw(FATAL all) : ();
=head1 NAME

Просмотреть файл

@ -1,7 +1,7 @@
package Git::LoadCPAN::Error;
use 5.008;
use strict;
use warnings;
use warnings $ENV{GIT_PERL_FATAL_WARNINGS} ? qw(FATAL all) : ();
use Git::LoadCPAN (
module => 'Error',
import => 1,

Просмотреть файл

@ -1,7 +1,7 @@
package Git::LoadCPAN::Mail::Address;
use 5.008;
use strict;
use warnings;
use warnings $ENV{GIT_PERL_FATAL_WARNINGS} ? qw(FATAL all) : ();
use Git::LoadCPAN (
module => 'Mail::Address',
import => 0,

Просмотреть файл

@ -1,7 +1,7 @@
package Git::Packet;
use 5.008;
use strict;
use warnings;
use warnings $ENV{GIT_PERL_FATAL_WARNINGS} ? qw(FATAL all) : ();
BEGIN {
require Exporter;
if ($] < 5.008003) {

Просмотреть файл

@ -1,6 +1,6 @@
package Git::SVN;
use strict;
use warnings;
use warnings $ENV{GIT_PERL_FATAL_WARNINGS} ? qw(FATAL all) : ();
use Fcntl qw/:DEFAULT :seek/;
use constant rev_map_fmt => 'NH*';
use vars qw/$_no_metadata

Просмотреть файл

@ -1,7 +1,7 @@
package Git::SVN::Editor;
use vars qw/@ISA $_rmdir $_cp_similarity $_find_copies_harder $_rename_limit/;
use strict;
use warnings;
use warnings $ENV{GIT_PERL_FATAL_WARNINGS} ? qw(FATAL all) : ();
use SVN::Core;
use SVN::Delta;
use Carp qw/croak/;

Просмотреть файл

@ -3,7 +3,7 @@ use vars qw/@ISA $_ignore_regex $_include_regex $_preserve_empty_dirs
$_placeholder_filename @deleted_gpath %added_placeholder
$repo_id/;
use strict;
use warnings;
use warnings $ENV{GIT_PERL_FATAL_WARNINGS} ? qw(FATAL all) : ();
use SVN::Delta;
use Carp qw/croak/;
use File::Basename qw/dirname/;

Просмотреть файл

@ -1,6 +1,6 @@
package Git::SVN::GlobSpec;
use strict;
use warnings;
use warnings $ENV{GIT_PERL_FATAL_WARNINGS} ? qw(FATAL all) : ();
sub new {
my ($class, $glob, $pattern_ok) = @_;

Просмотреть файл

@ -1,6 +1,6 @@
package Git::SVN::Log;
use strict;
use warnings;
use warnings $ENV{GIT_PERL_FATAL_WARNINGS} ? qw(FATAL all) : ();
use Git::SVN::Utils qw(fatal);
use Git qw(command
command_oneline

Просмотреть файл

@ -1,5 +1,5 @@
package Git::SVN::Memoize::YAML;
use warnings;
use warnings $ENV{GIT_PERL_FATAL_WARNINGS} ? qw(FATAL all) : ();
use strict;
use YAML::Any ();

Просмотреть файл

@ -33,7 +33,7 @@ package Git::SVN::Migration;
# possible if noMetadata or useSvmProps are set; but should
# be no problem for users that use the (sensible) defaults.
use strict;
use warnings;
use warnings $ENV{GIT_PERL_FATAL_WARNINGS} ? qw(FATAL all) : ();
use Carp qw/croak/;
use File::Path qw/mkpath/;
use File::Basename qw/dirname basename/;

Просмотреть файл

@ -1,6 +1,6 @@
package Git::SVN::Prompt;
use strict;
use warnings;
use warnings $ENV{GIT_PERL_FATAL_WARNINGS} ? qw(FATAL all) : ();
require SVN::Core;
use vars qw/$_no_auth_cache $_username/;

Просмотреть файл

@ -1,7 +1,7 @@
package Git::SVN::Ra;
use vars qw/@ISA $config_dir $_ignore_refs_regex $_log_window_size/;
use strict;
use warnings;
use warnings $ENV{GIT_PERL_FATAL_WARNINGS} ? qw(FATAL all) : ();
use Memoize;
use Git::SVN::Utils qw(
canonicalize_url

Просмотреть файл

@ -1,7 +1,7 @@
package Git::SVN::Utils;
use strict;
use warnings;
use warnings $ENV{GIT_PERL_FATAL_WARNINGS} ? qw(FATAL all) : ();
use SVN::Core;

Просмотреть файл

@ -499,6 +499,12 @@ then
export GIT_INDEX_VERSION
fi
if test -n "$GIT_TEST_PERL_FATAL_WARNINGS"
then
GIT_PERL_FATAL_WARNINGS=1
export GIT_PERL_FATAL_WARNINGS
fi
# Add libc MALLOC and MALLOC_PERTURB test
# only if we are not executing the test with valgrind
if test -n "$valgrind" ||