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 <dstolee@microsoft.com> Reviewed-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
8a96b9d0a7
commit
02155c8c00
52
dir.c
52
dir.c
@ -1439,6 +1439,58 @@ done:
|
||||
return result;
|
||||
}
|
||||
|
||||
int init_sparse_checkout_patterns(struct index_state *istate)
|
||||
{
|
||||
if (!core_apply_sparse_checkout)
|
||||
return 1;
|
||||
if (istate->sparse_checkout_patterns)
|
||||
return 0;
|
||||
|
||||
CALLOC_ARRAY(istate->sparse_checkout_patterns, 1);
|
||||
|
||||
if (get_sparse_checkout_patterns(istate->sparse_checkout_patterns) < 0) {
|
||||
FREE_AND_NULL(istate->sparse_checkout_patterns);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int path_in_sparse_checkout_1(const char *path,
|
||||
struct index_state *istate,
|
||||
int require_cone_mode)
|
||||
{
|
||||
const char *base;
|
||||
int dtype = DT_REG;
|
||||
|
||||
/*
|
||||
* We default to accepting a path if there are no patterns or
|
||||
* they are of the wrong type.
|
||||
*/
|
||||
if (init_sparse_checkout_patterns(istate) ||
|
||||
(require_cone_mode &&
|
||||
!istate->sparse_checkout_patterns->use_cone_patterns))
|
||||
return 1;
|
||||
|
||||
base = strrchr(path, '/');
|
||||
return path_matches_pattern_list(path, strlen(path), base ? base + 1 : path,
|
||||
&dtype,
|
||||
istate->sparse_checkout_patterns,
|
||||
istate) > 0;
|
||||
}
|
||||
|
||||
int path_in_sparse_checkout(const char *path,
|
||||
struct index_state *istate)
|
||||
{
|
||||
return path_in_sparse_checkout_1(path, istate, 0);
|
||||
}
|
||||
|
||||
int path_in_cone_mode_sparse_checkout(const char *path,
|
||||
struct index_state *istate)
|
||||
{
|
||||
return path_in_sparse_checkout_1(path, istate, 1);
|
||||
}
|
||||
|
||||
static struct path_pattern *last_matching_pattern_from_lists(
|
||||
struct dir_struct *dir, struct index_state *istate,
|
||||
const char *pathname, int pathlen,
|
||||
|
Reference in New Issue
Block a user