Skip to content

Commit e1d9288

Browse files
committed
Merge branch 'ds/sparse-deep-pattern-checkout-fix'
The sparse-index/sparse-checkout feature had a bug in its use of the matching code to determine which path is in or outside the sparse checkout patterns. * ds/sparse-deep-pattern-checkout-fix: unpack-trees: use traverse_path instead of name t1092: add deeper changes during a checkout
2 parents 79aee56 + 8c5de0d commit e1d9288

File tree

2 files changed

+23
-7
lines changed

2 files changed

+23
-7
lines changed

t/t1092-sparse-checkout-compatibility.sh

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ test_expect_success 'setup' '
1919
mkdir folder1 folder2 deep x &&
2020
mkdir deep/deeper1 deep/deeper2 deep/before deep/later &&
2121
mkdir deep/deeper1/deepest &&
22+
mkdir deep/deeper1/deepest2 &&
23+
mkdir deep/deeper1/deepest3 &&
2224
echo "after deeper1" >deep/e &&
2325
echo "after deepest" >deep/deeper1/e &&
2426
cp a folder1 &&
@@ -30,7 +32,9 @@ test_expect_success 'setup' '
3032
cp a deep/deeper2 &&
3133
cp a deep/later &&
3234
cp a deep/deeper1/deepest &&
33-
cp -r deep/deeper1/deepest deep/deeper2 &&
35+
cp a deep/deeper1/deepest2 &&
36+
cp a deep/deeper1/deepest3 &&
37+
cp -r deep/deeper1/ deep/deeper2 &&
3438
mkdir deep/deeper1/0 &&
3539
mkdir deep/deeper1/0/0 &&
3640
touch deep/deeper1/0/1 &&
@@ -126,6 +130,8 @@ test_expect_success 'setup' '
126130
127131
git checkout -b deepest base &&
128132
echo "updated deepest" >deep/deeper1/deepest/a &&
133+
echo "updated deepest2" >deep/deeper1/deepest2/a &&
134+
echo "updated deepest3" >deep/deeper1/deepest3/a &&
129135
git commit -a -m "update deepest" &&
130136
131137
git checkout -f base &&
@@ -301,6 +307,14 @@ test_expect_success 'add, commit, checkout' '
301307
test_all_match git checkout -
302308
'
303309

310+
test_expect_success 'deep changes during checkout' '
311+
init_repos &&
312+
313+
test_sparse_match git sparse-checkout set deep/deeper1/deepest &&
314+
test_all_match git checkout deepest &&
315+
test_all_match git checkout base
316+
'
317+
304318
test_expect_success 'add outside sparse cone' '
305319
init_repos &&
306320

unpack-trees.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1238,7 +1238,9 @@ static int find_cache_pos(struct traverse_info *info,
12381238

12391239
/*
12401240
* Given a sparse directory entry 'ce', compare ce->name to
1241-
* info->name + '/' + p->path + '/' if info->name is non-empty.
1241+
* info->traverse_path + p->path + '/' if info->traverse_path
1242+
* is non-empty.
1243+
*
12421244
* Compare ce->name to p->path + '/' otherwise. Note that
12431245
* ce->name must end in a trailing '/' because it is a sparse
12441246
* directory entry.
@@ -1250,11 +1252,11 @@ static int sparse_dir_matches_path(const struct cache_entry *ce,
12501252
assert(S_ISSPARSEDIR(ce->ce_mode));
12511253
assert(ce->name[ce->ce_namelen - 1] == '/');
12521254

1253-
if (info->namelen)
1254-
return ce->ce_namelen == info->namelen + p->pathlen + 2 &&
1255-
ce->name[info->namelen] == '/' &&
1256-
!strncmp(ce->name, info->name, info->namelen) &&
1257-
!strncmp(ce->name + info->namelen + 1, p->path, p->pathlen);
1255+
if (info->pathlen)
1256+
return ce->ce_namelen == info->pathlen + p->pathlen + 1 &&
1257+
ce->name[info->pathlen - 1] == '/' &&
1258+
!strncmp(ce->name, info->traverse_path, info->pathlen) &&
1259+
!strncmp(ce->name + info->pathlen, p->path, p->pathlen);
12581260
return ce->ce_namelen == p->pathlen + 1 &&
12591261
!strncmp(ce->name, p->path, p->pathlen);
12601262
}

0 commit comments

Comments
 (0)