close_istream_fn close;
read_istream_fn read;
+ enum object_type type;
unsigned long size; /* inflated size of full object */
git_zstream z;
enum { z_unused, z_used, z_done, z_error } z_state;
fs->o_end = fs->o_ptr = 0;
fs->input_finished = 0;
ifs->size = -1; /* unknown */
+ ifs->type = st->type;
return ifs;
}
}
static int open_istream_loose(struct odb_read_stream *st, struct repository *r,
- const struct object_id *oid,
- enum object_type *type)
+ const struct object_id *oid)
{
struct object_info oi = OBJECT_INFO_INIT;
struct odb_source *source;
oi.sizep = &st->size;
- oi.typep = type;
+ oi.typep = &st->type;
odb_prepare_alternates(r->objects);
for (source = r->objects->sources; source; source = source->next) {
case ULHR_TOO_LONG:
goto error;
}
- if (parse_loose_header(st->u.loose.hdr, &oi) < 0 || *type < 0)
+ if (parse_loose_header(st->u.loose.hdr, &oi) < 0 || st->type < 0)
goto error;
st->u.loose.hdr_used = strlen(st->u.loose.hdr) + 1;
static int open_istream_pack_non_delta(struct odb_read_stream *st,
struct repository *r UNUSED,
- const struct object_id *oid UNUSED,
- enum object_type *type UNUSED)
+ const struct object_id *oid UNUSED)
{
struct pack_window *window;
enum object_type in_pack_type;
case OBJ_TAG:
break;
}
+ st->type = in_pack_type;
st->z_state = z_unused;
st->close = close_istream_pack_non_delta;
st->read = read_istream_pack_non_delta;
}
static int open_istream_incore(struct odb_read_stream *st, struct repository *r,
- const struct object_id *oid, enum object_type *type)
+ const struct object_id *oid)
{
struct object_info oi = OBJECT_INFO_INIT;
st->close = close_istream_incore;
st->read = read_istream_incore;
- oi.typep = type;
+ oi.typep = &st->type;
oi.sizep = &st->size;
oi.contentp = (void **)&st->u.incore.buf;
return odb_read_object_info_extended(r->objects, oid, &oi,
static int istream_source(struct odb_read_stream *st,
struct repository *r,
- const struct object_id *oid,
- enum object_type *type)
+ const struct object_id *oid)
{
unsigned long size;
int status;
struct object_info oi = OBJECT_INFO_INIT;
- oi.typep = type;
oi.sizep = &size;
status = odb_read_object_info_extended(r->objects, oid, &oi, 0);
if (status < 0)
switch (oi.whence) {
case OI_LOOSE:
- if (open_istream_loose(st, r, oid, type) < 0)
+ if (open_istream_loose(st, r, oid) < 0)
break;
return 0;
case OI_PACKED:
st->u.in_pack.pack = oi.u.packed.pack;
st->u.in_pack.pos = oi.u.packed.offset;
- if (open_istream_pack_non_delta(st, r, oid, type) < 0)
+ if (open_istream_pack_non_delta(st, r, oid) < 0)
break;
return 0;
break;
}
- return open_istream_incore(st, r, oid, type);
+ return open_istream_incore(st, r, oid);
}
/****************************************************************
{
struct odb_read_stream *st = xmalloc(sizeof(*st));
const struct object_id *real = lookup_replace_object(r, oid);
- int ret = istream_source(st, r, real, type);
+ int ret = istream_source(st, r, real);
if (ret) {
free(st);
}
*size = st->size;
+ *type = st->type;
return st;
}