t1500: avoid setting environment variables outside of tests

Ideally, each test should be responsible for setting up state it needs rather than relying upon transient global state. Toward this end, teach test_rev_parse() to accept a "-g <dir>" option to allow callers to specify the value of the GIT_DIR environment variable explicitly. Take advantage of this new option to avoid polluting the global scope with GIT_DIR assignments. Implementation note: Typically, tests avoid polluting the global state by wrapping transient environment variable assignments within a subshell, however, this technique doesn't work here since test_config() and test_unconfig() need to know GIT_DIR, as well, but neither function can be used within a subshell. Consequently, GIT_DIR is instead cleared manually via test_when_finished(). Signed-off-by: Eric Sunshine <sunshine@sunshineco.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Eric Sunshine committed May 18, 2016 at 16:15 UTC e6273f4da51287363137a24200dd43b87c801b3d
1 file changed +15 -9
t/t1500-rev-parse.sh
+15 -9
@@ -7,6 +7,7 @@ test_description='test git rev-parse'
7 test_rev_parse () {
8 d=
9 bare=
10 + gitdir=
11 while :
12 do
13 case "$1" in
@@ -15,6 +16,7 @@ test_rev_parse () {
16 [tfu]*) bare="$2"; shift; shift ;;
17 *) error "test_rev_parse: bogus core.bare value '$2'" ;;
18 esac ;;
19 + -g) gitdir="$2"; shift; shift ;;
20 -*) error "test_rev_parse: unrecognized option '$1'" ;;
21 *) break ;;
22 esac
@@ -32,6 +34,13 @@ test_rev_parse () {
34 test $# -eq 0 && break
35 expect="$1"
36 test_expect_success "$name: $o" '
37 + if test -n "$gitdir"
38 + then
39 + test_when_finished "unset GIT_DIR" &&
40 + GIT_DIR="$gitdir" &&
41 + export GIT_DIR
42 + fi &&
43 +
44 case "$bare" in
45 t*) test_config ${d:+-C} ${d:+"$d"} core.bare true ;;
46 f*) test_config ${d:+-C} ${d:+"$d"} core.bare false ;;
@@ -64,21 +73,18 @@ test_rev_parse -b t 'core.bare = true' true false false
73
74 test_rev_parse -b u 'core.bare undefined' false false true
75
67 -GIT_DIR=../.git
68 -export GIT_DIR
76
70 -test_rev_parse -C work -b f 'GIT_DIR=../.git, core.bare = false' false false true ''
77 +test_rev_parse -C work -g ../.git -b f 'GIT_DIR=../.git, core.bare = false' false false true ''
78
72 -test_rev_parse -C work -b t 'GIT_DIR=../.git, core.bare = true' true false false ''
79 +test_rev_parse -C work -g ../.git -b t 'GIT_DIR=../.git, core.bare = true' true false false ''
80
74 -test_rev_parse -C work -b u 'GIT_DIR=../.git, core.bare undefined' false false true ''
81 +test_rev_parse -C work -g ../.git -b u 'GIT_DIR=../.git, core.bare undefined' false false true ''
82
76 -GIT_DIR=../repo.git
83
78 -test_rev_parse -C work -b f 'GIT_DIR=../repo.git, core.bare = false' false false true ''
84 +test_rev_parse -C work -g ../repo.git -b f 'GIT_DIR=../repo.git, core.bare = false' false false true ''
85
80 -test_rev_parse -C work -b t 'GIT_DIR=../repo.git, core.bare = true' true false false ''
86 +test_rev_parse -C work -g ../repo.git -b t 'GIT_DIR=../repo.git, core.bare = true' true false false ''
87
82 -test_rev_parse -C work -b u 'GIT_DIR=../repo.git, core.bare undefined' false false true ''
88 +test_rev_parse -C work -g ../repo.git -b u 'GIT_DIR=../repo.git, core.bare undefined' false false true ''
89
90 test_done