Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sparse Index: fix a checkout bug with deep sparse-checkout paths #473

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion t/t1092-sparse-checkout-compatibility.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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 &&
Expand All @@ -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 &&
Expand Down Expand Up @@ -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 &&
Expand Down Expand Up @@ -302,6 +308,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 &&

Expand Down
14 changes: 8 additions & 6 deletions unpack-trees.c
Original file line number Diff line number Diff line change
Expand Up @@ -1258,7 +1258,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.
Expand All @@ -1270,11 +1272,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);
}
Expand Down