git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] run-command.c: print env vars when GIT_TRACE is set

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Jan 10, 2018, 10:48 UTC
Message-ID
<20180110104835.22905-1-pclouds@gmail.com>

Occasionally submodule code could execute new commands with GIT_DIR set to some submodule. GIT_TRACE prints just the command line which makes it hard to tell that it's not really executed on this repository.

Print env variables in this case. Note that the code deliberately ignore variables unsetting because there are so many of them (to keep git environment clean for the next process) and really hard to read.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 A minor thing that I ignored in this patch is quoting the environment
 variables. For me it's meh. Perhaps I should just dumb the env
 without quoting at all.
 run-command.c |  3 ++-
 trace.c       | 38 +++++++++++++++++++++++++++++++++++---
 trace.h       | 18 +++++++++++++++---
 3 files changed, 52 insertions(+), 7 deletions(-)
diff --git a/run-command.c b/run-command.c
index 31fc5ea86e..235367087d 100644
--- a/run-command.c
+++ b/run-command.c
@@ -624,7 +624,8 @@ int start_command(struct child_process *cmd)
 		cmd->err = fderr[0];
 	}
 
-	trace_argv_printf(cmd->argv, "trace: run_command:");
+	trace_env_argv_printf(cmd->env, cmd->argv, "trace: run_command:");
+
 	fflush(NULL);
 
 #ifndef GIT_WINDOWS_NATIVE
diff --git a/trace.c b/trace.c
index b7530b51a9..d8967b66e8 100644
--- a/trace.c
+++ b/trace.c
@@ -146,7 +146,26 @@ static void trace_vprintf_fl(const char *file, int line, struct trace_key *key,
 	print_trace_line(key, &buf);
 }
 
