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
This commit is contained in:
commit
e1d9288267
@ -19,6 +19,8 @@ test_expect_success 'setup' '
|
||||
mkdir folder1 folder2 deep x &&
|
||||
mkdir deep/deeper1 deep/deeper2 deep/before deep/later &&
|
||||
mkdir deep/deeper1/deepest &&
|
||||
mkdir deep/deeper1/deepest2 &&
|
||||
mkdir deep/deeper1/deepest3 &&
|
||||
echo "after deeper1" >deep/e &&
|
||||
echo "after deepest" >deep/deeper1/e &&
|
||||
cp a folder1 &&
|
||||
@ -30,7 +32,9 @@ test_expect_success 'setup' '
|
||||
cp a deep/deeper2 &&
|
||||
cp a deep/later &&
|
||||
cp a deep/deeper1/deepest &&
|
||||
cp -r deep/deeper1/deepest deep/deeper2 &&
|
||||
cp a deep/deeper1/deepest2 &&
|
||||
cp a deep/deeper1/deepest3 &&
|
||||
cp -r deep/deeper1/ deep/deeper2 &&
|
||||
mkdir deep/deeper1/0 &&
|
||||
mkdir deep/deeper1/0/0 &&
|
||||
touch deep/deeper1/0/1 &&
|
||||
@ -126,6 +130,8 @@ test_expect_success 'setup' '
|
||||
|
||||
git checkout -b deepest base &&
|
||||
echo "updated deepest" >deep/deeper1/deepest/a &&
|
||||
echo "updated deepest2" >deep/deeper1/deepest2/a &&
|
||||
echo "updated deepest3" >deep/deeper1/deepest3/a &&
|
||||
git commit -a -m "update deepest" &&
|
||||
|
||||
git checkout -f base &&
|
||||
@ -301,6 +307,14 @@ test_expect_success 'add, commit, checkout' '
|
||||
test_all_match git checkout -
|
||||
'
|
||||
|
||||
test_expect_success 'deep changes during checkout' '
|
||||
init_repos &&
|
||||
|
||||
test_sparse_match git sparse-checkout set deep/deeper1/deepest &&
|
||||
test_all_match git checkout deepest &&
|
||||
test_all_match git checkout base
|
||||
'
|
||||
|
||||
test_expect_success 'add outside sparse cone' '
|
||||
init_repos &&
|
||||
|
||||
|
@ -1238,7 +1238,9 @@ static int find_cache_pos(struct traverse_info *info,
|
||||
|
||||
/*
|
||||
* Given a sparse directory entry 'ce', compare ce->name to
|
||||
* info->name + '/' + p->path + '/' if info->name is non-empty.
|
||||
* info->traverse_path + p->path + '/' if info->traverse_path
|
||||
* is non-empty.
|
||||
*
|
||||
* Compare ce->name to p->path + '/' otherwise. Note that
|
||||
* ce->name must end in a trailing '/' because it is a sparse
|
||||
* directory entry.
|
||||
@ -1250,11 +1252,11 @@ static int sparse_dir_matches_path(const struct cache_entry *ce,
|
||||
assert(S_ISSPARSEDIR(ce->ce_mode));
|
||||
assert(ce->name[ce->ce_namelen - 1] == '/');
|
||||
|
||||
if (info->namelen)
|
||||
return ce->ce_namelen == info->namelen + p->pathlen + 2 &&
|
||||
ce->name[info->namelen] == '/' &&
|
||||
!strncmp(ce->name, info->name, info->namelen) &&
|
||||
!strncmp(ce->name + info->namelen + 1, p->path, p->pathlen);
|
||||
if (info->pathlen)
|
||||
return ce->ce_namelen == info->pathlen + p->pathlen + 1 &&
|
||||
ce->name[info->pathlen - 1] == '/' &&
|
||||
!strncmp(ce->name, info->traverse_path, info->pathlen) &&
|
||||
!strncmp(ce->name + info->pathlen, p->path, p->pathlen);
|
||||
return ce->ce_namelen == p->pathlen + 1 &&
|
||||
!strncmp(ce->name, p->path, p->pathlen);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user