GIT_TRACE: show which built-in/external commands are executed
authorMatthias Lederhofer <matled@gmx.net>
Sun, 25 Jun 2006 13:56:18 +0000 (15:56 +0200)
committerJunio C Hamano <junkio@cox.net>
Sun, 9 Jul 2006 07:57:23 +0000 (00:57 -0700)
With the environment variable GIT_TRACE set git will show
 - alias expansion
 - built-in command execution
 - external command execution
on stderr.

Signed-off-by: Matthias Lederhofer <matled@gmx.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
Documentation/git.txt
exec_cmd.c
git.c
quote.c
quote.h

index 51f20c6e67acb8c7eb526fac544992eaec321623..4b140b8216797941974ba3da8f22c8b021005150 100644 (file)
@@ -615,6 +615,13 @@ git Diffs
        gitlink:git-diff-files[1];
        gitlink:git-diff-tree[1]
 
+other
+~~~~~
+'GIT_TRACE'::
+       If this variable is set git will print `trace:` messages on
+       stderr telling about alias expansion, built-in command
+       execution and external command execution.
+
 Discussion[[Discussion]]
 ------------------------
 include::README[]
index c1539d12ce9e350811b5b110206f5577a151e8ef..f2133ec93facc7072c69ebe15d2c911842ff60c8 100644 (file)
@@ -1,5 +1,6 @@
 #include "cache.h"
 #include "exec_cmd.h"
+#include "quote.h"
 #define MAX_ARGS       32
 
 extern char **environ;
@@ -96,9 +97,27 @@ int execv_git_cmd(const char **argv)
                tmp = argv[0];
                argv[0] = git_command;
 
+               if (getenv("GIT_TRACE")) {
+                       fputs("trace: exec:", stderr);
+                       const char **p = argv;
+                       while (*p) {
+                               fputc(' ', stderr);
+                               sq_quote_print(stderr, *p);
+                               ++p;
+                       }
+                       putc('\n', stderr);
+                       fflush(stderr);
+               }
+
                /* execve() can only ever return if it fails */
                execve(git_command, (char **)argv, environ);
 
+               if (getenv("GIT_TRACE")) {
+                       fprintf(stderr, "trace: exec failed: %s\n",
+                               strerror(errno));
+                       fflush(stderr);
+               }
+
                argv[0] = tmp;
        }
        return -1;
diff --git a/git.c b/git.c
index 256730112e56e19e5df70f2bef4e3efdb1a5e362..27989da77c74a2b55f0f836ba722d4369f975e06 100644 (file)
--- a/git.c
+++ b/git.c
@@ -11,6 +11,7 @@
 #include "git-compat-util.h"
 #include "exec_cmd.h"
 #include "cache.h"
+#include "quote.h"
 
 #include "builtin.h"
 
@@ -120,6 +121,18 @@ static int handle_alias(int *argcp, const char ***argv)
                        if (!strcmp(alias_command, new_argv[0]))
                                die("recursive alias: %s", alias_command);
 
+                       if (getenv("GIT_TRACE")) {
+                               int i;
+                               fprintf(stderr, "trace: alias expansion: %s =>",
+                                       alias_command);
+                               for (i = 0; i < count; ++i) {
+                                       fputc(' ', stderr);
+                                       sq_quote_print(stderr, new_argv[i]);
+                               }
+                               fputc('\n', stderr);
+                               fflush(stderr);
+                       }
+
                        /* insert after command name */
                        if (*argcp > 1) {
                                new_argv = realloc(new_argv, sizeof(char*) *
@@ -202,6 +215,18 @@ static void handle_internal_command(int argc, const char **argv, char **envp)
                struct cmd_struct *p = commands+i;
                if (strcmp(p->cmd, cmd))
                        continue;
+
+               if (getenv("GIT_TRACE")) {
+                       int i;
+                       fprintf(stderr, "trace: built-in: git");
+                       for (i = 0; i < argc; ++i) {
+                               fputc(' ', stderr);
+                               sq_quote_print(stderr, argv[i]);
+                       }
+                       putc('\n', stderr);
+                       fflush(stderr);
+               }
+
                exit(p->fn(argc, argv, envp));
        }
 }
diff --git a/quote.c b/quote.c
index 1910d000a5d288734aaea24da617481223ff9f56..e220dcc280d9ed6be2e2357e2660c7e828f3631b 100644 (file)
--- a/quote.c
+++ b/quote.c
@@ -45,6 +45,23 @@ size_t sq_quote_buf(char *dst, size_t n, const char *src)
        return len;
 }
 
+void sq_quote_print(FILE *stream, const char *src)
+{
+       char c;
+
+       fputc('\'', stream);
+       while ((c = *src++)) {
+               if (need_bs_quote(c)) {
+                       fputs("'\\", stream);
+                       fputc(c, stream);
+                       fputc('\'', stream);
+               } else {
+                       fputc(c, stream);
+               }
+       }
+       fputc('\'', stream);
+}
+
 char *sq_quote(const char *src)
 {
        char *buf;
diff --git a/quote.h b/quote.h
index c1ab3788e6d69318638142ebeffc690318a0489a..fc5481e78a6baad9ad72014318a9d0bfdd495b6b 100644 (file)
--- a/quote.h
+++ b/quote.h
@@ -29,6 +29,7 @@
  */
 
 extern char *sq_quote(const char *src);
+extern void sq_quote_print(FILE *stream, const char *src);
 extern size_t sq_quote_buf(char *dst, size_t n, const char *src);
 
 /* This unwraps what sq_quote() produces in place, but returns