]> git.ipfire.org Git - thirdparty/git.git/commitdiff
test-lib-functions: keep user's debugger config files and TERM in 'debug'
authorPhilippe Blain <levraiphilippeblain@gmail.com>
Mon, 6 Sep 2021 04:39:00 +0000 (04:39 +0000)
committerJunio C Hamano <gitster@pobox.com>
Tue, 7 Sep 2021 17:53:39 +0000 (10:53 -0700)
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>
t/README
t/test-lib-functions.sh

index cc8be6e67adc1359944e67940f7835b777aa13ec..e924bd81e2d66d3d371d7c109c5c08b3c4d0be85 100644 (file)
--- a/t/README
+++ b/t/README
@@ -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
    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
-   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
 
index 5bed34e47e0117dafae3bc0b7de3192382f55c52..eef2262a3608aaf44786f0481b1c1739ae17ea6f 100644 (file)
@@ -190,25 +190,57 @@ test_pause () {
 # Wrap git with a debugger. Adding this to a command can make it easier
 # 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:
 #     debug git checkout master
 #     debug --debugger=nemiver git $ARGS
 #     debug -d "valgrind --tool=memcheck --track-origins=yes" git $ARGS
 debug () {
-       case "$1" in
-       -d)
-               GIT_DEBUGGER="$2" &&
-               shift 2
-               ;;
-       --debugger=*)
-               GIT_DEBUGGER="${1#*=}" &&
-               shift 1
-               ;;
-       *)
-               GIT_DEBUGGER=1
-               ;;
-       esac &&
-       GIT_DEBUGGER="${GIT_DEBUGGER}" "$@" <&6 >&5 2>&7
+       GIT_DEBUGGER=1 &&
+       DEBUG_TERM=$TERM &&
+       while test $# != 0
+       do
+               case "$1" in
+               -t)
+                       DEBUG_TERM="$USER_TERM"
+                       ;;
+               -d)
+                       GIT_DEBUGGER="$2" &&
+                       shift
+                       ;;
+               --debugger=*)
+                       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>]]]