test-lib: add in-shell "env" replacement
authorJeff King <peff@peff.net>
Wed, 1 Jun 2016 07:04:26 +0000 (03:04 -0400)
committerJunio C Hamano <gitster@pobox.com>
Wed, 1 Jun 2016 15:04:08 +0000 (08:04 -0700)
The one-shot environment variable syntax:

FOO=BAR some-program

is unportable when some-program is actually a shell
function, like test_must_fail (on some shells FOO remains
set after the function returns, and on others it does not).

We sometimes get around this by using env, like:

test_must_fail env FOO=BAR some-program

But that only works because test_must_fail's arguments are
themselves a command which can be run. You can't run:

env FOO=BAR test_must_fail some-program

because env does not know about our shell functions. So
there is no equivalent for test_commit, for example, and one
must resort to:

(
FOO=BAR
export FOO
test_commit
)

which is a bit verbose. Let's add a version of "env" that
works _inside_ the shell, by creating a subshell, exporting
variables from its argument list, and running the command.

Its use is demonstrated on a currently-unportable case in
t4014.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/t4014-format-patch.sh
t/test-lib-functions.sh
index 3b99434e3e6f534efe44850fef3d1d77c04f5856..9c52efc9d4c2b02cfe81abcf6d721277d5bdfe5c 100755 (executable)
@@ -1072,7 +1072,7 @@ test_expect_success '--from omits redundant in-body header' '
 '
 
 test_expect_success 'in-body headers trigger content encoding' '
-       GIT_AUTHOR_NAME="éxötìc" test_commit exotic &&
+       test_env GIT_AUTHOR_NAME="éxötìc" test_commit exotic &&
        test_when_finished "git reset --hard HEAD^" &&
        git format-patch -1 --stdout --from >patch &&
        cat >expect <<-\EOF &&
index 3978fc0b45de2645560207cc6e884a505506215d..48884d520813998a735d89d406b45c63b0bf748d 100644 (file)
@@ -939,3 +939,25 @@ mingw_read_file_strip_cr_ () {
                eval "$1=\$$1\$line"
        done
 }
+
+# Like "env FOO=BAR some-program", but run inside a subshell, which means
+# it also works for shell functions (though those functions cannot impact
+# the environment outside of the test_env invocation).
+test_env () {
+       (
+               while test $# -gt 0
+               do
+                       case "$1" in
+                       *=*)
+                               eval "${1%%=*}=\${1#*=}"
+                               eval "export ${1%%=*}"
+                               shift
+                               ;;
+                       *)
+                               "$@"
+                               exit
+                               ;;
+                       esac
+               done
+       )
+}