David Tran <unsignedz...@gmail.com> writes:

> Originally, the code used subshells instead of FOO=BAR command
> because the variable would otherwise leak into the surrounding
> context of the POSIX shell when 'command' is a shell function.
> The subshell was used to hold the context for the test. Using
> 'env' in the test function sets the temp variables without
> leaking, removing the need of a subshell.

These are not "temp variables" ;-).

You are improving the way how commands are run under a different
settings to environment variables.

Hmm, let's try to see if I can do better:

        Subject: tests: use "env" to run commands with temporary env-var 
settings

        Ordinarily, we would say "VAR=VAL command" to execute a
        tested command with environment variable(s) set only for
        that command.  This however does not work if 'command' is a
        shell function (most notably 'test_must_fail'); the result
        of the assignment is retained and affects later commands.

        To avoid this, we used to assign and export environment
        variables and run such a test in a subshell,

                (
                        VAR=VAL && export VAR &&
                        test_must_fail git command to be tested
                )

        but with "env" utility, we should be able to say

                test_must_fail env VAR=VAL git command to be tested

        which is much shorter and easier to read.

> Let's see if I replied correctly with send-email. Retrying this again.
> How do I 'reply' to a thread using send-email?

Look for --in-reply-to option in "man git-send-email".

> Signed-off-by: David Tran <unsignedz...@gmail.com>
> ---
>  t/t1300-repo-config.sh        |   17 ++--------
>  t/t1510-repo-setup.sh         |    4 +--
>  t/t3200-branch.sh             |   12 +------
>  t/t3301-notes.sh              |   22 ++++----------
>  t/t3404-rebase-interactive.sh |   65 ++++++++--------------------------------
>  t/t3413-rebase-hook.sh        |    6 +---
>  t/t4014-format-patch.sh       |   14 ++-------
>  t/t5305-include-tag.sh        |    4 +--
>  t/t5602-clone-remote-exec.sh  |   13 ++------
>  t/t5801-remote-helpers.sh     |    6 +--
>  t/t6006-rev-list-format.sh    |    9 ++----
>  t/t7006-pager.sh              |   18 ++---------
>  12 files changed, 42 insertions(+), 148 deletions(-)

Thanks.  The numbers look very good ;-)  We love code reduction.