+static void concatenate_env(struct strbuf *dst, const char *const *env)
+{
+	int i;
+
+	/* Copy into destination buffer. */
+	strbuf_grow(dst, 255);
+	for (i = 0; env[i]; ++i) {
+		/*
+		 * the main interesting is setting new vars
+		 * e.g. GIT_DIR, ignore the unsetting to reduce noise.
+		 */
+		if (!strchr(env[i], '='))
+			continue;
+		strbuf_addch(dst, ' ');
+		sq_quote_buf(dst, env[i]);
+	}
+}
+
 static void trace_argv_vprintf_fl(const char *file, int line,
+				  const char *const *env,
 				  const char **argv, const char *format,
 				  va_list ap)
 {
@@ -157,6 +176,9 @@ static void trace_argv_vprintf_fl(const char *file, int line,
 
 	strbuf_vaddf(&buf, format, ap);
 
+	if (env)
+		concatenate_env(&buf, env);
+
 	sq_quote_argv(&buf, argv, 0);
 	print_trace_line(&trace_default_key, &buf);
 }
@@ -214,7 +236,16 @@ void trace_argv_printf(const char **argv, const char *format, ...)
 {
 	va_list ap;
 	va_start(ap, format);
-	trace_argv_vprintf_fl(NULL, 0, argv, format, ap);
+	trace_argv_vprintf_fl(NULL, 0, NULL, argv, format, ap);
+	va_end(ap);
+}
+
+void trace_env_argv_printf(const char *const *env, const char **argv,
+			   const char *format, ...)
+{
+	va_list ap;
+	va_start(ap, format);
+	trace_argv_vprintf_fl(NULL, 0, env, argv, format, ap);
 	va_end(ap);
 }
 
@@ -251,12 +282,13 @@ void trace_printf_key_fl(const char *file, int line, struct trace_key *key,
 	va_end(ap);
 }
 
-void trace_argv_printf_fl(const char *file, int line, const char **argv,
+void trace_argv_printf_fl(const char *file, int line,
+			  const char *const *env, const char **argv,
 			  const char *format, ...)
 {
 	va_list ap;
 	va_start(ap, format);
-	trace_argv_vprintf_fl(file, line, argv, format, ap);
+	trace_argv_vprintf_fl(file, line, env, argv, format, ap);
 	va_end(ap);
 }
 
diff --git a/trace.h b/trace.h
index 88055abef7..830d9dcd19 100644
--- a/trace.h
+++ b/trace.h
@@ -34,6 +34,10 @@ extern void trace_printf_key(struct trace_key *key, const char *format, ...);
 __attribute__((format (printf, 2, 3)))
 extern void trace_argv_printf(const char **argv, const char *format, ...);
 
+__attribute__((format (printf, 3, 4)))
+extern void trace_env_argv_printf(const char * const*env, const char **argv,
+				  const char *format, ...);
+
 extern void trace_strbuf(struct trace_key *key, const struct strbuf *data);
 
 /* Prints elapsed time (in nanoseconds) if GIT_TRACE_PERFORMANCE is enabled. */
@@ -93,7 +97,14 @@ extern void trace_performance_since(uint64_t start, const char *format, ...);
 	do {								    \
 		if (trace_pass_fl(&trace_default_key))			    \
 			trace_argv_printf_fl(TRACE_CONTEXT, __LINE__,	    \
-					    argv, __VA_ARGS__);		    \
+					     NULL, argv, __VA_ARGS__);	    \
+	} while (0)
+
+#define trace_env_argv_printf(env, argv, ...)				    \
+	do {								    \
+		if (trace_pass_fl(&trace_default_key))			    \
+			trace_argv_printf_fl(TRACE_CONTEXT, __LINE__, 	    \
+					     env, argv, __VA_ARGS__); 	    \
 	} while (0)
 
 #define trace_strbuf(key, data)						    \
@@ -121,8 +132,9 @@ extern void trace_performance_since(uint64_t start, const char *format, ...);
 __attribute__((format (printf, 4, 5)))
 extern void trace_printf_key_fl(const char *file, int line, struct trace_key *key,
 				const char *format, ...);
-__attribute__((format (printf, 4, 5)))
-extern void trace_argv_printf_fl(const char *file, int line, const char **argv,
+__attribute__((format (printf, 5, 6)))
+extern void trace_argv_printf_fl(const char *file, int line,
+				 const char *const *env, const char **argv,
 				 const char *format, ...);
 extern void trace_strbuf_fl(const char *file, int line, struct trace_key *key,
 			    const struct strbuf *data);
-- 
2.15.1.600.g899a5f85c6
Next: Brandon Williams
Message 1 of 74 in “run-command.c: print env vars when GIT_TRACE is set”
  1. run-command.c: print env vars when GIT_TRACE is setNguyễn Thái Ngọc Duy, Jan 10, 2018
  2. Brandon WilliamsJan 10, 2018
  3. Stefan BellerJan 10, 2018
  4. Brandon WilliamsJan 10, 2018
  5. Stefan BellerJan 10, 2018
  6. run-command.c: print env vars when GIT_TRACE is setNguyễn Thái Ngọc Duy, Jan 11, 2018
  7. Duy NguyenJan 11, 2018
  8. Brandon WilliamsJan 11, 2018
  9. Stefan BellerJan 11, 2018
  10. Junio C HamanoJan 11, 2018
  11. Duy NguyenJan 12, 2018
  12. 0/4 run-command.c: print env vars when GIT_TRACE is setNguyễn Thái Ngọc Duy, Jan 12, 2018
  13. 1/4 trace.c: introduce trace_run_command()Nguyễn Thái Ngọc Duy, Jan 12, 2018
  14. Jeff KingJan 12, 2018
  15. Jeff KingJan 12, 2018
  16. 2/4 trace.c: print program 'git' when child_process.git_cmd is setNguyễn Thái Ngọc Duy, Jan 12, 2018
  17. Jeff KingJan 12, 2018
  18. 3/4 trace.c: print env vars in trace_run_command()Nguyễn Thái Ngọc Duy, Jan 12, 2018
  19. Jeff KingJan 12, 2018
  20. 4/4 trace.c: be smart about what env to print in trace_run_command()Nguyễn Thái Ngọc Duy, Jan 12, 2018
  21. Jeff KingJan 12, 2018
  22. Junio C HamanoJan 12, 2018
  23. Jeff KingJan 12, 2018
  24. Junio C HamanoJan 12, 2018
  25. Jeff KingJan 12, 2018
  26. Brandon WilliamsJan 12, 2018
  27. Junio C HamanoJan 12, 2018
  28. Duy NguyenJan 13, 2018
  29. Duy NguyenJan 13, 2018
  30. Jeff KingJan 12, 2018
  31. 5/4 sq_quote_argv: drop maxlen parameterJeff King, Jan 12, 2018
  32. Junio C HamanoJan 12, 2018
  33. 6/4 trace: avoid unnecessary quotingJeff King, Jan 12, 2018
  34. Stefan BellerJan 12, 2018
  35. Stefan BellerJan 12, 2018
  36. Duy NguyenJan 13, 2018
  37. 0/7 Trace env variables in run_command()Nguyễn Thái Ngọc Duy, Jan 13, 2018
  38. 1/7 sq_quote_argv: drop maxlen parameterNguyễn Thái Ngọc Duy, Jan 13, 2018
  39. 2/7 trace: avoid unnecessary quotingNguyễn Thái Ngọc Duy, Jan 13, 2018
  40. 3/7 trace.c: move strbuf_release() out of print_trace_line()Nguyễn Thái Ngọc Duy, Jan 13, 2018
  41. Jeff KingJan 13, 2018
  42. 4/7 trace.c: introduce trace_run_command()Nguyễn Thái Ngọc Duy, Jan 13, 2018
  43. 5/7 trace.c: print program 'git' when child_process.git_cmd is setNguyễn Thái Ngọc Duy, Jan 13, 2018
  44. 6/7 trace.c: print env vars in trace_run_command()Nguyễn Thái Ngọc Duy, Jan 13, 2018
  45. Jeff KingJan 13, 2018
  46. Junio C HamanoJan 16, 2018
  47. Stefan BellerJan 16, 2018
  48. Junio C HamanoJan 17, 2018
  49. 7/7 trace.c: print new cwd in trace_run_command()Nguyễn Thái Ngọc Duy, Jan 13, 2018
  50. Jeff KingJan 13, 2018
  51. 0/7 Trace env variables in run_command()Nguyễn Thái Ngọc Duy, Jan 15, 2018
  52. 1/7 sq_quote_argv: drop maxlen parameterNguyễn Thái Ngọc Duy, Jan 15, 2018
  53. 2/7 trace: avoid unnecessary quotingNguyễn Thái Ngọc Duy, Jan 15, 2018
  54. 3/7 trace.c: move strbuf_release() out of print_trace_line()Nguyễn Thái Ngọc Duy, Jan 15, 2018
  55. Brandon WilliamsJan 16, 2018
  56. 4/7 trace.c: introduce trace_run_command()Nguyễn Thái Ngọc Duy, Jan 15, 2018
  57. Jeff KingJan 17, 2018
  58. Junio C HamanoJan 17, 2018
  59. 5/7 trace.c: print program 'git' when child_process.git_cmd is setNguyễn Thái Ngọc Duy, Jan 15, 2018
  60. 6/7 trace.c: print env vars in trace_run_command()Nguyễn Thái Ngọc Duy, Jan 15, 2018
  61. Brandon WilliamsJan 16, 2018
  62. 7/7 trace.c: print new cwd in trace_run_command()Nguyễn Thái Ngọc Duy, Jan 15, 2018
  63. 0/7 Trace env variables in run_command()Nguyễn Thái Ngọc Duy, Jan 18, 2018
  64. 1/7 sq_quote_argv: drop maxlen parameterNguyễn Thái Ngọc Duy, Jan 18, 2018
  65. 2/7 trace: avoid unnecessary quotingNguyễn Thái Ngọc Duy, Jan 18, 2018
  66. 3/7 trace.c: move strbuf_release() out of print_trace_line()Nguyễn Thái Ngọc Duy, Jan 18, 2018
  67. 4/7 run-command.c: introduce trace_run_command()Nguyễn Thái Ngọc Duy, Jan 18, 2018
  68. 5/7 run-command.c: print program 'git' when tracing git_cmd modeNguyễn Thái Ngọc Duy, Jan 18, 2018
  69. 6/7 run-command.c: print env vars in trace_run_command()Nguyễn Thái Ngọc Duy, Jan 18, 2018
  70. 7/7 run-command.c: print new cwd in trace_run_command()Nguyễn Thái Ngọc Duy, Jan 18, 2018
  71. Jeff KingJan 19, 2018
  72. Jeff KingJan 11, 2018
  73. Duy NguyenJan 11, 2018
  74. Johannes SixtJan 11, 2018

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.