]> git.ipfire.org Git - thirdparty/git.git/commitdiff
ref-filter: add objectsize to used_atom
authorZheNing Hu <adlternative@gmail.com>
Thu, 13 May 2021 15:15:37 +0000 (15:15 +0000)
committerJunio C Hamano <gitster@pobox.com>
Thu, 13 May 2021 21:37:27 +0000 (06:37 +0900)
When the support for "objectsize:disk" was bolted onto the
existing support for "objectsize", it didn't follow the
usual pattern for handling "atomtype:modifier", which reads
the <modifier> part just once while parsing the format
string, and store the parsed result in the union in the
used_atom structure, so that the string form of it does not
have to be parsed over and over at runtime (e.g. in
grab_common_values()).

Add a new member `objectsize` to the union `used_atom.u`,
so that we can separate the check of <modifier> from the
check of <atomtype>, this will bring scalability to atom
`%(objectsize)`.

Signed-off-by: ZheNing Hu <adlternative@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
ref-filter.c

index e2eac50d9508ee6ea26d433e735774d48850aa83..8cb622b95db2a27629131da8ae308b2fcf493895 100644 (file)
@@ -146,6 +146,9 @@ static struct used_atom {
                        enum { O_FULL, O_LENGTH, O_SHORT } option;
                        unsigned int length;
                } oid;
+               struct {
+                       enum { O_SIZE, O_SIZE_DISK } option;
+               } objectsize;
                struct email_option {
                        enum { EO_RAW, EO_TRIM, EO_LOCALPART } option;
                } email_option;
@@ -269,11 +272,13 @@ static int objectsize_atom_parser(const struct ref_format *format, struct used_a
                                  const char *arg, struct strbuf *err)
 {
        if (!arg) {
+               atom->u.objectsize.option = O_SIZE;
                if (*atom->name == '*')
                        oi_deref.info.sizep = &oi_deref.size;
                else
                        oi.info.sizep = &oi.size;
        } else if (!strcmp(arg, "disk")) {
+               atom->u.objectsize.option = O_SIZE_DISK;
                if (*atom->name == '*')
                        oi_deref.info.disk_sizep = &oi_deref.disk_size;
                else
@@ -967,12 +972,14 @@ static void grab_common_values(struct atom_value *val, int deref, struct expand_
                        name++;
                if (!strcmp(name, "objecttype"))
                        v->s = xstrdup(type_name(oi->type));
-               else if (!strcmp(name, "objectsize:disk")) {
-                       v->value = oi->disk_size;
-                       v->s = xstrfmt("%"PRIuMAX, (uintmax_t)oi->disk_size);
-               } else if (!strcmp(name, "objectsize")) {
-                       v->value = oi->size;
-                       v->s = xstrfmt("%"PRIuMAX , (uintmax_t)oi->size);
+               else if (starts_with(name, "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);
+                       } else if (used_atom[i].u.objectsize.option == O_SIZE) {
+                               v->value = oi->size;
+                               v->s = xstrfmt("%"PRIuMAX , (uintmax_t)oi->size);
+                       }
                } else if (!strcmp(name, "deltabase"))
                        v->s = xstrdup(oid_to_hex(&oi->delta_base_oid));
                else if (deref)