packed_object_info(): use object_id internally for delta base

The previous commit changed the public interface of packed_object_info()
to return a struct object_id rather than a bare hash. That enables us to
convert our internal helper, as well. We can use nth_packed_object_id()
directly for OFS_DELTA, but we'll still have to use oidread() to pull
the hash for a REF_DELTA out of the packfile.

There should be no additional cost, since we're copying directly into
the object_id the caller provided us (just as we did before; it's just
happening now via nth_packed_object_id()).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King 2020-02-23 23:37:31 -05:00 committed by Junio C Hamano
parent b99b6bcc57
commit 6ac9760a30

View File

@ -1225,30 +1225,32 @@ off_t get_delta_base(struct packed_git *p,
* the final object lookup), but more expensive for OFS deltas (we * the final object lookup), but more expensive for OFS deltas (we
* have to load the revidx to convert the offset back into a sha1). * have to load the revidx to convert the offset back into a sha1).
*/ */
static const unsigned char *get_delta_base_sha1(struct packed_git *p, static int get_delta_base_oid(struct packed_git *p,
struct pack_window **w_curs, struct pack_window **w_curs,
off_t curpos, off_t curpos,
enum object_type type, struct object_id *oid,
off_t delta_obj_offset) enum object_type type,
off_t delta_obj_offset)
{ {
if (type == OBJ_REF_DELTA) { if (type == OBJ_REF_DELTA) {
unsigned char *base = use_pack(p, w_curs, curpos, NULL); unsigned char *base = use_pack(p, w_curs, curpos, NULL);
return base; oidread(oid, base);
return 0;
} else if (type == OBJ_OFS_DELTA) { } else if (type == OBJ_OFS_DELTA) {
struct revindex_entry *revidx; struct revindex_entry *revidx;
off_t base_offset = get_delta_base(p, w_curs, &curpos, off_t base_offset = get_delta_base(p, w_curs, &curpos,
type, delta_obj_offset); type, delta_obj_offset);
if (!base_offset) if (!base_offset)
return NULL; return -1;
revidx = find_pack_revindex(p, base_offset); revidx = find_pack_revindex(p, base_offset);
if (!revidx) if (!revidx)
return NULL; return -1;
return nth_packed_object_sha1(p, revidx->nr); return nth_packed_object_id(oid, p, revidx->nr);
} else } else
return NULL; return -1;
} }
static int retry_bad_packed_offset(struct repository *r, static int retry_bad_packed_offset(struct repository *r,
@ -1558,16 +1560,12 @@ int packed_object_info(struct repository *r, struct packed_git *p,
if (oi->delta_base_oid) { if (oi->delta_base_oid) {
if (type == OBJ_OFS_DELTA || type == OBJ_REF_DELTA) { if (type == OBJ_OFS_DELTA || type == OBJ_REF_DELTA) {
const unsigned char *base; if (get_delta_base_oid(p, &w_curs, curpos,
oi->delta_base_oid,
base = get_delta_base_sha1(p, &w_curs, curpos, type, obj_offset) < 0) {
type, obj_offset);
if (!base) {
type = OBJ_BAD; type = OBJ_BAD;
goto out; goto out;
} }
hashcpy(oi->delta_base_oid->hash, base);
} else } else
oidclr(oi->delta_base_oid); oidclr(oi->delta_base_oid);
} }