dir.c: move, rename and export match_attrs()
The function will be reused for matching attributes in pathspec when walking trees (currently it's used for matching pathspec when walking a list). pathspec.c would be a more neutral place for this. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
93e23798ef
commit
22af33bece
41
dir.c
41
dir.c
@ -276,44 +276,6 @@ static int do_read_blob(const struct object_id *oid, struct oid_stat *oid_stat,
|
|||||||
#define DO_MATCH_DIRECTORY (1<<1)
|
#define DO_MATCH_DIRECTORY (1<<1)
|
||||||
#define DO_MATCH_SUBMODULE (1<<2)
|
#define DO_MATCH_SUBMODULE (1<<2)
|
||||||
|
|
||||||
static int match_attrs(const struct index_state *istate,
|
|
||||||
const char *name, int namelen,
|
|
||||||
const struct pathspec_item *item)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
char *to_free = NULL;
|
|
||||||
|
|
||||||
if (name[namelen])
|
|
||||||
name = to_free = xmemdupz(name, namelen);
|
|
||||||
|
|
||||||
git_check_attr(istate, name, item->attr_check);
|
|
||||||
|
|
||||||
free(to_free);
|
|
||||||
|
|
||||||
for (i = 0; i < item->attr_match_nr; i++) {
|
|
||||||
const char *value;
|
|
||||||
int matched;
|
|
||||||
enum attr_match_mode match_mode;
|
|
||||||
|
|
||||||
value = item->attr_check->items[i].value;
|
|
||||||
match_mode = item->attr_match[i].match_mode;
|
|
||||||
|
|
||||||
if (ATTR_TRUE(value))
|
|
||||||
matched = (match_mode == MATCH_SET);
|
|
||||||
else if (ATTR_FALSE(value))
|
|
||||||
matched = (match_mode == MATCH_UNSET);
|
|
||||||
else if (ATTR_UNSET(value))
|
|
||||||
matched = (match_mode == MATCH_UNSPECIFIED);
|
|
||||||
else
|
|
||||||
matched = (match_mode == MATCH_VALUE &&
|
|
||||||
!strcmp(item->attr_match[i].value, value));
|
|
||||||
if (!matched)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Does 'match' match the given name?
|
* Does 'match' match the given name?
|
||||||
* A match is found if
|
* A match is found if
|
||||||
@ -367,7 +329,8 @@ static int match_pathspec_item(const struct index_state *istate,
|
|||||||
strncmp(item->match, name - prefix, item->prefix))
|
strncmp(item->match, name - prefix, item->prefix))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (item->attr_match_nr && !match_attrs(istate, name, namelen, item))
|
if (item->attr_match_nr &&
|
||||||
|
!match_pathspec_attrs(istate, name, namelen, item))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* If the match was just the prefix, we matched */
|
/* If the match was just the prefix, we matched */
|
||||||
|
38
pathspec.c
38
pathspec.c
@ -659,3 +659,41 @@ void clear_pathspec(struct pathspec *pathspec)
|
|||||||
FREE_AND_NULL(pathspec->items);
|
FREE_AND_NULL(pathspec->items);
|
||||||
pathspec->nr = 0;
|
pathspec->nr = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int match_pathspec_attrs(const struct index_state *istate,
|
||||||
|
const char *name, int namelen,
|
||||||
|
const struct pathspec_item *item)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char *to_free = NULL;
|
||||||
|
|
||||||
|
if (name[namelen])
|
||||||
|
name = to_free = xmemdupz(name, namelen);
|
||||||
|
|
||||||
|
git_check_attr(istate, name, item->attr_check);
|
||||||
|
|
||||||
|
free(to_free);
|
||||||
|
|
||||||
|
for (i = 0; i < item->attr_match_nr; i++) {
|
||||||
|
const char *value;
|
||||||
|
int matched;
|
||||||
|
enum attr_match_mode match_mode;
|
||||||
|
|
||||||
|
value = item->attr_check->items[i].value;
|
||||||
|
match_mode = item->attr_match[i].match_mode;
|
||||||
|
|
||||||
|
if (ATTR_TRUE(value))
|
||||||
|
matched = (match_mode == MATCH_SET);
|
||||||
|
else if (ATTR_FALSE(value))
|
||||||
|
matched = (match_mode == MATCH_UNSET);
|
||||||
|
else if (ATTR_UNSET(value))
|
||||||
|
matched = (match_mode == MATCH_UNSPECIFIED);
|
||||||
|
else
|
||||||
|
matched = (match_mode == MATCH_VALUE &&
|
||||||
|
!strcmp(item->attr_match[i].value, value));
|
||||||
|
if (!matched)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
@ -111,5 +111,8 @@ void add_pathspec_matches_against_index(const struct pathspec *pathspec,
|
|||||||
char *seen);
|
char *seen);
|
||||||
char *find_pathspecs_matching_against_index(const struct pathspec *pathspec,
|
char *find_pathspecs_matching_against_index(const struct pathspec *pathspec,
|
||||||
const struct index_state *istate);
|
const struct index_state *istate);
|
||||||
|
int match_pathspec_attrs(const struct index_state *istate,
|
||||||
|
const char *name, int namelen,
|
||||||
|
const struct pathspec_item *item);
|
||||||
|
|
||||||
#endif /* PATHSPEC_H */
|
#endif /* PATHSPEC_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user