trace API
=========

The trace API can be used to print debug messages to stderr or a file. Trace
code is inactive unless explicitly enabled by setting `GIT_TRACE*` environment
variables.

The trace implementation automatically adds `timestamp file:line ... \n` to
all trace messages. E.g.:

------------
23:59:59.123456 git.c:312               trace: built-in: git 'foo'
00:00:00.000001 builtin/foo.c:99        foo: some message
------------

Data Structures
---------------

`struct trace_key`::

	Defines a trace key (or category). The default (for API functions that
	don't take a key) is `GIT_TRACE`.
+
E.g. to define a trace key controlled by environment variable `GIT_TRACE_FOO`:
+
------------
static struct trace_key trace_foo = TRACE_KEY_INIT(FOO);

static void trace_print_foo(const char *message)
{
	trace_printf_key(&trace_foo, "%s", message);
}
------------
+
Note: don't use `const` as the trace implementation stores internal state in
the `trace_key` structure.

Functions
---------

`int trace_want(struct trace_key *key)`::

	Checks whether the trace key is enabled. Used to prevent expensive
	string formatting before calling one of the printing APIs.

`void trace_disable(struct trace_key *key)`::

	Disables tracing for the specified key, even if the environment
	variable was set.

`void trace_printf(const char *format, ...)`::
`void trace_printf_key(struct trace_key *key, const char *format, ...)`::

	Prints a formatted message, similar to printf.

`void trace_argv_printf(const char **argv, const char *format, ...)``::

	Prints a formatted message, followed by a quoted list of arguments.

`void trace_strbuf(struct trace_key *key, const struct strbuf *data)`::

	Prints the strbuf, without additional formatting (i.e. doesn't
	choke on `%` or even `\0`).

`uint64_t getnanotime(void)`::

	Returns nanoseconds since the epoch (01/01/1970), typically used
	for performance measurements.
+
Currently there are high precision timer implementations for Linux (using
`clock_gettime(CLOCK_MONOTONIC)`) and Windows (`QueryPerformanceCounter`).
Other platforms use `gettimeofday` as time source.

`void trace_performance(uint64_t nanos, const char *format, ...)`::
`void trace_performance_since(uint64_t start, const char *format, ...)`::

	Prints the elapsed time (in nanoseconds), or elapsed time since
	`start`, followed by a formatted message. Enabled via environment
	variable `GIT_TRACE_PERFORMANCE`. Used for manual profiling, e.g.:
+
------------
uint64_t start = getnanotime();
/* code section to measure */
trace_performance_since(start, "foobar");
------------
+
------------
uint64_t t = 0;
for (;;) {
	/* ignore */
	t -= getnanotime();
	/* code section to measure */
	t += getnanotime();
	/* ignore */
}
trace_performance(t, "frotz");
------------

Bugs & Caveats
--------------

GIT_TRACE_* environment variables can be used to tell Git to show
trace output to its standard error stream. Git can often spawn a pager
internally to run its subcommand and send its standard output and
standard error to it.

Because GIT_TRACE_PERFORMANCE trace is generated only at the very end
of the program with atexit(), which happens after the pager exits, it
would not work well if you send its log to the standard error output
and let Git spawn the pager at the same time.

As a work around, you can for example use '--no-pager', or set
GIT_TRACE_PERFORMANCE to another file descriptor which is redirected
to stderr, or set GIT_TRACE_PERFORMANCE to a file specified by its
absolute path.

For example instead of the following command which by default may not
print any performance information:

------------
GIT_TRACE_PERFORMANCE=2 git log -1
------------

you may want to use:

------------
GIT_TRACE_PERFORMANCE=2 git --no-pager log -1
------------

or:

------------
GIT_TRACE_PERFORMANCE=3 3>&2 git log -1
------------

or:

------------
GIT_TRACE_PERFORMANCE=/path/to/log/file git log -1
------------
