diff options
author | Junio C Hamano <gitster@pobox.com> | 2021-09-20 22:20:44 (GMT) |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2021-09-20 22:20:44 (GMT) |
commit | dc89c34d9e9237293d0ed73adc454fedfc620f74 (patch) | |
tree | 9c27cc50d4f38e7301a856169e62947d07e5b3c4 /unpack-trees.c | |
parent | e78db9d3037eba812591857e7b44e69b97b329f4 (diff) | |
parent | 55dfcf9591b088ce60ec80eb5425dda18223cac0 (diff) | |
download | git-dc89c34d9e9237293d0ed73adc454fedfc620f74.zip git-dc89c34d9e9237293d0ed73adc454fedfc620f74.tar.gz git-dc89c34d9e9237293d0ed73adc454fedfc620f74.tar.bz2 |
Merge branch 'ds/sparse-index-ignored-files'
In cone mode, the sparse-index code path learned to remove ignored
files (like build artifacts) outside the sparse cone, allowing the
entire directory outside the sparse cone to be removed, which is
especially useful when the sparse patterns change.
* ds/sparse-index-ignored-files:
sparse-checkout: clear tracked sparse dirs
sparse-index: add SPARSE_INDEX_MEMORY_ONLY flag
attr: be careful about sparse directories
sparse-checkout: create helper methods
sparse-index: use WRITE_TREE_MISSING_OK
sparse-index: silently return when cache tree fails
unpack-trees: fix nested sparse-dir search
sparse-index: silently return when not using cone-mode patterns
t7519: rewrite sparse index test
Diffstat (limited to 'unpack-trees.c')
-rw-r--r-- | unpack-trees.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/unpack-trees.c b/unpack-trees.c index a903e71..8ea0a54 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -1255,7 +1255,7 @@ static int sparse_dir_matches_path(const struct cache_entry *ce, static struct cache_entry *find_cache_entry(struct traverse_info *info, const struct name_entry *p) { - struct cache_entry *ce; + const char *path; int pos = find_cache_pos(info, p->path, p->pathlen); struct unpack_trees_options *o = info->data; @@ -1281,9 +1281,11 @@ static struct cache_entry *find_cache_entry(struct traverse_info *info, * paths (e.g. "subdir-"). */ while (pos >= 0) { - ce = o->src_index->cache[pos]; + struct cache_entry *ce = o->src_index->cache[pos]; - if (strncmp(ce->name, p->path, p->pathlen)) + if (!skip_prefix(ce->name, info->traverse_path, &path) || + strncmp(path, p->path, p->pathlen) || + path[p->pathlen] != '/') return NULL; if (S_ISSPARSEDIR(ce->ce_mode) && |