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

[PATCH 2/2] give exclude mechanism a debug option

From
Jeff King <peff@peff.net>
Date
Feb 7, 2009, 06:44 UTC
Message-ID
<20090207064454.GB14906@coredump.intra.peff.net>
In-Reply-To
<20090207064221.GA14856@coredump.intra.peff.net>

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@peff.net>
---
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
Previous: Jeff KingNext: Junio C Hamano
Message 6 of 17 in “How to find out which gitignore blocks my git-add”
  1. GonzoFeb 6, 2009
  2. Jeff KingFeb 6, 2009
  3. Sitaram ChamartyFeb 7, 2009
  4. Jeff KingFeb 7, 2009
  5. 1/2 refactor exclude handlingJeff King, Feb 7, 2009
  6. 2/2 give exclude mechanism a debug optionJeff King, Feb 7, 2009
  7. Junio C HamanoFeb 7, 2009
  8. Junio C HamanoFeb 7, 2009
  9. Jeff KingFeb 7, 2009
  10. Jeff KingFeb 7, 2009
  11. Junio C HamanoFeb 7, 2009
  12. Jeff KingFeb 8, 2009
  13. Junio C HamanoFeb 8, 2009
  14. Jeff KingFeb 8, 2009
  15. Sitaram ChamartyFeb 7, 2009
  16. Jeff KingFeb 7, 2009
  17. bisaniFeb 6, 2009

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.