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 <peff@xxxxxxxx> --- 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 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html