test-lib: add in-shell "env" replacement
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>
This commit is contained in:
parent
4b0891ffe4
commit
d2554c7207
@ -1072,7 +1072,7 @@ test_expect_success '--from omits redundant in-body header' '
|
|||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'in-body headers trigger content encoding' '
|
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^" &&
|
test_when_finished "git reset --hard HEAD^" &&
|
||||||
git format-patch -1 --stdout --from >patch &&
|
git format-patch -1 --stdout --from >patch &&
|
||||||
cat >expect <<-\EOF &&
|
cat >expect <<-\EOF &&
|
||||||
|
@ -939,3 +939,25 @@ mingw_read_file_strip_cr_ () {
|
|||||||
eval "$1=\$$1\$line"
|
eval "$1=\$$1\$line"
|
||||||
done
|
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
|
||||||
|
)
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user