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

[PATCH 2/6] ls-files -i: micro-optimize path_excluded()

From
Junio C Hamano <gitster@pobox.com>
Date
Jun 6, 2012, 05:45 UTC
Message-ID
<1338961519-30970-3-git-send-email-gitster@pobox.com>
In-Reply-To
<1338961519-30970-1-git-send-email-gitster@pobox.com>

As we know a caller that does not recurse is calling us in the index order, we can remember the last directory we found to be excluded and see if the path we are looking at is still inside it, in which case we can just answer that it is excluded.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 dir.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
diff --git a/dir.c b/dir.c
index c3f0884..839bc9f 100644
--- a/dir.c
+++ b/dir.c
@@ -592,11 +592,25 @@ void path_exclude_check_clear(struct path_exclude_check *check)
 	strbuf_release(&check->path);
 }
 
+/*
+ * Is the ce->name excluded?  This is for a caller like show_files() that
+ * do not honor directory hierarchy and iterate through paths that are
+ * possibly in an ignored directory.
+ *
+ * A path to a directory known to be excluded is left in check->path to
+ * optimize for repeated checks for files in the same excluded directory.
+ */
 int path_excluded(struct path_exclude_check *check, struct cache_entry *ce)
 {
 	int i, dtype;
 	struct strbuf *path = &check->path;
 
+	if (path->len &&
+	    path->len <= ce_namelen(ce) &&
+	    !memcmp(ce->name, path->buf, path->len) &&
+	    (!ce->name[path->len] || ce->name[path->len] == '/'))
+		return 1;
+
 	strbuf_setlen(path, 0);
 	for (i = 0; ce->name[i]; i++) {
 		int ch = ce->name[i];
@@ -608,6 +622,10 @@ int path_excluded(struct path_exclude_check *check, struct cache_entry *ce)
 		}
 		strbuf_addch(path, ch);
 	}
+
+	/* An entry in the index; cannot be a directory with subentries */
+	strbuf_setlen(path, 0);
+
 	dtype = ce_to_dtype(ce);
 	return excluded(check->dir, ce->name, &dtype);
 }
-- 
1.7.11.rc1.37.g09843ac
Previous: Junio C HamanoNext: Junio C Hamano
Message 3 of 7 in “"ls-files -i" not honoring directory wide ignore”
  1. 0/6 "ls-files -i" not honoring directory wide ignoreJunio C Hamano, Jun 6, 2012
  2. 1/6 ls-files -i: pay attention to exclusion of leading pathsJunio C Hamano, Jun 6, 2012
  3. 2/6 ls-files -i: micro-optimize path_excluded()Junio C Hamano, Jun 6, 2012
  4. 3/6 path_excluded(): update API to less cache-entry centricJunio C Hamano, Jun 6, 2012
  5. 4/6 builtin/add.c: use path_excluded()Junio C Hamano, Jun 6, 2012
  6. 5/6 unpack-trees.c: use path_excluded() in check_ok_to_remove()Junio C Hamano, Jun 6, 2012
  7. 6/6 dir.c: make excluded() file scope staticJunio C Hamano, Jun 6, 2012

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.