From: Jeff Hostetler <jeffhost@xxxxxxxxxxxxx> Signed-off-by: Jeff Hostetler <jeffhost@xxxxxxxxxxxxx> --- compat/mingw.h | 3 +-- git-compat-util.h | 7 +++++++ git.c | 9 ++++++++- repository.c | 2 ++ run-command.c | 8 +++++++- run-command.h | 5 +++++ usage.c | 5 +++++ 7 files changed, 35 insertions(+), 4 deletions(-) diff --git a/compat/mingw.h b/compat/mingw.h index 571019d0bd..606402faeb 100644 --- a/compat/mingw.h +++ b/compat/mingw.h @@ -144,8 +144,7 @@ static inline int fcntl(int fd, int cmd, ...) errno = EINVAL; return -1; } -/* bash cannot reliably detect negative return codes as failure */ -#define exit(code) exit((code) & 0xff) + #define sigemptyset(x) (void)0 static inline int sigaddset(sigset_t *set, int signum) { return 0; } diff --git a/git-compat-util.h b/git-compat-util.h index 5f2e90932f..c0901d9ec6 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -1219,6 +1219,13 @@ static inline int is_missing_file_error(int errno_) extern int cmd_main(int, const char **); +/* + * Intercept all calls to exit() and route them to trace2 to + * optionally emit a message before calling the real exit(). + */ +int trace2_exit_fl(const char *file, int line, int code); +#define exit(code) exit(trace2_exit_fl(__FILE__, __LINE__, (code))) + /* * You can mark a stack variable with UNLEAK(var) to avoid it being * reported as a leak by tools like LSAN or valgrind. The argument diff --git a/git.c b/git.c index c27c38738b..cc56279a8c 100644 --- a/git.c +++ b/git.c @@ -331,6 +331,8 @@ static int handle_alias(int *argcp, const char ***argv) argv_array_push(&child.args, alias_string + 1); argv_array_pushv(&child.args, (*argv) + 1); + trace2_alias(alias_command, child.args.argv); + ret = run_command(&child); if (ret >= 0) /* normal exit */ exit(ret); @@ -365,6 +367,8 @@ static int handle_alias(int *argcp, const char ***argv) /* insert after command name */ memcpy(new_argv + count, *argv + 1, sizeof(char *) * *argcp); + trace2_alias(alias_command, new_argv); + *argv = new_argv; *argcp += count - 1; @@ -413,6 +417,7 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv) setup_work_tree(); trace_argv_printf(argv, "trace: built-in: git"); + trace2_command(p->cmd); validate_cache_entries(&the_index); status = p->fn(argc, argv, prefix); @@ -719,6 +724,8 @@ int cmd_main(int argc, const char **argv) cmd = slash + 1; } + trace2_start(argv); + trace_command_performance(argv); /* @@ -782,5 +789,5 @@ int cmd_main(int argc, const char **argv) fprintf(stderr, _("failed to run command '%s': %s\n"), cmd, strerror(errno)); - return 1; + return trace2_exit(1); } diff --git a/repository.c b/repository.c index 5dd1486718..c169f61ccd 100644 --- a/repository.c +++ b/repository.c @@ -113,6 +113,8 @@ out: void repo_set_worktree(struct repository *repo, const char *path) { repo->worktree = real_pathdup(path, 1); + + trace2_worktree(repo->worktree); } static int read_and_verify_repository_format(struct repository_format *format, diff --git a/run-command.c b/run-command.c index 84b883c213..e833d9a277 100644 --- a/run-command.c +++ b/run-command.c @@ -706,6 +706,7 @@ fail_pipe: cmd->err = fderr[0]; } + trace2_child_start(cmd); trace_run_command(cmd); fflush(NULL); @@ -911,6 +912,8 @@ fail_pipe: #endif if (cmd->pid < 0) { + trace2_child_exit(cmd, -1); + if (need_in) close_pair(fdin); else if (cmd->in) @@ -949,13 +952,16 @@ fail_pipe: int finish_command(struct child_process *cmd) { int ret = wait_or_whine(cmd->pid, cmd->argv[0], 0); + trace2_child_exit(cmd, ret); child_process_clear(cmd); return ret; } int finish_command_in_signal(struct child_process *cmd) { - return wait_or_whine(cmd->pid, cmd->argv[0], 1); + int ret = wait_or_whine(cmd->pid, cmd->argv[0], 1); + trace2_child_exit(cmd, ret); + return ret; } diff --git a/run-command.h b/run-command.h index 3932420ec8..a91206b08c 100644 --- a/run-command.h +++ b/run-command.h @@ -12,6 +12,11 @@ struct child_process { struct argv_array args; struct argv_array env_array; pid_t pid; + + int trace2_child_id; + uint64_t trace2_child_us_start; + const char *trace2_child_class; + /* * Using .in, .out, .err: * - Specify 0 for no redirections (child inherits stdin, stdout, diff --git a/usage.c b/usage.c index cc803336bd..1838c46d20 100644 --- a/usage.c +++ b/usage.c @@ -28,12 +28,17 @@ static NORETURN void usage_builtin(const char *err, va_list params) static NORETURN void die_builtin(const char *err, va_list params) { vreportf("fatal: ", err, params); + + trace2_error_va(err, params); + exit(128); } static void error_builtin(const char *err, va_list params) { vreportf("error: ", err, params); + + trace2_error_va(err, params); } static void warn_builtin(const char *warn, va_list params) -- gitgitgadget