log-tree: use ref_namespaces instead of if/else-if

The add_ref_decoration() method uses an if/else-if chain to determine if
a ref matches a known ref namespace that has a special decoration
category. That decoration type is later used to assign a color when
writing to stdout.

The newly-added ref_namespaces array contains all namespaces, along
with information about their decoration type. Check this array instead
of this if/else-if chain. This reduces our dependency on string literals
being embedded in the decoration logic.

Signed-off-by: Derrick Stolee <derrickstolee@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Derrick Stolee 2022-08-05 17:58:38 +00:00 коммит произвёл Junio C Hamano
Родитель 97e61e0f9c
Коммит 94d421b8af
1 изменённых файлов: 16 добавлений и 10 удалений

Просмотреть файл

@ -137,6 +137,7 @@ static int ref_filter_match(const char *refname,
static int add_ref_decoration(const char *refname, const struct object_id *oid,
int flags, void *cb_data)
{
int i;
struct object *obj;
enum object_type objtype;
enum decoration_type deco_type = DECORATION_NONE;
@ -166,16 +167,21 @@ static int add_ref_decoration(const char *refname, const struct object_id *oid,
return 0;
obj = lookup_object_by_type(the_repository, oid, objtype);
if (starts_with(refname, "refs/heads/"))
deco_type = DECORATION_REF_LOCAL;
else if (starts_with(refname, "refs/remotes/"))
deco_type = DECORATION_REF_REMOTE;
else if (starts_with(refname, "refs/tags/"))
deco_type = DECORATION_REF_TAG;
else if (!strcmp(refname, "refs/stash"))
deco_type = DECORATION_REF_STASH;
else if (!strcmp(refname, "HEAD"))
deco_type = DECORATION_REF_HEAD;
for (i = 0; i < ARRAY_SIZE(ref_namespace); i++) {
struct ref_namespace_info *info = &ref_namespace[i];
if (!info->decoration)
continue;
if (info->exact) {
if (!strcmp(refname, info->ref)) {
deco_type = info->decoration;
break;
}
} else if (starts_with(refname, info->ref)) {
deco_type = info->decoration;
break;
}
}
add_name_decoration(deco_type, refname, obj);
while (obj->type == OBJ_TAG) {