[PATCH 2/2] give exclude mechanism a debug option
From: Jeff King <hidden>
Date: 2016-06-15 22:46:07
Subsystem:
the rest · Maintainer:
Linus Torvalds
Users can set GIT_DEBUG_IGNORE in the environment to get the
exclusion mechanism to dump to stderr files mentioned in
.gitignore along with the pattern that matched. The output
looks something like:
foo.c: exclude: *.c
This implementation has several shortcomings that make it
unsuitable for inclusion:
1. Doing it as a debug environment variable is hack-ish.
A nicer interface would be a .gitignore equivalent of
"git check-attr".
2. If you ask for "foo/bar", and "foo/" is ignored, the
output will show only "foo: exclude: foo". This is an
artifact of the calling interface: you don't ask "is
foo/bar excluded", but rather while recursing through
"foo/" you ask "should I bother even recursing into
foo?". So the exclusion code never even knows that you
might have cared about foo/bar in the first place.
3. There is no indication of where patterns came from. We
could specify whether it came from the command-line,
from per-directory files, or from another file. But what
is most interesting is the actual _filename_ that it
came from. I.e., something like:
sub/foo.c: exclude: sub/.gitignore: *.c
But that information seems to have been forgotten by
the time we are actually doing excludes.
Signed-off-by: Jeff King <redacted>
---
In addition to the problems above, this is hardly tested. ;)
dir.c | 21 +++++++++++++++++++++
1 files changed, 21 insertions(+), 0 deletions(-)
diff --git a/dir.c b/dir.c
index 0ea81b7..1052496 100644
--- a/dir.c
+++ b/dir.c@@ -8,6 +8,7 @@ #include "cache.h" #include "dir.h" #include "refs.h" +#include "quote.h" struct path_simplify { int len;
@@ -354,6 +355,24 @@ static struct exclude *excluded_1(const char *pathname, return NULL; } +static int debug_ignore(void) +{ + static int ignore = -1; + if (ignore == -1) { + const char *env = getenv("GIT_DEBUG_IGNORE"); + ignore = env ? git_config_bool("GIT_DEBUG_IGNORE", env) : 0; + } + return ignore; +} + +static void show_ignore(const char *path, struct exclude *x) +{ + quote_c_style(path, NULL, stderr, 0); + fprintf(stderr, ": %s: %.*s\n", + (x->to_exclude ? "exclude" : "include"), + x->patternlen, x->pattern); +} + int excluded(struct dir_struct *dir, const char *pathname, int *dtype_p) { int pathlen = strlen(pathname);
@@ -367,6 +386,8 @@ int excluded(struct dir_struct *dir, const char *pathname, int *dtype_p) dtype_p, &dir->exclude_list[st]); if (!x) continue; + if (debug_ignore()) + show_ignore(pathname, x); switch (x->to_exclude) { case 0: return 0;
--
1.6.1.2.552.g1682c.dirty