Re: [PATCH v3 6/8] read-tree: narrow scope of index expansion for '--prefix'
- From
Glen Choo <chooglen@google.com>
- Date
- Mar 3, 2022, 17:54 UTC
- Message-ID
- <kl6lczj2exbn.fsf@chooglen-macbookpro.roam.corp.google.com>
- In-Reply-To
- <1a9365c3bc5b810a60593612bfba97a8b0c1d657.1646166271.git.gitgitgadget@gmail.com>
"Victoria Dye via GitGitGadget" <gitgitgadget@gmail.com> writes:
Show 36 quoted lines
> From: Victoria Dye <vdye@github.com>
> +static void update_sparsity_for_prefix(const char *prefix,
> + struct index_state *istate)
> +{
> + int prefix_len = strlen(prefix);
> + struct strbuf ce_prefix = STRBUF_INIT;
> +
> + if (!istate->sparse_index)
> + return;
> +
> + while (prefix_len > 0 && prefix[prefix_len - 1] == '/')
> + prefix_len--;
> +
> + if (prefix_len <= 0)
> + BUG("Invalid prefix passed to update_sparsity_for_prefix");
> +
> + strbuf_grow(&ce_prefix, prefix_len + 1);
> + strbuf_add(&ce_prefix, prefix, prefix_len);
> + strbuf_addch(&ce_prefix, '/');
> +
> + /*
> + * If the prefix points to a sparse directory or a path inside a sparse
> + * directory, the index should be expanded. This is accomplished in one
> + * of two ways:
> + * - if the prefix is inside a sparse directory, it will be expanded by
> + * the 'ensure_full_index(...)' call in 'index_name_pos(...)'.
> + * - if the prefix matches an existing sparse directory entry,
> + * 'index_name_pos(...)' will return its index position, triggering
> + * the 'ensure_full_index(...)' below.
> + */
> + if (!path_in_cone_mode_sparse_checkout(ce_prefix.buf, istate) &&
> + index_name_pos(istate, ce_prefix.buf, ce_prefix.len) >= 0)
> + ensure_full_index(istate);
> +
> + strbuf_release(&ce_prefix);
> +}Hm, I don't think I follow the rationale for having two different ways of expanding the index:
- If the prefix is inside a sparse directory, we should expand the index. - If the prefix matches a sparse directory entry, we should expand the index.
So it seems like distinguishing between the two cases with index_name_pos(...) isn't necessary. I've attached a diff that does exactly this, and it passes t1092-sparse-checkout-compatibility.sh as far as I can tell. I've also amended the comment in a way that makes more sense to me, but I'm not 100% sure if it's accurate.
I'm also a little averse to using a side effect of index_name_pos() to achieve what we really want, so I'd prefer to get rid of the call if we can :)
----- >8 --------- >8 --------- >8 --------- >8 --------- >8 ----
diff --git a/unpack-trees.c b/unpack-trees.c index b876caca0d..5b07055605 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -1749,17 +1749,11 @@ static void update_sparsity_for_prefix(const char *prefix, strbuf_addch(&ce_prefix, '/'); /* - * If the prefix points to a sparse directory or a path inside a sparse - * directory, the index should be expanded. This is accomplished in one - * of two ways: - * - if the prefix is inside a sparse directory, it will be expanded by - * the 'ensure_full_index(...)' call in 'index_name_pos(...)'. - * - if the prefix matches an existing sparse directory entry, - * 'index_name_pos(...)' will return its index position, triggering - * the 'ensure_full_index(...)' below. + * If the prefix points to a sparse directory or a path inside a + * sparse directory (not within the sparse patterns), the index + * should be expanded. */ - if (!path_in_cone_mode_sparse_checkout(ce_prefix.buf, istate) && - index_name_pos(istate, ce_prefix.buf, ce_prefix.len) >= 0) + if (!path_in_cone_mode_sparse_checkout(ce_prefix.buf, istate)) ensure_full_index(istate); strbuf_release(&ce_prefix);