Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.kernel.org/pub/scm/git/git.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerrick Stolee <dstolee@microsoft.com>2022-05-23 16:48:39 +0300
committerJunio C Hamano <gitster@pobox.com>2022-05-23 21:08:21 +0300
commitdce241b020cf32c9485c7ef23247f0b003731afa (patch)
treed6467a7672f323e4a739b637fb47d38e71dc90d8 /sparse-index.c
parent8846847a142d720f63b5cbf9f0481c7694445ace (diff)
sparse-index: create expand_index()
This is the first change in a series to allow modifying the sparse-checkout pattern set without expanding a sparse index to a full one in the process. Here, we focus on the problem of expanding the pattern set through a command like 'git sparse-checkout add <path>' which needs to create new index entries for the paths now being written to the worktree. To achieve this, we need to be able to replace sparse directory entries with their contained files and subdirectories. Once this is complete, other code paths can discover those cache entries and write the corresponding files to disk before committing the index. We already have logic in ensure_full_index() that expands the index entries, so we will use that as our base. Create a new method, expand_index(), which takes a pattern list, but for now mostly ignores it. The current implementation is only correct when the pattern list is NULL as that does the same as ensure_full_index(). In fact, ensure_full_index() is converted to a shim over expand_index(). A future update will actually implement expand_index() to its full capabilities. For now, it is created and documented. Signed-off-by: Derrick Stolee <derrickstolee@github.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'sparse-index.c')
-rw-r--r--sparse-index.c32
1 files changed, 29 insertions, 3 deletions
diff --git a/sparse-index.c b/sparse-index.c
index 8636af72de..a11b5cf131 100644
--- a/sparse-index.c
+++ b/sparse-index.c
@@ -248,19 +248,40 @@ static int add_path_to_index(const struct object_id *oid,
return 0;
}
-void ensure_full_index(struct index_state *istate)
+void expand_index(struct index_state *istate, struct pattern_list *pl)
{
int i;
struct index_state *full;
struct strbuf base = STRBUF_INIT;
+ const char *tr_region;
+ /*
+ * If the index is already full, then keep it full. We will convert
+ * it to a sparse index on write, if possible.
+ */
if (!istate || !istate->sparse_index)
return;
+ /*
+ * If our index is sparse, but our new pattern set does not use
+ * cone mode patterns, then we need to expand the index before we
+ * continue. A NULL pattern set indicates a full expansion to a
+ * full index.
+ */
+ if (pl && !pl->use_cone_patterns)
+ pl = NULL;
+
if (!istate->repo)
istate->repo = the_repository;
- trace2_region_enter("index", "ensure_full_index", istate->repo);
+ /*
+ * A NULL pattern set indicates we are expanding a full index, so
+ * we use a special region name that indicates the full expansion.
+ * This is used by test cases, but also helps to differentiate the
+ * two cases.
+ */
+ tr_region = pl ? "expand_index" : "ensure_full_index";
+ trace2_region_enter("index", tr_region, istate->repo);
/* initialize basics of new index */
full = xcalloc(1, sizeof(struct index_state));
@@ -322,7 +343,12 @@ void ensure_full_index(struct index_state *istate)
cache_tree_free(&istate->cache_tree);
cache_tree_update(istate, 0);
- trace2_region_leave("index", "ensure_full_index", istate->repo);
+ trace2_region_leave("index", tr_region, istate->repo);
+}
+
+void ensure_full_index(struct index_state *istate)
+{
+ expand_index(istate, NULL);
}
void ensure_correct_sparsity(struct index_state *istate)