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:
committed by
Junio C Hamano
parent
93e23798ef
commit
22af33bece
38
pathspec.c
38
pathspec.c
@ -659,3 +659,41 @@ void clear_pathspec(struct pathspec *pathspec)
|
||||
FREE_AND_NULL(pathspec->items);
|
||||
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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user