[PATCH v5 3/3] run-command: show prepared command

Ian Wienand
2024-05-25T01:22:24Z

This adds a trace point in start_command so we can see the full
command invocation without having to resort to strace/code inspection.
For example:

$ GIT_TRACE=1 git test foo
git.c:755 trace: exec: git-test foo
run-command.c:657 trace: run_command: git-test foo
run-command.c:657 trace: run_command: 'echo $*' foo
run-command.c:749 trace: start_command: /bin/sh -c 'echo $* "$@"' 'echo $*' foo

Prior changes have made the documentation around the internals of the
alias command execution clearer, but I have still found this detailed
view of the aliased command being run helpful for debugging purposes.

A test case is added. This simply looks for the trace point output;
the details change depending on platform -- the important thing is
that we have a verbose log point, not so much the details of what
happens on each platform.

Signed-off-by: Ian Wienand <iwienand@redhat.com>
---
run-command.c | 3 +++
t/t0014-alias.sh | 6 ++++++
2 files changed, 9 insertions(+)

diff --git a/run-command.c b/run-command.c
index 1b821042b4..9892c4421c 100644
--- a/run-command.c
+++ b/run-command.c
@@ -746,6 +746,8 @@ int start_command(struct child_process *cmd)
goto end_of_spawn;
}

+ trace_argv_printf(&argv.v[1], "trace: start_command:");
+
if (pipe(notify_pipe))
notify_pipe[0] = notify_pipe[1] = -1;

@@ -913,6 +915,7 @@ int start_command(struct child_process *cmd)
else if (cmd->use_shell)
cmd->args.v = prepare_shell_cmd(&nargv, sargv);

+ trace_argv_printf(&cmd->args.v[1], "trace: start_command:");
cmd->pid = mingw_spawnvpe(cmd->args.v[0], cmd->args.v,
(char**) cmd->env.v,
cmd->dir, fhin, fhout, fherr);
diff --git a/t/t0014-alias.sh b/t/t0014-alias.sh
index 95568342be..db747950c7 100755
--- a/t/t0014-alias.sh
+++ b/t/t0014-alias.sh
@@ -44,4 +44,10 @@ test_expect_success 'run-command formats empty args properly' '
test_cmp expect actual
'

+test_expect_success 'tracing a shell alias with arguments shows trace of prepared command' '
+ git config alias.echo "!echo \$*" &&
+ env GIT_TRACE=1 git echo argument 2>output &&
+ test_grep "^trace: start_command:.*" output
+'
+
test_done
--
2.45.1