From: Jeff Hostetler <jeffh...@microsoft.com>

Signed-off-by: Jeff Hostetler <jeffh...@microsoft.com>
---
 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

Reply via email to