Skip to content

Commit 02155c8

Browse files
derrickstoleegitster
authored andcommitted
sparse-checkout: create helper methods
As we integrate the sparse index into more builtins, we occasionally need to check the sparse-checkout patterns to see if a path is within the sparse-checkout cone. Create some helper methods that help initialize the patterns and check for pattern matching to make this easier. The existing callers of commands like get_sparse_checkout_patterns() use a custom 'struct pattern_list' that is not necessarily the one in the 'struct index_state', so there are not many previous uses that could adopt these helpers. There are just two in builtin/add.c and sparse-index.c that can use path_in_sparse_checkout(). We add a path_in_cone_mode_sparse_checkout() as well that will only return false if the path is outside of the sparse-checkout definition _and_ the sparse-checkout patterns are in cone mode. Signed-off-by: Derrick Stolee <[email protected]> Reviewed-by: Elijah Newren <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 8a96b9d commit 02155c8

File tree

4 files changed

+64
-17
lines changed

4 files changed

+64
-17
lines changed

builtin/add.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -190,21 +190,16 @@ static int refresh(int verbose, const struct pathspec *pathspec)
190190
struct string_list only_match_skip_worktree = STRING_LIST_INIT_NODUP;
191191
int flags = REFRESH_IGNORE_SKIP_WORKTREE |
192192
(verbose ? REFRESH_IN_PORCELAIN : REFRESH_QUIET);
193-
struct pattern_list pl = { 0 };
194-
int sparse_checkout_enabled = !get_sparse_checkout_patterns(&pl);
195193

196194
seen = xcalloc(pathspec->nr, 1);
197195
refresh_index(&the_index, flags, pathspec, seen,
198196
_("Unstaged changes after refreshing the index:"));
199197
for (i = 0; i < pathspec->nr; i++) {
200198
if (!seen[i]) {
201199
const char *path = pathspec->items[i].original;
202-
int dtype = DT_REG;
203200

204201
if (matches_skip_worktree(pathspec, i, &skip_worktree_seen) ||
205-
(sparse_checkout_enabled &&
206-
!path_matches_pattern_list(path, strlen(path), NULL,
207-
&dtype, &pl, &the_index))) {
202+
!path_in_sparse_checkout(path, &the_index)) {
208203
string_list_append(&only_match_skip_worktree,
209204
pathspec->items[i].original);
210205
} else {

dir.c

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1439,6 +1439,58 @@ enum pattern_match_result path_matches_pattern_list(
14391439
return result;
14401440
}
14411441

1442+
int init_sparse_checkout_patterns(struct index_state *istate)
1443+
{
1444+
if (!core_apply_sparse_checkout)
1445+
return 1;
1446+
if (istate->sparse_checkout_patterns)
1447+
return 0;
1448+
1449+
CALLOC_ARRAY(istate->sparse_checkout_patterns, 1);
1450+
1451+
if (get_sparse_checkout_patterns(istate->sparse_checkout_patterns) < 0) {
1452+
FREE_AND_NULL(istate->sparse_checkout_patterns);
1453+
return -1;
1454+
}
1455+
1456+
return 0;
1457+
}
1458+
1459+
static int path_in_sparse_checkout_1(const char *path,
1460+
struct index_state *istate,
1461+
int require_cone_mode)
1462+
{
1463+
const char *base;
1464+
int dtype = DT_REG;
1465+
1466+
/*
1467+
* We default to accepting a path if there are no patterns or
1468+
* they are of the wrong type.
1469+
*/
1470+
if (init_sparse_checkout_patterns(istate) ||
1471+
(require_cone_mode &&
1472+
!istate->sparse_checkout_patterns->use_cone_patterns))
1473+
return 1;
1474+
1475+
base = strrchr(path, '/');
1476+
return path_matches_pattern_list(path, strlen(path), base ? base + 1 : path,
1477+
&dtype,
1478+
istate->sparse_checkout_patterns,
1479+
istate) > 0;
1480+
}
1481+
1482+
int path_in_sparse_checkout(const char *path,
1483+
struct index_state *istate)
1484+
{
1485+
return path_in_sparse_checkout_1(path, istate, 0);
1486+
}
1487+
1488+
int path_in_cone_mode_sparse_checkout(const char *path,
1489+
struct index_state *istate)
1490+
{
1491+
return path_in_sparse_checkout_1(path, istate, 1);
1492+
}
1493+
14421494
static struct path_pattern *last_matching_pattern_from_lists(
14431495
struct dir_struct *dir, struct index_state *istate,
14441496
const char *pathname, int pathlen,

dir.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,14 @@ enum pattern_match_result path_matches_pattern_list(const char *pathname,
394394
const char *basename, int *dtype,
395395
struct pattern_list *pl,
396396
struct index_state *istate);
397+
398+
int init_sparse_checkout_patterns(struct index_state *state);
399+
400+
int path_in_sparse_checkout(const char *path,
401+
struct index_state *istate);
402+
int path_in_cone_mode_sparse_checkout(const char *path,
403+
struct index_state *istate);
404+
397405
struct dir_entry *dir_add_ignored(struct dir_struct *dir,
398406
struct index_state *istate,
399407
const char *pathname, int len);

sparse-index.c

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,14 @@ static int convert_to_sparse_rec(struct index_state *istate,
3333
{
3434
int i, can_convert = 1;
3535
int start_converted = num_converted;
36-
enum pattern_match_result match;
37-
int dtype = DT_UNKNOWN;
3836
struct strbuf child_path = STRBUF_INIT;
39-
struct pattern_list *pl = istate->sparse_checkout_patterns;
4037

4138
/*
4239
* Is the current path outside of the sparse cone?
4340
* Then check if the region can be replaced by a sparse
4441
* directory entry (everything is sparse and merged).
4542
*/
46-
match = path_matches_pattern_list(ct_path, ct_pathlen,
47-
NULL, &dtype, pl, istate);
48-
if (match != NOT_MATCHED)
43+
if (path_in_sparse_checkout(ct_path, istate))
4944
can_convert = 0;
5045

5146
for (i = start; can_convert && i < end; i++) {
@@ -152,11 +147,8 @@ int convert_to_sparse(struct index_state *istate)
152147
if (!istate->repo->settings.sparse_index)
153148
return 0;
154149

155-
if (!istate->sparse_checkout_patterns) {
156-
istate->sparse_checkout_patterns = xcalloc(1, sizeof(struct pattern_list));
157-
if (get_sparse_checkout_patterns(istate->sparse_checkout_patterns) < 0)
158-
return 0;
159-
}
150+
if (init_sparse_checkout_patterns(istate))
151+
return 0;
160152

161153
/*
162154
* We need cone-mode patterns to use sparse-index. If a user edits

0 commit comments

Comments
 (0)