Merge branch 'ds/sparse-colon-path'
"git show :<path>" learned to work better with the sparse-index feature. * ds/sparse-colon-path: rev-parse: integrate with sparse index object-name: diagnose trees in index properly object-name: reject trees found in the index show: integrate with the sparse index t1092: add compatibility tests for 'git show'maint
commit
acdeb10f91
|
|
@ -669,6 +669,11 @@ int cmd_show(int argc, const char **argv, const char *prefix)
|
||||||
init_log_defaults();
|
init_log_defaults();
|
||||||
git_config(git_log_config, NULL);
|
git_config(git_log_config, NULL);
|
||||||
|
|
||||||
|
if (the_repository->gitdir) {
|
||||||
|
prepare_repo_settings(the_repository);
|
||||||
|
the_repository->settings.command_requires_full_index = 0;
|
||||||
|
}
|
||||||
|
|
||||||
memset(&match_all, 0, sizeof(match_all));
|
memset(&match_all, 0, sizeof(match_all));
|
||||||
repo_init_revisions(the_repository, &rev, prefix);
|
repo_init_revisions(the_repository, &rev, prefix);
|
||||||
git_config(grep_config, &rev.grep_filter);
|
git_config(grep_config, &rev.grep_filter);
|
||||||
|
|
|
||||||
|
|
@ -723,6 +723,9 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
|
||||||
prefix = setup_git_directory();
|
prefix = setup_git_directory();
|
||||||
git_config(git_default_config, NULL);
|
git_config(git_default_config, NULL);
|
||||||
did_repo_setup = 1;
|
did_repo_setup = 1;
|
||||||
|
|
||||||
|
prepare_repo_settings(the_repository);
|
||||||
|
the_repository->settings.command_requires_full_index = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!strcmp(arg, "--")) {
|
if (!strcmp(arg, "--")) {
|
||||||
|
|
|
||||||
|
|
@ -1832,7 +1832,8 @@ static void diagnose_invalid_index_path(struct repository *r,
|
||||||
pos = -pos - 1;
|
pos = -pos - 1;
|
||||||
if (pos < istate->cache_nr) {
|
if (pos < istate->cache_nr) {
|
||||||
ce = istate->cache[pos];
|
ce = istate->cache[pos];
|
||||||
if (ce_namelen(ce) == namelen &&
|
if (!S_ISSPARSEDIR(ce->ce_mode) &&
|
||||||
|
ce_namelen(ce) == namelen &&
|
||||||
!memcmp(ce->name, filename, namelen))
|
!memcmp(ce->name, filename, namelen))
|
||||||
die(_("path '%s' is in the index, but not at stage %d\n"
|
die(_("path '%s' is in the index, but not at stage %d\n"
|
||||||
"hint: Did you mean ':%d:%s'?"),
|
"hint: Did you mean ':%d:%s'?"),
|
||||||
|
|
@ -1848,7 +1849,8 @@ static void diagnose_invalid_index_path(struct repository *r,
|
||||||
pos = -pos - 1;
|
pos = -pos - 1;
|
||||||
if (pos < istate->cache_nr) {
|
if (pos < istate->cache_nr) {
|
||||||
ce = istate->cache[pos];
|
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))
|
!memcmp(ce->name, fullname.buf, fullname.len))
|
||||||
die(_("path '%s' is in the index, but not '%s'\n"
|
die(_("path '%s' is in the index, but not '%s'\n"
|
||||||
"hint: Did you mean ':%d:%s' aka ':%d:./%s'?"),
|
"hint: Did you mean ':%d:%s' aka ':%d:./%s'?"),
|
||||||
|
|
@ -1881,6 +1883,20 @@ static char *resolve_relative_path(struct repository *r, const char *rel)
|
||||||
rel);
|
rel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int reject_tree_in_index(struct repository *repo,
|
||||||
|
int only_to_die,
|
||||||
|
const struct cache_entry *ce,
|
||||||
|
int stage,
|
||||||
|
const char *prefix,
|
||||||
|
const char *cp)
|
||||||
|
{
|
||||||
|
if (!S_ISSPARSEDIR(ce->ce_mode))
|
||||||
|
return 0;
|
||||||
|
if (only_to_die)
|
||||||
|
diagnose_invalid_index_path(repo, stage, prefix, cp);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
static enum get_oid_result get_oid_with_context_1(struct repository *repo,
|
static enum get_oid_result get_oid_with_context_1(struct repository *repo,
|
||||||
const char *name,
|
const char *name,
|
||||||
unsigned flags,
|
unsigned flags,
|
||||||
|
|
@ -1955,9 +1971,12 @@ static enum get_oid_result get_oid_with_context_1(struct repository *repo,
|
||||||
memcmp(ce->name, cp, namelen))
|
memcmp(ce->name, cp, namelen))
|
||||||
break;
|
break;
|
||||||
if (ce_stage(ce) == stage) {
|
if (ce_stage(ce) == stage) {
|
||||||
|
free(new_path);
|
||||||
|
if (reject_tree_in_index(repo, only_to_die, ce,
|
||||||
|
stage, prefix, cp))
|
||||||
|
return -1;
|
||||||
oidcpy(oid, &ce->oid);
|
oidcpy(oid, &ce->oid);
|
||||||
oc->mode = ce->ce_mode;
|
oc->mode = ce->ce_mode;
|
||||||
free(new_path);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
pos++;
|
pos++;
|
||||||
|
|
|
||||||
|
|
@ -1200,6 +1200,33 @@ test_expect_success 'clean' '
|
||||||
test_sparse_match test_path_is_dir folder1
|
test_sparse_match test_path_is_dir folder1
|
||||||
'
|
'
|
||||||
|
|
||||||
|
for builtin in show rev-parse
|
||||||
|
do
|
||||||
|
test_expect_success "$builtin (cached blobs/trees)" "
|
||||||
|
init_repos &&
|
||||||
|
|
||||||
|
test_all_match git $builtin :a &&
|
||||||
|
test_all_match git $builtin :deep/a &&
|
||||||
|
test_sparse_match git $builtin :folder1/a &&
|
||||||
|
|
||||||
|
# The error message differs depending on whether
|
||||||
|
# the directory exists in the worktree.
|
||||||
|
test_all_match test_must_fail git $builtin :deep/ &&
|
||||||
|
test_must_fail git -C full-checkout $builtin :folder1/ &&
|
||||||
|
test_sparse_match test_must_fail git $builtin :folder1/ &&
|
||||||
|
|
||||||
|
# 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 $builtin :deep/deeper2/ &&
|
||||||
|
|
||||||
|
# deep/deeper2/deepest is not in the sparse index, but
|
||||||
|
# will trigger an index expansion.
|
||||||
|
test_sparse_match test_must_fail git $builtin :deep/deeper2/deepest/
|
||||||
|
"
|
||||||
|
done
|
||||||
|
|
||||||
test_expect_success 'submodule handling' '
|
test_expect_success 'submodule handling' '
|
||||||
init_repos &&
|
init_repos &&
|
||||||
|
|
||||||
|
|
@ -1448,6 +1475,15 @@ test_expect_success 'sparse index is not expanded: diff' '
|
||||||
ensure_not_expanded diff --cached
|
ensure_not_expanded diff --cached
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'sparse index is not expanded: show and rev-parse' '
|
||||||
|
init_repos &&
|
||||||
|
|
||||||
|
ensure_not_expanded show :a &&
|
||||||
|
ensure_not_expanded show :deep/a &&
|
||||||
|
ensure_not_expanded rev-parse :a &&
|
||||||
|
ensure_not_expanded rev-parse :deep/a
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_success 'sparse index is not expanded: update-index' '
|
test_expect_success 'sparse index is not expanded: update-index' '
|
||||||
init_repos &&
|
init_repos &&
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue