log-tree: make ref_filter_match() a helper method
The ref_filter_match() method is defined in refs.h and implemented in refs.c, but is only used by add_ref_decoration() in log-tree.c. Move it into that file as a static helper method. The match_ref_pattern() comes along for the ride. While moving the code, also make a slight adjustment to have ref_filter_match() take a struct decoration_filter pointer instead of multiple string lists. This is non-functional, but will make a later change be much cleaner. The diff is easier to parse when using the --color-moved option. Reported-by: Junio C Hamano <gister@pobox.com> Signed-off-by: Derrick Stolee <dstolee@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
efe3874640
commit
c9f7a793e8
49
log-tree.c
49
log-tree.c
@ -81,6 +81,51 @@ const struct name_decoration *get_name_decoration(const struct object *obj)
|
|||||||
return lookup_decoration(&name_decoration, obj);
|
return lookup_decoration(&name_decoration, obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int match_ref_pattern(const char *refname,
|
||||||
|
const struct string_list_item *item)
|
||||||
|
{
|
||||||
|
int matched = 0;
|
||||||
|
if (item->util == NULL) {
|
||||||
|
if (!wildmatch(item->string, refname, 0))
|
||||||
|
matched = 1;
|
||||||
|
} else {
|
||||||
|
const char *rest;
|
||||||
|
if (skip_prefix(refname, item->string, &rest) &&
|
||||||
|
(!*rest || *rest == '/'))
|
||||||
|
matched = 1;
|
||||||
|
}
|
||||||
|
return matched;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ref_filter_match(const char *refname,
|
||||||
|
const struct decoration_filter *filter)
|
||||||
|
{
|
||||||
|
struct string_list_item *item;
|
||||||
|
const struct string_list *exclude_patterns = filter->exclude_ref_pattern;
|
||||||
|
const struct string_list *include_patterns = filter->include_ref_pattern;
|
||||||
|
|
||||||
|
if (exclude_patterns && exclude_patterns->nr) {
|
||||||
|
for_each_string_list_item(item, exclude_patterns) {
|
||||||
|
if (match_ref_pattern(refname, item))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (include_patterns && include_patterns->nr) {
|
||||||
|
int found = 0;
|
||||||
|
for_each_string_list_item(item, include_patterns) {
|
||||||
|
if (match_ref_pattern(refname, item)) {
|
||||||
|
found = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static int add_ref_decoration(const char *refname, const struct object_id *oid,
|
static int add_ref_decoration(const char *refname, const struct object_id *oid,
|
||||||
int flags, void *cb_data)
|
int flags, void *cb_data)
|
||||||
{
|
{
|
||||||
@ -88,9 +133,7 @@ static int add_ref_decoration(const char *refname, const struct object_id *oid,
|
|||||||
enum decoration_type type = DECORATION_NONE;
|
enum decoration_type type = DECORATION_NONE;
|
||||||
struct decoration_filter *filter = (struct decoration_filter *)cb_data;
|
struct decoration_filter *filter = (struct decoration_filter *)cb_data;
|
||||||
|
|
||||||
if (filter && !ref_filter_match(refname,
|
if (filter && !ref_filter_match(refname, filter))
|
||||||
filter->include_ref_pattern,
|
|
||||||
filter->exclude_ref_pattern))
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (starts_with(refname, git_replace_ref_base)) {
|
if (starts_with(refname, git_replace_ref_base)) {
|
||||||
|
44
refs.c
44
refs.c
@ -321,50 +321,6 @@ int ref_exists(const char *refname)
|
|||||||
return refs_ref_exists(get_main_ref_store(the_repository), refname);
|
return refs_ref_exists(get_main_ref_store(the_repository), refname);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int match_ref_pattern(const char *refname,
|
|
||||||
const struct string_list_item *item)
|
|
||||||
{
|
|
||||||
int matched = 0;
|
|
||||||
if (item->util == NULL) {
|
|
||||||
if (!wildmatch(item->string, refname, 0))
|
|
||||||
matched = 1;
|
|
||||||
} else {
|
|
||||||
const char *rest;
|
|
||||||
if (skip_prefix(refname, item->string, &rest) &&
|
|
||||||
(!*rest || *rest == '/'))
|
|
||||||
matched = 1;
|
|
||||||
}
|
|
||||||
return matched;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ref_filter_match(const char *refname,
|
|
||||||
const struct string_list *include_patterns,
|
|
||||||
const struct string_list *exclude_patterns)
|
|
||||||
{
|
|
||||||
struct string_list_item *item;
|
|
||||||
|
|
||||||
if (exclude_patterns && exclude_patterns->nr) {
|
|
||||||
for_each_string_list_item(item, exclude_patterns) {
|
|
||||||
if (match_ref_pattern(refname, item))
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (include_patterns && include_patterns->nr) {
|
|
||||||
int found = 0;
|
|
||||||
for_each_string_list_item(item, include_patterns) {
|
|
||||||
if (match_ref_pattern(refname, item)) {
|
|
||||||
found = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!found)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int filter_refs(const char *refname, const struct object_id *oid,
|
static int filter_refs(const char *refname, const struct object_id *oid,
|
||||||
int flags, void *data)
|
int flags, void *data)
|
||||||
{
|
{
|
||||||
|
12
refs.h
12
refs.h
@ -361,18 +361,6 @@ int for_each_rawref(each_ref_fn fn, void *cb_data);
|
|||||||
void normalize_glob_ref(struct string_list_item *item, const char *prefix,
|
void normalize_glob_ref(struct string_list_item *item, const char *prefix,
|
||||||
const char *pattern);
|
const char *pattern);
|
||||||
|
|
||||||
/*
|
|
||||||
* Returns 0 if refname matches any of the exclude_patterns, or if it doesn't
|
|
||||||
* match any of the include_patterns. Returns 1 otherwise.
|
|
||||||
*
|
|
||||||
* If pattern list is NULL or empty, matching against that list is skipped.
|
|
||||||
* This has the effect of matching everything by default, unless the user
|
|
||||||
* specifies rules otherwise.
|
|
||||||
*/
|
|
||||||
int ref_filter_match(const char *refname,
|
|
||||||
const struct string_list *include_patterns,
|
|
||||||
const struct string_list *exclude_patterns);
|
|
||||||
|
|
||||||
static inline const char *has_glob_specials(const char *pattern)
|
static inline const char *has_glob_specials(const char *pattern)
|
||||||
{
|
{
|
||||||
return strpbrk(pattern, "?*[");
|
return strpbrk(pattern, "?*[");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user