Re: [PATCH v3 2/2] [GSOC] ref-filter: introduce enum atom_type
- From
Junio C Hamano <gitster@pobox.com>
- Date
- May 12, 2021, 23:21 UTC
- Message-ID
- <xmqqk0o3edxw.fsf@gitster.g>
- In-Reply-To
- <43400cac58e74a2acab15ace929481a9efb7978f.1620821464.git.gitgitgadget@gmail.com>
"ZheNing Hu via GitGitGadget" <gitgitgadget@gmail.com> writes:
> +/* > + * The enum atom_type is used as the coordinates of valid_atom entry.
Usually we do not say "coordinates" when we talk about X of an array element A[X]. "... used as an index in the valid_atom[] array." perhaps.
> + * In the atom parsing stage, it will be passed to used_atom.atom_type > + * as the identifier of the atom type. We can judge the type of used_atom
You seem to like the verb "judge" (it was also seen in the proposed log message for 1/2) and tend to overuse it when we use other verbs; in this particular case, probably the right verb is to "check".
Show 16 quoted lines
> + * entry by `if (used_atom[i].atom_type == ATOM_*)`.
> + */
> +enum atom_type {
> + ATOM_REFNAME,
> +...
> + ATOM_ELSE,
> +};
> +
> @@ -119,6 +169,7 @@ static struct ref_to_worktree_map {
> * array.
> */
> static struct used_atom {
> + enum atom_type atom_type;
> const char *name;
> cmp_type type;
> info_source source;OK.
Show 10 quoted lines
> @@ -506,47 +557,47 @@ static struct {
> int (*parser)(const struct ref_format *format, struct used_atom *atom,
> const char *arg, struct strbuf *err);
> } valid_atom[] = {
> - { "refname", SOURCE_NONE, FIELD_STR, refname_atom_parser },
> ...
> - { "else", SOURCE_NONE },
> + [ATOM_REFNAME] = { "refname", SOURCE_NONE, FIELD_STR, refname_atom_parser },
> ...
> + [ATOM_ELSE] = { "else", SOURCE_NONE },Makes sense.
Show 5 quoted lines
> @@ -628,6 +679,7 @@ static int parse_ref_filter_atom(const struct ref_format *format, > at = used_atom_cnt; > used_atom_cnt++; > REALLOC_ARRAY(used_atom, used_atom_cnt); > + used_atom[at].atom_type = i;
Makes sense.
Show 12 quoted lines
> used_atom[at].name = xmemdupz(atom, ep - atom); > used_atom[at].type = valid_atom[i].cmp_type; > used_atom[at].source = valid_atom[i].source; > @@ -652,7 +704,7 @@ static int parse_ref_filter_atom(const struct ref_format *format, > return -1; > if (*atom == '*') > need_tagged = 1; > - if (!strcmp(valid_atom[i].name, "symref")) > + if (i == ATOM_SYMREF) > need_symref = 1; > return at; > }
Nice.
Show 18 quoted lines
> @@ -965,14 +1017,15 @@ static void grab_common_values(struct atom_value *val, int deref, struct expand_
>
> for (i = 0; i < used_atom_cnt; i++) {
> const char *name = used_atom[i].name;
> + enum atom_type atom_type = used_atom[i].atom_type;
> struct atom_value *v = &val[i];
> if (!!deref != (*name == '*'))
> continue;
> if (deref)
> name++;
> - if (!strcmp(name, "objecttype"))
> + if (atom_type == ATOM_OBJECTTYPE)
> v->s = xstrdup(type_name(oi->type));
> - else if (starts_with(name, "objectsize")) {
> + else if (atom_type == ATOM_OBJECTSIZE) {
> if (used_atom[i].u.objectsize.option == O_SIZE_DISK) {
> v->value = oi->disk_size;
> v->s = xstrfmt("%"PRIuMAX, (uintmax_t)oi->disk_size);Replacing !strcmp() with comparison with ATOM_* like the above is the best solution for this step, but I wonder if this part (or any other part that this patch touches) would benefit from using a switch statement on atom_type. Something to think about in the future, after the dust settles.
Thanks.