trace: refactor to support multiple env variables

Right now you turn all tracing off and on with GIT_TRACE. To
support new types of tracing without forcing the user to see
all of them, we will soon support turning each tracing area
on with GIT_TRACE_*.

This patch lays the groundwork by providing an interface
which does not assume GIT_TRACE. However, we still maintain
the trace_printf interface so that existing callers do not
need to be refactored.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King 2011-02-24 09:28:41 -05:00 committed by Junio C Hamano
parent c6053543f2
commit 06796607ef
2 changed files with 19 additions and 11 deletions

View File

@ -1067,7 +1067,7 @@ extern void alloc_report(void);
/* trace.c */ /* trace.c */
__attribute__((format (printf, 1, 2))) __attribute__((format (printf, 1, 2)))
extern void trace_printf(const char *format, ...); extern void trace_printf(const char *format, ...);
extern void trace_vprintf(const char *format, va_list ap); extern void trace_vprintf(const char *key, const char *format, va_list ap);
__attribute__((format (printf, 2, 3))) __attribute__((format (printf, 2, 3)))
extern void trace_argv_printf(const char **argv, const char *format, ...); extern void trace_argv_printf(const char **argv, const char *format, ...);
extern void trace_repo_setup(const char *prefix); extern void trace_repo_setup(const char *prefix);

28
trace.c
View File

@ -25,10 +25,10 @@
#include "cache.h" #include "cache.h"
#include "quote.h" #include "quote.h"
/* Get a trace file descriptor from GIT_TRACE env variable. */ /* Get a trace file descriptor from "key" env variable. */
static int get_trace_fd(int *need_close) static int get_trace_fd(const char *key, int *need_close)
{ {
char *trace = getenv("GIT_TRACE"); char *trace = getenv(key);
if (!trace || !strcmp(trace, "") || if (!trace || !strcmp(trace, "") ||
!strcmp(trace, "0") || !strcasecmp(trace, "false")) !strcmp(trace, "0") || !strcasecmp(trace, "false"))
@ -50,10 +50,10 @@ static int get_trace_fd(int *need_close)
return fd; return fd;
} }
fprintf(stderr, "What does '%s' for GIT_TRACE mean?\n", trace); fprintf(stderr, "What does '%s' for %s mean?\n", trace, key);
fprintf(stderr, "If you want to trace into a file, " fprintf(stderr, "If you want to trace into a file, "
"then please set GIT_TRACE to an absolute pathname " "then please set %s to an absolute pathname "
"(starting with /).\n"); "(starting with /).\n", key);
fprintf(stderr, "Defaulting to tracing on stderr...\n"); fprintf(stderr, "Defaulting to tracing on stderr...\n");
return STDERR_FILENO; return STDERR_FILENO;
@ -62,12 +62,12 @@ static int get_trace_fd(int *need_close)
static const char err_msg[] = "Could not trace into fd given by " static const char err_msg[] = "Could not trace into fd given by "
"GIT_TRACE environment variable"; "GIT_TRACE environment variable";
void trace_vprintf(const char *fmt, va_list ap) void trace_vprintf(const char *key, const char *fmt, va_list ap)
{ {
struct strbuf buf = STRBUF_INIT; struct strbuf buf = STRBUF_INIT;
int fd, need_close = 0; int fd, need_close = 0;
fd = get_trace_fd(&need_close); fd = get_trace_fd(key, &need_close);
if (!fd) if (!fd)
return; return;
@ -80,11 +80,19 @@ void trace_vprintf(const char *fmt, va_list ap)
close(fd); close(fd);
} }
void trace_printf_key(const char *key, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
trace_vprintf(key, fmt, ap);
va_end(ap);
}
void trace_printf(const char *fmt, ...) void trace_printf(const char *fmt, ...)
{ {
va_list ap; va_list ap;
va_start(ap, fmt); va_start(ap, fmt);
trace_vprintf(fmt, ap); trace_vprintf("GIT_TRACE", fmt, ap);
va_end(ap); va_end(ap);
} }
@ -94,7 +102,7 @@ void trace_argv_printf(const char **argv, const char *fmt, ...)
va_list ap; va_list ap;
int fd, need_close = 0; int fd, need_close = 0;
fd = get_trace_fd(&need_close); fd = get_trace_fd("GIT_TRACE", &need_close);
if (!fd) if (!fd)
return; return;