check-non-portable-shell: support Perl versions older than 5.10
commit142997d4895b2b39ade3560da774f181f0131086
authorEric Sunshine <sunshine@sunshineco.com>
Sat, 11 May 2019 00:18:53 +0000 (10 20:18 -0400)
committerJunio C Hamano <gitster@pobox.com>
Mon, 13 May 2019 02:50:20 +0000 (13 11:50 +0900)
tree7d6aad2b271a369404f71cdc0f1984b872b572da
parent6a6c0f10a70a6eb101c213b09ae82a9cad252743
check-non-portable-shell: support Perl versions older than 5.10

For thoroughness when checking for one-shot environment variable
assignments at shell function call sites, check-non-portable-shell
stitches together incomplete lines (those ending with backslash). This
allows it to correctly flag such undesirable usage even when the
variable assignment and function call are split across lines, for
example:

    FOO=bar \
    func

where 'func' is a shell function.

The stitching is accomplished like this:

    while (<>) {
        chomp;
        # stitch together incomplete lines (those ending with "\")
        while (s/\\$//) {
            $_ .= readline;
            chomp;
        }
        # detect unportable/undesirable shell constructs
        ...
    }

Although this implementation is well supported in reasonably modern Perl
versions (5.10 and later), it fails with older versions (such as Perl
5.8 shipped with ancient Mac OS 10.5). In particular, in older Perl
versions, 'readline' is not connected to the file handle associated with
the "magic" while (<>) {...} construct, so 'readline' throws a
"readline() on unopened filehandle" error. Work around this problem by
dropping readline() and instead incorporating the stitching of
incomplete lines directly into the existing while (<>) {...} loop.

Helped-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/check-non-portable-shell.pl