@@ -1832,7 +1832,8 @@ static void diagnose_invalid_index_path(struct repository *r,
pos = -pos - 1;
if (pos < istate->cache_nr) {
ce = istate->cache[pos];
- if (ce_namelen(ce) == namelen &&
+ if (!S_ISSPARSEDIR(ce->ce_mode) &&
+ ce_namelen(ce) == namelen &&
!memcmp(ce->name, filename, namelen))
die(_("path '%s' is in the index, but not at stage %d\n"
"hint: Did you mean ':%d:%s'?"),
@@ -1848,7 +1849,8 @@ static void diagnose_invalid_index_path(struct repository *r,
pos = -pos - 1;
if (pos < istate->cache_nr) {
ce = istate->cache[pos];
- if (ce_namelen(ce) == fullname.len &&
+ if (!S_ISSPARSEDIR(ce->ce_mode) &&
+ ce_namelen(ce) == fullname.len &&
!memcmp(ce->name, fullname.buf, fullname.len))
die(_("path '%s' is in the index, but not '%s'\n"
"hint: Did you mean ':%d:%s' aka ':%d:./%s'?"),
@@ -1158,15 +1158,21 @@ test_expect_success 'show (cached blobs/trees)' '
test_all_match git show :deep/a &&
test_sparse_match git show :folder1/a &&
- # Asking "git show" for directories in the index
- # had different behavior depending on the existence
- # of a sparse index.
+ # The error message differs depending on whether
+ # the directory exists in the worktree.
test_all_match test_must_fail git show :deep/ &&
test_must_fail git -C full-checkout show :folder1/ &&
- test_must_fail git -C sparse-checkout show :folder1/ &&
+ test_sparse_match test_must_fail git show :folder1/ &&
- test_must_fail git -C sparse-index show :folder1/ 2>err &&
- grep "is in the index, but not at stage 0" err
+ # Change the sparse cone for an extra case:
+ run_on_sparse git sparse-checkout set deep/deeper1 &&
+
+ # deep/deeper2 is a sparse directory in the sparse index.
+ test_sparse_match test_must_fail git show :deep/deeper2/ &&
+
+ # deep/deeper2/deepest is not in the sparse index, but
+ # will trigger an index expansion.
+ test_sparse_match test_must_fail git show :deep/deeper2/deepest/
'
test_expect_success 'submodule handling' '