Revision d88785e424aaf18aa3ca291c2299c599c000c6cb authored by Jeff King on 11 May 2016, 13:44:04 UTC, committed by Junio C Hamano on 11 May 2016, 21:03:14 UTC
Passing "-x" to a test script enables the shell's "set -x"
tracing, which can help with tracking down the command that
is causing a failure. Unfortunately, it can also _cause_
failures in some tests that redirect the stderr of a shell
function.  Inside the function the shell continues to
respect "set -x", and the trace output is collected along
with whatever stderr is generated normally by the function.

You can see an example of this by running:

  ./t0040-parse-options.sh -x -i

which will fail immediately in the first test, as it
expects:

  test_must_fail some-cmd 2>output.err

to leave output.err empty (but with "-x" it has our trace
output).

Unfortunately there isn't a portable or scalable solution to
this. We could teach test_must_fail to disable "set -x", but
that doesn't help any of the other functions or subshells.

However, we can work around it by pointing the "set -x"
output to our descriptor 4, which always points to the
original stderr of the test script. Unfortunately this only
works for bash, but it's better than nothing (and other
shells will just ignore the BASH_XTRACEFD variable).

The patch itself is a simple one-liner, but note the caveats
in the accompanying comments.

Automatic tests for our "-x" option may be a bit too meta
(and a pain, because they are bash-specific), but I did
confirm that it works correctly both with regular "-x" and
with "--verbose-only=1". This works because the latter flips
"set -x" off and on for particular tests (if it didn't, we
would get tracing for all tests, as going to descriptor 4
effectively circumvents the verbose flag).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent 7654286
Raw File
command-list.txt
# List of known git commands.
# command name				category [deprecated] [common]
git-add                                 mainporcelain common
git-am                                  mainporcelain
git-annotate                            ancillaryinterrogators
git-apply                               plumbingmanipulators
git-archimport                          foreignscminterface
git-archive                             mainporcelain
git-bisect                              mainporcelain common
git-blame                               ancillaryinterrogators
git-branch                              mainporcelain common
git-bundle                              mainporcelain
git-cat-file                            plumbinginterrogators
git-check-attr                          purehelpers
git-check-ignore                        purehelpers
git-check-mailmap                       purehelpers
git-checkout                            mainporcelain common
git-checkout-index                      plumbingmanipulators
git-check-ref-format                    purehelpers
git-cherry                              ancillaryinterrogators
git-cherry-pick                         mainporcelain
git-citool                              mainporcelain
git-clean                               mainporcelain
git-clone                               mainporcelain common
git-column                              purehelpers
git-commit                              mainporcelain common
git-commit-tree                         plumbingmanipulators
git-config                              ancillarymanipulators
git-count-objects                       ancillaryinterrogators
git-credential                          purehelpers
git-credential-cache                    purehelpers
git-credential-store                    purehelpers
git-cvsexportcommit                     foreignscminterface
git-cvsimport                           foreignscminterface
git-cvsserver                           foreignscminterface
git-daemon                              synchingrepositories
git-describe                            mainporcelain
git-diff                                mainporcelain common
git-diff-files                          plumbinginterrogators
git-diff-index                          plumbinginterrogators
git-diff-tree                           plumbinginterrogators
git-difftool                            ancillaryinterrogators
git-fast-export				ancillarymanipulators
git-fast-import				ancillarymanipulators
git-fetch                               mainporcelain common
git-fetch-pack                          synchingrepositories
git-filter-branch                       ancillarymanipulators
git-fmt-merge-msg                       purehelpers
git-for-each-ref                        plumbinginterrogators
git-format-patch                        mainporcelain
git-fsck	                        ancillaryinterrogators
git-gc                                  mainporcelain
git-get-tar-commit-id                   ancillaryinterrogators
git-grep                                mainporcelain common
git-gui                                 mainporcelain
git-hash-object                         plumbingmanipulators
git-help				ancillaryinterrogators
git-http-backend                        synchingrepositories
git-http-fetch                          synchelpers
git-http-push                           synchelpers
git-imap-send                           foreignscminterface
git-index-pack                          plumbingmanipulators
git-init                                mainporcelain common
git-instaweb                            ancillaryinterrogators
git-interpret-trailers                  purehelpers
gitk                                    mainporcelain
git-log                                 mainporcelain common
git-ls-files                            plumbinginterrogators
git-ls-remote                           plumbinginterrogators
git-ls-tree                             plumbinginterrogators
git-mailinfo                            purehelpers
git-mailsplit                           purehelpers
git-merge                               mainporcelain common
git-merge-base                          plumbinginterrogators
git-merge-file                          plumbingmanipulators
git-merge-index                         plumbingmanipulators
git-merge-one-file                      purehelpers
git-mergetool                           ancillarymanipulators
git-merge-tree                          ancillaryinterrogators
git-mktag                               plumbingmanipulators
git-mktree                              plumbingmanipulators
git-mv                                  mainporcelain common
git-name-rev                            plumbinginterrogators
git-notes                               mainporcelain
git-p4                                  foreignscminterface
git-pack-objects                        plumbingmanipulators
git-pack-redundant                      plumbinginterrogators
git-pack-refs                           ancillarymanipulators
git-parse-remote                        synchelpers
git-patch-id                            purehelpers
git-prune                               ancillarymanipulators
git-prune-packed                        plumbingmanipulators
git-pull                                mainporcelain common
git-push                                mainporcelain common
git-quiltimport                         foreignscminterface
git-read-tree                           plumbingmanipulators
git-rebase                              mainporcelain common
git-receive-pack                        synchelpers
git-reflog                              ancillarymanipulators
git-relink                              ancillarymanipulators
git-remote                              ancillarymanipulators
git-repack                              ancillarymanipulators
git-replace                             ancillarymanipulators
git-request-pull                        foreignscminterface
git-rerere                              ancillaryinterrogators
git-reset                               mainporcelain common
git-revert                              mainporcelain
git-rev-list                            plumbinginterrogators
git-rev-parse                           ancillaryinterrogators
git-rm                                  mainporcelain common
git-send-email                          foreignscminterface
git-send-pack                           synchingrepositories
git-shell                               synchelpers
git-shortlog                            mainporcelain
git-show                                mainporcelain common
git-show-branch                         ancillaryinterrogators
git-show-index                          plumbinginterrogators
git-show-ref                            plumbinginterrogators
git-sh-i18n                             purehelpers
git-sh-setup                            purehelpers
git-stash                               mainporcelain
git-status                              mainporcelain common
git-stripspace                          purehelpers
git-submodule                           mainporcelain
git-svn                                 foreignscminterface
git-symbolic-ref                        plumbingmanipulators
git-tag                                 mainporcelain common
git-unpack-file                         plumbinginterrogators
git-unpack-objects                      plumbingmanipulators
git-update-index                        plumbingmanipulators
git-update-ref                          plumbingmanipulators
git-update-server-info                  synchingrepositories
git-upload-archive                      synchelpers
git-upload-pack                         synchelpers
git-var                                 plumbinginterrogators
git-verify-commit                       ancillaryinterrogators
git-verify-pack                         plumbinginterrogators
git-verify-tag                          ancillaryinterrogators
gitweb                                  ancillaryinterrogators
git-whatchanged                         ancillaryinterrogators
git-write-tree                          plumbingmanipulators
back to top