test-lib-functions: keep user's debugger config files and TERM in 'debug'

The 'debug' function in test-lib-functions.sh is used to invoke a
debugger at a specific line in a test. It inherits the value of HOME and
TERM set by 'test-lib.sh': HOME="$TRASH_DIRECTORY" and TERM=dumb.

Changing the value of HOME means that any customization configured in a
developers' debugger configuration file (like $HOME/.gdbinit or
$HOME/.lldbinit) are not available in the debugger invoked by
'test_pause'.

Changing the value of TERM to 'dumb' means that colored output
is disabled in the debugger.

To make the debugging experience with 'debug' more pleasant, leverage
the variable USER_HOME, added in the previous commit, to copy a
developer's ~/.gdbinit and ~/.lldbinit to the test HOME. We do not set
HOME to USER_HOME as in 'test_pause' to avoid user configuration in
$USER_HOME/.gitconfig from interfering with the command being debugged.

Also, add a flag to launch the debugger with the original value of
TERM, and add the same warning as for 'test_pause'.

Helped-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Acked-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Philippe Blain
2021-09-06 04:39:00 +00:00
committed by Junio C Hamano
parent add5240fa5
commit 01c381037c
2 changed files with 50 additions and 16 deletions

View File

@ -800,10 +800,12 @@ see test-lib-functions.sh for the full list and their options.
argument. This is primarily meant for use during the argument. This is primarily meant for use during the
development of a new test script. development of a new test script.
- debug <git-command> - debug [options] <git-command>
Run a git command inside a debugger. This is primarily meant for Run a git command inside a debugger. This is primarily meant for
use when debugging a failing test script. use when debugging a failing test script. With '-t', use your
original TERM instead of test-lib.sh's "dumb", so that your
debugger interface has colors.
- test_done - test_done

View File

@ -190,25 +190,57 @@ test_pause () {
# Wrap git with a debugger. Adding this to a command can make it easier # Wrap git with a debugger. Adding this to a command can make it easier
# to understand what is going on in a failing test. # to understand what is going on in a failing test.
# #
# Usage: debug [options] <git command>
# -d <debugger>
# --debugger=<debugger>
# Use <debugger> instead of GDB
# -t
# Use your original TERM instead of test-lib.sh's "dumb".
# This usually restores color output in the debugger.
# WARNING: the command being debugged might behave differently than when
# running the test.
#
# Examples: # Examples:
# debug git checkout master # debug git checkout master
# debug --debugger=nemiver git $ARGS # debug --debugger=nemiver git $ARGS
# debug -d "valgrind --tool=memcheck --track-origins=yes" git $ARGS # debug -d "valgrind --tool=memcheck --track-origins=yes" git $ARGS
debug () { debug () {
case "$1" in GIT_DEBUGGER=1 &&
-d) DEBUG_TERM=$TERM &&
GIT_DEBUGGER="$2" && while test $# != 0
shift 2 do
;; case "$1" in
--debugger=*) -t)
GIT_DEBUGGER="${1#*=}" && DEBUG_TERM="$USER_TERM"
shift 1 ;;
;; -d)
*) GIT_DEBUGGER="$2" &&
GIT_DEBUGGER=1 shift
;; ;;
esac && --debugger=*)
GIT_DEBUGGER="${GIT_DEBUGGER}" "$@" <&6 >&5 2>&7 GIT_DEBUGGER="${1#*=}"
;;
*)
break
;;
esac
shift
done &&
dotfiles=".gdbinit .lldbinit"
for dotfile in $dotfiles
do
dotfile="$USER_HOME/$dotfile" &&
test -f "$dotfile" && cp "$dotfile" "$HOME" || :
done &&
TERM="$DEBUG_TERM" GIT_DEBUGGER="${GIT_DEBUGGER}" "$@" <&6 >&5 2>&7 &&
for dotfile in $dotfiles
do
rm -f "$HOME/$dotfile"
done
} }
# Usage: test_commit [options] <message> [<file> [<contents> [<tag>]]] # Usage: test_commit [options] <message> [<file> [<contents> [<tag>]]]