Jonathan Tan <jonathantanmy@xxxxxxxxxx> writes: > @@ -2914,6 +2912,7 @@ static int sha1_loose_object_info(const unsigned char *sha1, > git_zstream stream; > char hdr[32]; > struct strbuf hdrbuf = STRBUF_INIT; > + unsigned long size_scratch; > > if (oi->delta_base_sha1) > hashclr(oi->delta_base_sha1); > @@ -2939,6 +2938,10 @@ static int sha1_loose_object_info(const unsigned char *sha1, > map = map_sha1_file(sha1, &mapsize); > if (!map) > return -1; > + > + if (!oi->sizep) > + oi->sizep = &size_scratch; > + > if (oi->disk_sizep) > *oi->disk_sizep = mapsize; > if ((flags & OBJECT_INFO_ALLOW_UNKNOWN_TYPE)) { > if (status && oi->typep) > *oi->typep = status; > + if (oi->sizep == &size_scratch) > + oi->sizep = NULL; This looked somewhat unusual but nevertheless is correct. Because of the way parse_sha1_header_extended() interacts with its callers, the usual fn(oi->sizep ? oi->sizep : &dummy) pattern does not apply to this codepath. > @@ -3077,28 +3090,15 @@ int pretend_sha1_file(void *buf, unsigned long len, enum object_type type, > static void *read_object(const unsigned char *sha1, enum object_type *type, > unsigned long *size) > { > - unsigned long mapsize; > - void *map, *buf; > - struct cached_object *co; > - > - co = find_cached_object(sha1); > - if (co) { > - *type = co->type; > - *size = co->size; > - return xmemdupz(co->buf, co->size); > - } > + struct object_info oi = OBJECT_INFO_INIT; > + void *content; > + oi.typep = type; > + oi.sizep = size; > + oi.contentp = &content; > > - buf = read_packed_sha1(sha1, type, size); > - if (buf) > - return buf; > - map = map_sha1_file(sha1, &mapsize); > - if (map) { > - buf = unpack_sha1_file(map, mapsize, type, size, sha1); > - munmap(map, mapsize); > - return buf; > - } > - reprepare_packed_git(); > - return read_packed_sha1(sha1, type, size); > + if (sha1_object_info_extended(sha1, &oi, 0)) > + return NULL; > + return content; > } Nice code reduction; it is somewhat funny to think that a function meant to gather 'object info' does so much, but we can always say the contents is part of the information about the object ;-). Same comment as the other one applies here; the definition of how an error is reported by sha1_object_info_extended() should be kept consistent with existing callers. Thanks.