Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
untracked cache: don't open non-existent .gitignore
This cuts down a signficant number of open(.gitignore) because most
directories usually don't have .gitignore files.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Nguyễn Thái Ngọc Duy authored and Junio C Hamano committed Mar 12, 2015
1 parent 26cb018 commit 27b099a
Showing 1 changed file with 25 additions and 1 deletion.
26 changes: 25 additions & 1 deletion dir.c
Expand Up @@ -1020,7 +1020,21 @@ static void prep_exclude(struct dir_struct *dir, const char *base, int baselen)
/* Try to read per-directory file */
hashclr(sha1_stat.sha1);
sha1_stat.valid = 0;
if (dir->exclude_per_dir) {
if (dir->exclude_per_dir &&
/*
* If we know that no files have been added in
* this directory (i.e. valid_cached_dir() has
* been executed and set untracked->valid) ..
*/
(!untracked || !untracked->valid ||
/*
* .. and .gitignore does not exist before
* (i.e. null exclude_sha1 and skip_worktree is
* not set). Then we can skip loading .gitignore,
* which would result in ENOENT anyway.
* skip_worktree is taken care in read_directory()
*/
!is_null_sha1(untracked->exclude_sha1))) {
/*
* dir->basebuf gets reused by the traversal, but we
* need fname to remain unchanged to ensure the src
Expand Down Expand Up @@ -1783,6 +1797,7 @@ static struct untracked_cache_dir *validate_untracked_cache(struct dir_struct *d
const struct pathspec *pathspec)
{
struct untracked_cache_dir *root;
int i;

if (!dir->untracked)
return NULL;
Expand Down Expand Up @@ -1834,6 +1849,15 @@ static struct untracked_cache_dir *validate_untracked_cache(struct dir_struct *d
if (dir->exclude_list_group[EXC_CMDL].nr)
return NULL;

/*
* An optimization in prep_exclude() does not play well with
* CE_SKIP_WORKTREE. It's a rare case anyway, if a single
* entry has that bit set, disable the whole untracked cache.
*/
for (i = 0; i < active_nr; i++)
if (ce_skip_worktree(active_cache[i]))
return NULL;

if (!dir->untracked->root) {
const int len = sizeof(*dir->untracked->root);
dir->untracked->root = xmalloc(len);
Expand Down

0 comments on commit 27b099a

Please sign in to comment.