> diff --git a/t/t1300-repo-config.sh b/t/t1300-repo-config.sh
> index c9c426c..3e3f77b 100755
> --- a/t/t1300-repo-config.sh
> +++ b/t/t1300-repo-config.sh
> @@ -974,24 +974,15 @@ test_expect_success SYMLINKS 'symlinked configuration' '
>  '
>
>  test_expect_success 'nonexistent configuration' '
> -     (
> -             GIT_CONFIG=doesnotexist &&
> -             export GIT_CONFIG &&
> -             test_must_fail git config --list &&
> -             test_must_fail git config test.xyzzy
> -     )
> +     test_must_fail env GIT_CONFIG=doesnotexist git config --list &&
> +     test_must_fail env GIT_CONFIG=doesnotexist git config test.xyzzy
>  '
>
>  test_expect_success SYMLINKS 'symlink to nonexistent configuration' '
>       ln -s doesnotexist linktonada &&
>       ln -s linktonada linktolinktonada &&
> -     (
> -             GIT_CONFIG=linktonada &&
> -             export GIT_CONFIG &&
> -             test_must_fail git config --list &&
> -             GIT_CONFIG=linktolinktonada &&
> -             test_must_fail git config --list
> -     )
> +     test_must_fail env GIT_CONFIG=linktonada git config --list &&
> +     test_must_fail env GIT_CONFIG=linktolinktonada git config --list
>  '
>
>  test_expect_success 'check split_cmdline return' "
> diff --git a/t/t1510-repo-setup.sh b/t/t1510-repo-setup.sh
> index cf2ee78..e1b2a99 100755
> --- a/t/t1510-repo-setup.sh
> +++ b/t/t1510-repo-setup.sh
> @@ -777,9 +777,7 @@ test_expect_success '#30: core.worktree and core.bare 
> conflict (gitfile version)
>       setup_repo 30 "$here/30" gitfile true &&
>       (
>               cd 30 &&
> -             GIT_DIR=.git &&
> -             export GIT_DIR &&
> -             test_must_fail git symbolic-ref HEAD 2>result
> +             test_must_fail env GIT_DIR=.git git symbolic-ref HEAD 2>result
>       ) &&
>       grep "core.bare and core.worktree" 30/result
>  '
> diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh
> index fcdb867..d45e95c 100755
> --- a/t/t3200-branch.sh
> +++ b/t/t3200-branch.sh
> @@ -849,11 +849,7 @@ test_expect_success 'detect typo in branch name when 
> using --edit-description' '
>       write_script editor <<-\EOF &&
>               echo "New contents" >"$1"
>       EOF
> -     (
> -             EDITOR=./editor &&
> -             export EDITOR &&
> -             test_must_fail git branch --edit-description no-such-branch
> -     )
> +     test_must_fail env EDITOR=./editor git branch --edit-description 
> no-such-branch
>  '
>
>  test_expect_success 'refuse --edit-description on unborn branch for now' '
> @@ -861,11 +857,7 @@ test_expect_success 'refuse --edit-description on unborn 
> branch for now' '
>               echo "New contents" >"$1"
>       EOF
>       git checkout --orphan unborn &&
> -     (
> -             EDITOR=./editor &&
> -             export EDITOR &&
> -             test_must_fail git branch --edit-description
> -     )
> +     test_must_fail env EDITOR=./editor git branch --edit-description
>  '
>
>  test_expect_success '--merged catches invalid object names' '
> diff --git a/t/t3301-notes.sh b/t/t3301-notes.sh
> index 3bb79a4..cfd67ff 100755
> --- a/t/t3301-notes.sh
> +++ b/t/t3301-notes.sh
> @@ -17,7 +17,7 @@ GIT_EDITOR=./fake_editor.sh
>  export GIT_EDITOR
>
>  test_expect_success 'cannot annotate non-existing HEAD' '
> -     (MSG=3 && export MSG && test_must_fail git notes add)
> +     test_must_fail env MSG=3 git notes add
>  '
>
>  test_expect_success setup '
> @@ -32,22 +32,16 @@ test_expect_success setup '
>  '
>
>  test_expect_success 'need valid notes ref' '
> -     (MSG=1 GIT_NOTES_REF=/ && export MSG GIT_NOTES_REF &&
> -      test_must_fail git notes add) &&
> -     (MSG=2 GIT_NOTES_REF=/ && export MSG GIT_NOTES_REF &&
> -      test_must_fail git notes show)
> +     test_must_fail env MSG=1 GIT_NOTES_REF=/ git notes show &&
> +     test_must_fail env MSG=2 GIT_NOTES_REF=/ git notes show
>  '
>
>  test_expect_success 'refusing to add notes in refs/heads/' '
> -     (MSG=1 GIT_NOTES_REF=refs/heads/bogus &&
> -      export MSG GIT_NOTES_REF &&
> -      test_must_fail git notes add)
> +     test_must_fail env MSG=1 GIT_NOTES_REF=refs/heads/bogus git notes add
>  '
>
>  test_expect_success 'refusing to edit notes in refs/remotes/' '
> -     (MSG=1 GIT_NOTES_REF=refs/remotes/bogus &&
> -      export MSG GIT_NOTES_REF &&
> -      test_must_fail git notes edit)
> +     test_must_fail env MSG=1 GIT_NOTES_REF=refs/heads/bogus git notes edit
>  '
>
>  # 1 indicates caught gracefully by die, 128 means git-show barked
> @@ -865,11 +859,7 @@ test_expect_success 'create note from non-existing note 
> with "git notes add -c"
>       git add a10 &&
>       test_tick &&
>       git commit -m 10th &&
> -     (
> -             MSG="yet another note" &&
> -             export MSG &&
> -             test_must_fail git notes add -c deadbeef
> -     ) &&
> +     test_must_fail env MSG="yet another note" git notes add -c deadbeef &&
>       test_must_fail git notes list HEAD
>  '
>
> diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh
> index 50e22b1..4c7364a 100755
> --- a/t/t3404-rebase-interactive.sh
> +++ b/t/t3404-rebase-interactive.sh
> @@ -104,9 +104,7 @@ test_expect_success 'rebase -i with the exec command 
> checks tree cleanness' '
>       git checkout master &&
>       (
>       set_fake_editor &&
> -     FAKE_LINES="exec_echo_foo_>file1 1" &&
> -     export FAKE_LINES &&
> -     test_must_fail git rebase -i HEAD^
> +     test_must_fail env FAKE_LINES="exec_echo_foo_>file1 1" git rebase -i 
> HEAD^
>       ) &&
>       test_cmp_rev master^ HEAD &&
>       git reset --hard &&
> @@ -118,9 +116,8 @@ test_expect_success 'rebase -i with exec of inexistent 
> command' '
>       test_when_finished "git rebase --abort" &&
>       (
>       set_fake_editor &&
> -     FAKE_LINES="exec_this-command-does-not-exist 1" &&
> -     export FAKE_LINES &&
> -     test_must_fail git rebase -i HEAD^ >actual 2>&1
> +     test_must_fail env FAKE_LINES="exec_this-command-does-not-exist 1" \
> +     git rebase -i HEAD^ >actual 2>&1
>       ) &&
>       ! grep "Maybe git-rebase is broken" actual
>  '
> @@ -375,11 +372,7 @@ test_expect_success 'commit message used after conflict' 
> '
>       git checkout -b conflict-fixup conflict-branch &&
>       base=$(git rev-parse HEAD~4) &&
>       set_fake_editor &&
> -     (
> -             FAKE_LINES="1 fixup 3 fixup 4" &&
> -             export FAKE_LINES &&
> -             test_must_fail git rebase -i $base
> -     ) &&
> +     test_must_fail env FAKE_LINES="1 fixup 3 fixup 4" git rebase -i $base &&
>       echo three > conflict &&
>       git add conflict &&
>       FAKE_COMMIT_AMEND="ONCE" EXPECT_HEADER_COUNT=2 \
> @@ -394,11 +387,7 @@ test_expect_success 'commit message retained after 
> conflict' '
>       git checkout -b conflict-squash conflict-branch &&
>       base=$(git rev-parse HEAD~4) &&
>       set_fake_editor &&
> -     (
> -             FAKE_LINES="1 fixup 3 squash 4" &&
> -             export FAKE_LINES &&
> -             test_must_fail git rebase -i $base
> -     ) &&
> +     test_must_fail env FAKE_LINES="1 fixup 3 squash 4" git rebase -i $base 
> &&
>       echo three > conflict &&
>       git add conflict &&
>       FAKE_COMMIT_AMEND="TWICE" EXPECT_HEADER_COUNT=2 \
> @@ -469,11 +458,7 @@ test_expect_success 'interrupted squash works as 
> expected' '
>       git checkout -b interrupted-squash conflict-branch &&
>       one=$(git rev-parse HEAD~3) &&
>       set_fake_editor &&
> -     (
> -             FAKE_LINES="1 squash 3 2" &&
> -             export FAKE_LINES &&
> -             test_must_fail git rebase -i HEAD~3
> -     ) &&
> +     test_must_fail env FAKE_LINES="1 squash 3 2" git rebase -i HEAD~3 &&
>       (echo one; echo two; echo four) > conflict &&
>       git add conflict &&
>       test_must_fail git rebase --continue &&
> @@ -487,11 +472,7 @@ test_expect_success 'interrupted squash works as 
> expected (case 2)' '
>       git checkout -b interrupted-squash2 conflict-branch &&
>       one=$(git rev-parse HEAD~3) &&
>       set_fake_editor &&
> -     (
> -             FAKE_LINES="3 squash 1 2" &&
> -             export FAKE_LINES &&
> -             test_must_fail git rebase -i HEAD~3
> -     ) &&
> +     test_must_fail env FAKE_LINES="3 squash 1 2" git rebase -i HEAD~3 &&
>       (echo one; echo four) > conflict &&
>       git add conflict &&
>       test_must_fail git rebase --continue &&
> @@ -528,11 +509,7 @@ test_expect_success 'aborted --continue does not squash 
> commits after "edit"' '
>       FAKE_LINES="edit 1" git rebase -i HEAD^ &&
>       echo "edited again" > file7 &&
>       git add file7 &&
> -     (
> -             FAKE_COMMIT_MESSAGE=" " &&
> -             export FAKE_COMMIT_MESSAGE &&
> -             test_must_fail git rebase --continue
> -     ) &&
> +     test_must_fail env FAKE_COMMIT_MESSAGE=" " git rebase --continue
>       test $old = $(git rev-parse HEAD) &&
>       git rebase --abort
>  '
> @@ -547,11 +524,7 @@ test_expect_success 'auto-amend only edited commits 
> after "edit"' '
>       echo "and again" > file7 &&
>       git add file7 &&
>       test_tick &&
> -     (
> -             FAKE_COMMIT_MESSAGE="and again" &&
> -             export FAKE_COMMIT_MESSAGE &&
> -             test_must_fail git rebase --continue
> -     ) &&
> +     test_must_fail env FAKE_COMMIT_MESSAGE="and again" git rebase 
> --continue &&
>       git rebase --abort
>  '
>
> @@ -559,11 +532,7 @@ test_expect_success 'clean error after failed "exec"' '
>       test_tick &&
>       test_when_finished "git rebase --abort || :" &&
>       set_fake_editor &&
> -     (
> -             FAKE_LINES="1 exec_false" &&
> -             export FAKE_LINES &&
> -             test_must_fail git rebase -i HEAD^
> -     ) &&
> +     test_must_fail env FAKE_LINES="1 exec_false" git rebase -i HEAD^ &&
>       echo "edited again" > file7 &&
>       git add file7 &&
>       test_must_fail git rebase --continue 2>error &&
> @@ -947,12 +916,8 @@ test_expect_success 'rebase -i --root retain root commit 
> author and message' '
>
>  test_expect_success 'rebase -i --root temporary sentinel commit' '
>       git checkout B &&
> -     (
> -             set_fake_editor &&
> -             FAKE_LINES="2" &&
> -             export FAKE_LINES &&
> -             test_must_fail git rebase -i --root
> -     ) &&
> +     set_fake_editor &&
> +     test_must_fail env FAKE_LINES="2" git rebase -i --root &&
>       git cat-file commit HEAD | grep "^tree 4b825dc642cb" &&
>       git rebase --abort
>  '
> @@ -1042,11 +1007,7 @@ test_expect_success 'rebase -i error on commits with \ 
> in message' '
>       test_when_finished "git rebase --abort; git reset --hard $current_head; 
> rm -f error" &&
>       test_commit TO-REMOVE will-conflict old-content &&
>       test_commit "\temp" will-conflict new-content dummy &&
> -     (
> -     EDITOR=true &&
> -     export EDITOR &&
> -     test_must_fail git rebase -i HEAD^ --onto HEAD^^ 2>error
> -     ) &&
> +     test_must_fail env EDITOR=true git rebase -i HEAD^ --onto HEAD^^ 
> 2>error &&
>       test_expect_code 1 grep  "      emp" error
>  '
>
> diff --git a/t/t3413-rebase-hook.sh b/t/t3413-rebase-hook.sh
> index 098b755..b6833e9 100755
> --- a/t/t3413-rebase-hook.sh
> +++ b/t/t3413-rebase-hook.sh
> @@ -118,11 +118,7 @@ test_expect_success 'pre-rebase hook stops rebase (1)' '
>  test_expect_success 'pre-rebase hook stops rebase (2)' '
>       git checkout test &&
>       git reset --hard side &&
> -     (
> -             EDITOR=:
> -             export EDITOR
> -             test_must_fail git rebase -i master
> -     ) &&
> +     test_must_fail env EDITOR=: git rebase -i master &&
>       test "z$(git symbolic-ref HEAD)" = zrefs/heads/test &&
>       test 0 = $(git rev-list HEAD...side | wc -l)
>  '
> diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh
> index 73194b2..9c80633 100755
> --- a/t/t4014-format-patch.sh
> +++ b/t/t4014-format-patch.sh
> @@ -764,22 +764,14 @@ test_expect_success 'format-patch --signature="" 
> suppresses signatures' '
>
>  test_expect_success TTY 'format-patch --stdout paginates' '
>       rm -f pager_used &&
> -     (
> -             GIT_PAGER="wc >pager_used" &&
> -             export GIT_PAGER &&
> -             test_terminal git format-patch --stdout --all
> -     ) &&
> +     test_terminal env GIT_PAGER="wc >pager_used" git format-patch --stdout 
> --all &&
>       test_path_is_file pager_used
>  '
>
>   test_expect_success TTY 'format-patch --stdout pagination can be disabled' '
>       rm -f pager_used &&
> -     (
> -             GIT_PAGER="wc >pager_used" &&
> -             export GIT_PAGER &&
> -             test_terminal git --no-pager format-patch --stdout --all &&
> -             test_terminal git -c "pager.format-patch=false" format-patch 
> --stdout --all
> -     ) &&
> +     test_terminal env GIT_PAGER="wc >pager_used" git --no-pager 
> format-patch --stdout --all &&
> +     test_terminal env GIT_PAGER="wc >pager_used" git -c 
> "pager.format-patch=false" format-patch --stdout --all &&
>       test_path_is_missing pager_used &&
>       test_path_is_missing .git/pager_used
>  '
> diff --git a/t/t5305-include-tag.sh b/t/t5305-include-tag.sh
> index b061864..21517c7 100755
> --- a/t/t5305-include-tag.sh
> +++ b/t/t5305-include-tag.sh
> @@ -45,9 +45,7 @@ test_expect_success 'unpack objects' '
>  test_expect_success 'check unpacked result (have commit, no tag)' '
>       git rev-list --objects $commit >list.expect &&
>       (
> -             GIT_DIR=clone.git &&
> -             export GIT_DIR &&
> -             test_must_fail git cat-file -e $tag &&
> +             test_must_fail env GIT_DIR=clone.git git cat-file -e $tag &&
>               git rev-list --objects $commit
>       ) >list.actual &&
>       test_cmp list.expect list.actual
> diff --git a/t/t5602-clone-remote-exec.sh b/t/t5602-clone-remote-exec.sh
> index 3f353d9..cbcceab 100755
> --- a/t/t5602-clone-remote-exec.sh
> +++ b/t/t5602-clone-remote-exec.sh
> @@ -12,21 +12,14 @@ test_expect_success setup '
>  '
>
>  test_expect_success 'clone calls git upload-pack unqualified with no -u 
> option' '
> -     (
> -             GIT_SSH=./not_ssh &&
> -             export GIT_SSH &&
> -             test_must_fail git clone localhost:/path/to/repo junk
> -     ) &&
> +     test_must_fail env GIT_SSH=./not_ssh git clone localhost:/path/to/repo 
> junk &&
>       echo "localhost git-upload-pack '\''/path/to/repo'\''" >expected &&
>       test_cmp expected not_ssh_output
>  '
>
>  test_expect_success 'clone calls specified git upload-pack with -u option' '
> -     (
> -             GIT_SSH=./not_ssh &&
> -             export GIT_SSH &&
> -             test_must_fail git clone -u ./something/bin/git-upload-pack 
> localhost:/path/to/repo junk
> -     ) &&
> +     test_must_fail env GIT_SSH=./not_ssh \
> +             git clone -u ./something/bin/git-upload-pack 
> localhost:/path/to/repo junk &&
>       echo "localhost ./something/bin/git-upload-pack '\''/path/to/repo'\''" 
> >expected &&
>       test_cmp expected not_ssh_output
>  '
> diff --git a/t/t5801-remote-helpers.sh b/t/t5801-remote-helpers.sh
> index 613f69a..ca19838 100755
> --- a/t/t5801-remote-helpers.sh
> +++ b/t/t5801-remote-helpers.sh
> @@ -218,10 +218,8 @@ test_expect_success 'proper failure checks for fetching' 
> '
>  '
>
>  test_expect_success 'proper failure checks for pushing' '
> -     (GIT_REMOTE_TESTGIT_FAILURE=1 &&
> -     export GIT_REMOTE_TESTGIT_FAILURE &&
> -     cd local &&
> -     test_must_fail git push --all
> +     (cd local &&
> +     test_must_fail env GIT_REMOTE_TESTGIT_FAILURE=1 git push --all
>       )
>  '
>
> diff --git a/t/t6006-rev-list-format.sh b/t/t6006-rev-list-format.sh
> index 9874403..9d9d9de 100755
> --- a/t/t6006-rev-list-format.sh
> +++ b/t/t6006-rev-list-format.sh
> @@ -190,12 +190,9 @@ test_expect_success '%C(auto) respects --no-color' '
>  '
>
>  test_expect_success TTY '%C(auto) respects --color=auto (stdout is tty)' '
> -     (
> -             TERM=vt100 && export TERM &&
> -             test_terminal \
> -                     git log --format=$AUTO_COLOR -1 --color=auto >actual &&
> -             has_color actual
> -     )
> +     test_terminal env TERM=vt100 \
> +             git log --format=$AUTO_COLOR -1 --color=auto >actual &&
> +     has_color actual
>  '
>
>  test_expect_success '%C(auto) respects --color=auto (stdout not tty)' '
> diff --git a/t/t7006-pager.sh b/t/t7006-pager.sh
> index b9365b4..da958a8 100755
> --- a/t/t7006-pager.sh
> +++ b/t/t7006-pager.sh
> @@ -146,11 +146,7 @@ test_expect_success 'no color when stdout is a regular 
> file' '
>  test_expect_success TTY 'color when writing to a pager' '
>       rm -f paginated.out &&
>       test_config color.ui auto &&
> -     (
> -             TERM=vt100 &&
> -             export TERM &&
> -             test_terminal git log
> -     ) &&
> +     test_terminal env TERM=vt100 git log &&
>       colorful paginated.out
>  '
>
> @@ -158,11 +154,7 @@ test_expect_success TTY 'colors are suppressed by 
> color.pager' '
>       rm -f paginated.out &&
>       test_config color.ui auto &&
>       test_config color.pager false &&
> -     (
> -             TERM=vt100 &&
> -             export TERM &&
> -             test_terminal git log
> -     ) &&
> +     test_terminal env TERM=vt100 git log &&
>       ! colorful paginated.out
>  '
>
> @@ -181,11 +173,7 @@ test_expect_success 'color when writing to a file 
> intended for a pager' '
>  test_expect_success TTY 'colors are sent to pager for external commands' '
>       test_config alias.externallog "!git log" &&
>       test_config color.ui auto &&
> -     (
> -             TERM=vt100 &&
> -             export TERM &&
> -             test_terminal git -p externallog
> -     ) &&
> +     test_terminal env TERM=vt100 git -p externallog &&
>       colorful paginated.out
>  '
>
> --
> 1.7.9
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to