From: Derrick Stolee <redacted>
When we have sparse directory entries in the index, we want to compare
that directory against sparse-checkout patterns. Those pattern matching
algorithms are built expecting a file path, not a directory path. This
is especially important in the "cone mode" patterns which will match
files that exist within the "parent directories" as well as the
recursive directory matches.
If path_matches_pattern_list() is given a directory, we can add a bogus
filename ("-") to the directory and get the same results as before,
assuming we are in cone mode. Since sparse index requires cone mode
patterns, this is an acceptable assumption.
Signed-off-by: Derrick Stolee <redacted>
---
dir.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/dir.c b/dir.c
index ad6eb033cb1..c786fa98d0e 100644
--- a/dir.c
+++ b/dir.c
@@ -1384,6 +1384,11 @@ enum pattern_match_result path_matches_pattern_list(
strbuf_addch(&parent_pathname, '/');
strbuf_add(&parent_pathname, pathname, pathlen);
+ /* Directory requests should be added as if they are a file */
+ if (parent_pathname.len > 1 &&
+ parent_pathname.buf[parent_pathname.len - 1] == '/')
+ strbuf_add(&parent_pathname, "-", 1);
+
if (hashmap_contains_path(&pl->recursive_hashmap,
&parent_pathname)) {
result = MATCHED_RECURSIVE;--
gitgitgadget