Skip to content

Commit

Permalink
untracked cache: invalidate dirs recursively if .gitignore changes
Browse files Browse the repository at this point in the history
It's easy to see that if an existing .gitignore changes, its SHA-1
would be different and invalidate_gitignore() is called.

If .gitignore is removed, add_excludes() will treat it like an empty
.gitignore, which again should invalidate the cached directory data.

if .gitignore is added, lookup_untracked() already fills initial
.gitignore SHA-1 as "empty file", so again invalidate_gitignore() is
called.

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 ccad261 commit 5ebf79a
Showing 1 changed file with 17 additions and 1 deletion.
18 changes: 17 additions & 1 deletion dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -1011,7 +1011,23 @@ static void prep_exclude(struct dir_struct *dir, const char *base, int baselen)
add_excludes(el->src, el->src, stk->baselen, el, 1,
untracked ? &sha1_stat : NULL);
}
if (untracked) {
/*
* NEEDSWORK: when untracked cache is enabled, prep_exclude()
* will first be called in valid_cached_dir() then maybe many
* times more in last_exclude_matching(). When the cache is
* used, last_exclude_matching() will not be called and
* reading .gitignore content will be a waste.
*
* So when it's called by valid_cached_dir() and we can get
* .gitignore SHA-1 from the index (i.e. .gitignore is not
* modified on work tree), we could delay reading the
* .gitignore content until we absolutely need it in
* last_exclude_matching(). Be careful about ignore rule
* order, though, if you do that.
*/
if (untracked &&
hashcmp(sha1_stat.sha1, untracked->exclude_sha1)) {
invalidate_gitignore(dir->untracked, untracked);
hashcpy(untracked->exclude_sha1, sha1_stat.sha1);
}
dir->exclude_stack = stk;
Expand Down

0 comments on commit 5ebf79a

Please sign in to comment.