Browse Source

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>
maint
Nguyễn Thái Ngọc Duy 6 years ago committed by Junio C Hamano
parent
commit
22af33bece
  1. 41
      dir.c
  2. 38
      pathspec.c
  3. 3
      pathspec.h

41
dir.c

@ -276,44 +276,6 @@ static int do_read_blob(const struct object_id *oid, struct oid_stat *oid_stat, @@ -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, @@ -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

@ -659,3 +659,41 @@ void clear_pathspec(struct pathspec *pathspec) @@ -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;
}

3
pathspec.h

@ -111,5 +111,8 @@ void add_pathspec_matches_against_index(const struct pathspec *pathspec, @@ -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 */

Loading…
Cancel
Save