t/check-non-portable-shell: detect "FOO=bar shell_func"
commita0a630192dca77794b2ea94aeb2e6dff0cc1810b
authorEric Sunshine <sunshine@sunshineco.com>
Fri, 13 Jul 2018 05:52:05 +0000 (13 01:52 -0400)
committerJunio C Hamano <gitster@pobox.com>
Mon, 16 Jul 2018 21:55:01 +0000 (16 14:55 -0700)
tree8578141f292e066bc5df620947e5c05e3fe4c77c
parentc433600593b1db15a9ba80136dc2096e192322b6
t/check-non-portable-shell: detect "FOO=bar shell_func"

One-shot environment variable assignments, such as 'FOO' in
"FOO=bar cmd", exist only during the invocation of 'cmd'. However, if
'cmd' happens to be a shell function, then 'FOO' is assigned in the
executing shell itself, and that assignment remains until the process
exits (unless explicitly unset). Since this side-effect of
"FOO=bar shell_func" is unlikely to be intentional, detect and report
such usage.

To distinguish shell functions from other commands, perform a pre-scan
of shell scripts named as input, gleaning a list of function names by
recognizing lines of the form (loosely matching whitespace):

    shell_func () {

and later report suspect lines of the form (loosely matching quoted
values):

    FOO=bar [BAR=foo ...] shell_func

Also take care to stitch together incomplete lines (those ending with
"\") since suspect invocations may be split over multiple lines:

    FOO=bar BAR=foo \
    shell_func

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/check-non-portable-shell.pl