зеркало из https://github.com/microsoft/git.git
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:
Родитель
93e23798ef
Коммит
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_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?
|
||||
* 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))
|
||||
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;
|
||||
|
||||
/* 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);
|
||||
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 *find_pathspecs_matching_against_index(const struct pathspec *pathspec,
|
||||
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 */
|
||||
|
|
Загрузка…
Ссылка в новой задаче