Re: [PATCH 8/9] update-index: integrate with sparse index
- From
Elijah Newren <newren@gmail.com>
- Date
- Jan 9, 2022, 01:49 UTC
- Message-ID
- <CABPp-BGmaKsvrO1Qxwuj+WgcvuE_NA4agY_HLQ8=csvddRafqw@mail.gmail.com>
- In-Reply-To
- <c5b98e36516b8f832576816c202be7581f261909.1641317820.git.gitgitgadget@gmail.com>
On Tue, Jan 4, 2022 at 9:37 AM Victoria Dye via GitGitGadget <gitgitgadget@gmail.com> wrote:
Show 83 quoted lines
>
> From: Victoria Dye <vdye@github.com>
>
> Enable usage of the sparse index with `update-index`. Most variations of
> `update-index` work without explicitly expanding the index or making any
> other updates in or outside of `update-index.c`.
>
> The one usage requiring additional changes is `--cacheinfo`; if a file
> inside a sparse directory was specified, the index would not be expanded
> until after the cache tree is invalidated, leading to a mismatch between the
> index and cache tree. This scenario is handled by rearranging
> `add_index_entry_with_check`, allowing `index_name_stage_pos` to expand the
> index *before* attempting to invalidate the relevant cache tree path,
> avoiding cache tree/index corruption.
>
> Signed-off-by: Victoria Dye <vdye@github.com>
> ---
> builtin/update-index.c | 3 +++
> read-cache.c | 10 +++++++---
> t/t1092-sparse-checkout-compatibility.sh | 12 ++++++++++++
> 3 files changed, 22 insertions(+), 3 deletions(-)
>
> diff --git a/builtin/update-index.c b/builtin/update-index.c
> index 187203e8bb5..605cc693bbd 100644
> --- a/builtin/update-index.c
> +++ b/builtin/update-index.c
> @@ -1077,6 +1077,9 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
>
> git_config(git_default_config, NULL);
>
> + prepare_repo_settings(r);
> + the_repository->settings.command_requires_full_index = 0;
> +
> /* we will diagnose later if it turns out that we need to update it */
> newfd = hold_locked_index(&lock_file, 0);
> if (newfd < 0)
> diff --git a/read-cache.c b/read-cache.c
> index cbe73f14e5e..b4600e954b6 100644
> --- a/read-cache.c
> +++ b/read-cache.c
> @@ -1339,9 +1339,6 @@ static int add_index_entry_with_check(struct index_state *istate, struct cache_e
> int skip_df_check = option & ADD_CACHE_SKIP_DFCHECK;
> int new_only = option & ADD_CACHE_NEW_ONLY;
>
> - if (!(option & ADD_CACHE_KEEP_CACHE_TREE))
> - cache_tree_invalidate_path(istate, ce->name);
> -
> /*
> * If this entry's path sorts after the last entry in the index,
> * we can avoid searching for it.
> @@ -1352,6 +1349,13 @@ static int add_index_entry_with_check(struct index_state *istate, struct cache_e
> else
> pos = index_name_stage_pos(istate, ce->name, ce_namelen(ce), ce_stage(ce), EXPAND_SPARSE);
>
> + /*
> + * Cache tree path should be invalidated only after index_name_stage_pos,
> + * in case it expands a sparse index.
> + */
> + if (!(option & ADD_CACHE_KEEP_CACHE_TREE))
> + cache_tree_invalidate_path(istate, ce->name);
> +
> /* existing match? Just replace it. */
> if (pos >= 0) {
> if (!new_only)
> diff --git a/t/t1092-sparse-checkout-compatibility.sh b/t/t1092-sparse-checkout-compatibility.sh
> index 6804ab23a27..bc0741c970d 100755
> --- a/t/t1092-sparse-checkout-compatibility.sh
> +++ b/t/t1092-sparse-checkout-compatibility.sh
> @@ -1216,6 +1216,18 @@ test_expect_success 'sparse index is not expanded: blame' '
> done
> '
>
> +test_expect_success 'sparse index is not expanded: update-index' '
> + init_repos &&
> +
> + echo "test" >sparse-index/README.md &&
> + echo "test2" >sparse-index/a &&
> + rm -f sparse-index/deep/a &&
> +
> + ensure_not_expanded update-index --add README.md &&
> + ensure_not_expanded update-index a &&
> + ensure_not_expanded update-index --remove deep/a
> +'The commit message said this change was about --cacheinfo, but this test doesn't use that option. I'm confused; was this a bad patch splitting by chance?
Show 7 quoted lines
> + > # NEEDSWORK: a sparse-checkout behaves differently from a full checkout > # in this scenario, but it shouldn't. > test_expect_success 'reset mixed and checkout orphan' ' > -- > gitgitgadget >