ref-filter: add check for negative file size
[gitweb.git] / ref-filter.c
index 0c45ed9d94a4bd4bfab6c9d441ca9bc7de7ebf31..6753c45660dfc8379f75374b57df05ea29f84904 100644 (file)
@@ -231,12 +231,18 @@ static int objecttype_atom_parser(const struct ref_format *format, struct used_a
 static int objectsize_atom_parser(const struct ref_format *format, struct used_atom *atom,
                                  const char *arg, struct strbuf *err)
 {
-       if (arg)
-               return strbuf_addf_ret(err, -1, _("%%(objectsize) does not take arguments"));
-       if (*atom->name == '*')
-               oi_deref.info.sizep = &oi_deref.size;
-       else
-               oi.info.sizep = &oi.size;
+       if (!arg) {
+               if (*atom->name == '*')
+                       oi_deref.info.sizep = &oi_deref.size;
+               else
+                       oi.info.sizep = &oi.size;
+       } else if (!strcmp(arg, "disk")) {
+               if (*atom->name == '*')
+                       oi_deref.info.disk_sizep = &oi_deref.disk_size;
+               else
+                       oi.info.disk_sizep = &oi.disk_size;
+       } else
+               return strbuf_addf_ret(err, -1, _("unrecognized %%(objectsize) argument: %s"), arg);
        return 0;
 }
 
@@ -876,7 +882,10 @@ 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")) {
+               else if (!strcmp(name, "objectsize:disk")) {
+                       v->value = oi->disk_size;
+                       v->s = xstrfmt("%"PRIuMAX, (intmax_t)oi->disk_size);
+               } else if (!strcmp(name, "objectsize")) {
                        v->value = oi->size;
                        v->s = xstrfmt("%lu", oi->size);
                }
@@ -1478,6 +1487,8 @@ static int get_object(struct ref_array_item *ref, int deref, struct object **obj
                                     OBJECT_INFO_LOOKUP_REPLACE))
                return strbuf_addf_ret(err, -1, _("missing object %s for %s"),
                                       oid_to_hex(&oi->oid), ref->refname);
+       if (oi->info.disk_sizep && oi->disk_size < 0)
+               BUG("Object size is less than zero.");
 
        if (oi->info.contentp) {
                *obj = parse_object_buffer(the_repository, &oi->oid, oi->type, oi->size, oi->content, &eaten);