]> git.ipfire.org Git - thirdparty/git.git/commitdiff
reset: integrate with sparse index
authorVictoria Dye <vdye@github.com>
Mon, 29 Nov 2021 15:52:40 +0000 (15:52 +0000)
committerJunio C Hamano <gitster@pobox.com>
Mon, 29 Nov 2021 20:51:26 +0000 (12:51 -0800)
Disable `command_requires_full_index` repo setting and add
`ensure_full_index` guards around code paths that cannot yet use sparse
directory index entries. `reset --soft` does not modify the index, so no
compatibility changes are needed for it to function without expanding the
index. For all other reset modes (`--mixed`, `--hard`, `--keep`, `--merge`),
the full index is expanded to prevent cache tree corruption and invalid
variable accesses.

Additionally, the `read_cache()` check verifying an uncorrupted index is
moved after argument parsing and preparing the repo settings. The index is
not used by the preceding argument handling, but `read_cache()` must be run
*after* enabling sparse index for the command (so that the index is not
expanded unnecessarily) and *before* using the index for reset (so that it
is verified as uncorrupted).

Signed-off-by: Victoria Dye <vdye@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/reset.c
cache-tree.c

index e441b6601b9b9e805fe9829b3917453042493492..0ac0de7dc977a05ee9b288bf35006abf20a1709d 100644 (file)
@@ -180,6 +180,7 @@ static int read_from_tree(const struct pathspec *pathspec,
        opt.flags.override_submodule_config = 1;
        opt.repo = the_repository;
 
+       ensure_full_index(&the_index);
        if (do_diff_cache(tree_oid, &opt))
                return 1;
        diffcore_std(&opt);
@@ -257,9 +258,6 @@ static void parse_args(struct pathspec *pathspec,
        }
        *rev_ret = rev;
 
-       if (read_cache() < 0)
-               die(_("index file corrupt"));
-
        parse_pathspec(pathspec, 0,
                       PATHSPEC_PREFER_FULL |
                       (patch_mode ? PATHSPEC_PREFIX_ORIGIN : 0),
@@ -405,6 +403,12 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
        if (intent_to_add && reset_type != MIXED)
                die(_("-N can only be used with --mixed"));
 
+       prepare_repo_settings(the_repository);
+       the_repository->settings.command_requires_full_index = 0;
+
+       if (read_cache() < 0)
+               die(_("index file corrupt"));
+
        /* Soft reset does not touch the index file nor the working tree
         * at all, but requires them in a good order.  Other resets reset
         * the index file to the tree object we are switching to. */
index 90919f9e3454791e2132236a2319b5f51c9c1d41..9be19c85b66d56999d945cf087f033ac1f25e178 100644 (file)
@@ -776,6 +776,7 @@ void prime_cache_tree(struct repository *r,
        cache_tree_free(&istate->cache_tree);
        istate->cache_tree = cache_tree();
 
+       ensure_full_index(istate);
        prime_cache_tree_rec(r, istate->cache_tree, tree);
        istate->cache_changed |= CACHE_TREE_CHANGED;
        trace2_region_leave("cache-tree", "prime_cache_tree", the_repository);