From: Junio C Hamano Date: Fri, 17 Aug 2018 20:09:57 +0000 (-0700) Subject: Merge branch 'ot/ref-filter-object-info' X-Git-Tag: v2.19.0-rc0~46 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/c83149ace6cd78cdd9b29b1ec4f0e0cb87558687?hp=--cc Merge branch 'ot/ref-filter-object-info' A few atoms like %(objecttype) and %(objectsize) in the format specifier of "for-each-ref --format=" can be filled without getting the full contents of the object, but just with the object header. These cases have been optimized by calling oid_object_info() API (instead of reading and inspecting the data). * ot/ref-filter-object-info: ref-filter: use oid_object_info() to get object ref-filter: merge get_obj and get_object ref-filter: initialize eaten variable ref-filter: fill empty fields with empty values ref-filter: add info_source to valid_atom --- c83149ace6cd78cdd9b29b1ec4f0e0cb87558687 diff --cc ref-filter.c index a8def7b3a3,112955f006..0bccfceff2 --- a/ref-filter.c +++ b/ref-filter.c @@@ -1435,24 -1458,36 +1460,36 @@@ static const char *get_refname(struct u return show_ref(&atom->u.refname, ref->refname); } - static int get_object(struct ref_array_item *ref, const struct object_id *oid, - int deref, struct object **obj, struct strbuf *err) + static int get_object(struct ref_array_item *ref, int deref, struct object **obj, + struct expand_data *oi, struct strbuf *err) { - int eaten; - int ret = 0; - unsigned long size; - void *buf = get_obj(oid, obj, &size, &eaten); - if (!buf) - ret = strbuf_addf_ret(err, -1, _("missing object %s for %s"), - oid_to_hex(oid), ref->refname); - else if (!*obj) - ret = strbuf_addf_ret(err, -1, _("parse_object_buffer failed on %s for %s"), - oid_to_hex(oid), ref->refname); - else - grab_values(ref->value, deref, *obj, buf, size); + /* parse_object_buffer() will set eaten to 0 if free() will be needed */ + int eaten = 1; + if (oi->info.contentp) { + /* We need to know that to use parse_object_buffer properly */ + oi->info.sizep = &oi->size; + oi->info.typep = &oi->type; + } + if (oid_object_info_extended(the_repository, &oi->oid, &oi->info, + 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.contentp) { - *obj = parse_object_buffer(&oi->oid, oi->type, oi->size, oi->content, &eaten); ++ *obj = parse_object_buffer(the_repository, &oi->oid, oi->type, oi->size, oi->content, &eaten); + if (!obj) { + if (!eaten) + free(oi->content); + return strbuf_addf_ret(err, -1, _("parse_object_buffer failed on %s for %s"), + oid_to_hex(&oi->oid), ref->refname); + } + grab_values(ref->value, deref, *obj, oi->content, oi->size); + } + + grab_common_values(ref->value, deref, oi); if (!eaten) - free(buf); - return ret; + free(oi->content); + return 0; } /*