Skip to content

Commit dce241b

Browse files
derrickstoleegitster
authored andcommitted
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 8846847 commit dce241b

File tree

2 files changed

+42
-3
lines changed

2 files changed

+42
-3
lines changed

sparse-index.c

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -248,19 +248,40 @@ static int add_path_to_index(const struct object_id *oid,
248248
return 0;
249249
}
250250

251-
void ensure_full_index(struct index_state *istate)
251+
void expand_index(struct index_state *istate, struct pattern_list *pl)
252252
{
253253
int i;
254254
struct index_state *full;
255255
struct strbuf base = STRBUF_INIT;
256+
const char *tr_region;
256257

258+
/*
259+
* If the index is already full, then keep it full. We will convert
260+
* it to a sparse index on write, if possible.
261+
*/
257262
if (!istate || !istate->sparse_index)
258263
return;
259264

265+
/*
266+
* If our index is sparse, but our new pattern set does not use
267+
* cone mode patterns, then we need to expand the index before we
268+
* continue. A NULL pattern set indicates a full expansion to a
269+
* full index.
270+
*/
271+
if (pl && !pl->use_cone_patterns)
272+
pl = NULL;
273+
260274
if (!istate->repo)
261275
istate->repo = the_repository;
262276

263-
trace2_region_enter("index", "ensure_full_index", istate->repo);
277+
/*
278+
* A NULL pattern set indicates we are expanding a full index, so
279+
* we use a special region name that indicates the full expansion.
280+
* This is used by test cases, but also helps to differentiate the
281+
* two cases.
282+
*/
283+
tr_region = pl ? "expand_index" : "ensure_full_index";
284+
trace2_region_enter("index", tr_region, istate->repo);
264285

265286
/* initialize basics of new index */
266287
full = xcalloc(1, sizeof(struct index_state));
@@ -322,7 +343,12 @@ void ensure_full_index(struct index_state *istate)
322343
cache_tree_free(&istate->cache_tree);
323344
cache_tree_update(istate, 0);
324345

325-
trace2_region_leave("index", "ensure_full_index", istate->repo);
346+
trace2_region_leave("index", tr_region, istate->repo);
347+
}
348+
349+
void ensure_full_index(struct index_state *istate)
350+
{
351+
expand_index(istate, NULL);
326352
}
327353

328354
void ensure_correct_sparsity(struct index_state *istate)

sparse-index.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,17 @@ void expand_to_path(struct index_state *istate,
2323
struct repository;
2424
int set_sparse_index_config(struct repository *repo, int enable);
2525

26+
struct pattern_list;
27+
28+
/**
29+
* Scan the given index and compare its entries to the given pattern list.
30+
* If the index is sparse and the pattern list uses cone mode patterns,
31+
* then modify the index to contain the all of the file entries within that
32+
* new pattern list. This expands sparse directories only as far as needed.
33+
*
34+
* If the pattern list is NULL or does not use cone mode patterns, then the
35+
* index is expanded to a full index.
36+
*/
37+
void expand_index(struct index_state *istate, struct pattern_list *pl);
38+
2639
#endif

0 commit comments

Comments
 (0)