Skip to content

Commit

Permalink
ls-files -i: micro-optimize path_excluded()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Junio C Hamano committed Jun 3, 2012
1 parent eb41775 commit 93921b0
Showing 1 changed file with 18 additions and 0 deletions.
18 changes: 18 additions & 0 deletions dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand All @@ -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);
}
Expand Down

0 comments on commit 93921b0

Please sign in to comment.