{
struct for_each_object_payload *payload = _payload;
if (oi && oi->whence == OI_PACKED)
- return payload->callback(oid, oi->sourcep->u.packed.pack,
- oi->sourcep->u.packed.offset,
+ return payload->callback(oid, oi->source_infop->u.packed.pack,
+ oi->source_infop->u.packed.offset,
payload->payload);
return payload->callback(oid, NULL, 0, payload->payload);
}
&payload, flags);
}
} else {
- struct object_info_source oi_source;
+ struct odb_source_info source_info;
struct object_info oi = {
- .sourcep = &oi_source,
+ .source_infop = &source_info,
};
for (source = the_repository->objects->sources; source; source = source->next) {
oidset_iter_init(&outgoing_links, &iter);
while ((oid = oidset_iter_next(&iter))) {
- struct object_info_source info_source;
+ struct odb_source_info source_info;
struct object_info info = {
- .sourcep = &info_source,
+ .source_infop = &source_info,
};
if (odb_read_object_info_extended(the_repository->objects, oid, &info, 0))
/* Missing; assume it is a promisor object */
continue;
- if (info.whence == OI_PACKED && info_source.u.packed.pack->pack_promisor)
+ if (info.whence == OI_PACKED && source_info.u.packed.pack->pack_promisor)
continue;
if (!cmd.args.nr) {
void *data UNUSED)
{
if (cruft) {
- add_cruft_object_entry(oid, OBJ_NONE, oi->sourcep->u.packed.pack,
- oi->sourcep->u.packed.offset, NULL,
+ add_cruft_object_entry(oid, OBJ_NONE, oi->source_infop->u.packed.pack,
+ oi->source_infop->u.packed.offset, NULL,
*oi->mtimep);
} else {
add_object_entry(oid, OBJ_NONE, "", 0);
ODB_FOR_EACH_OBJECT_SKIP_IN_CORE_KEPT_PACKS |
ODB_FOR_EACH_OBJECT_SKIP_ON_DISK_KEPT_PACKS,
};
- struct object_info_source oi_source;
+ struct odb_source_info source_info;
struct object_info oi = {
.mtimep = &mtime,
- .sourcep = &oi_source,
+ .source_infop = &source_info,
};
odb_prepare_alternates(to_pack.repo->objects);
static int is_not_in_promisor_pack_obj(struct object *obj, void *data UNUSED)
{
- struct object_info_source info_source;
+ struct odb_source_info source_info;
struct object_info info = {
- .sourcep = &info_source,
+ .source_infop = &source_info,
};
if (odb_read_object_info_extended(the_repository->objects, &obj->oid, &info, 0))
BUG("should_include_obj should only be called on existing objects");
- return info.whence != OI_PACKED || !info_source.u.packed.pack->pack_promisor;
+ return info.whence != OI_PACKED || !source_info.u.packed.pack->pack_promisor;
}
static int is_not_in_promisor_pack(struct commit *commit, void *data) {
}
}
input_oi->whence = new_oi.whence;
- if (input_oi->sourcep)
- *input_oi->sourcep = *new_oi.sourcep;
+ if (input_oi->source_infop)
+ *input_oi->source_infop = *new_oi.source_infop;
return ret;
}
struct object_id *oid);
/*
- * Object information that can be used to uniquely identify an object and learn
- * more about how exactly it is stored.
+ * Object database source information that can be used to uniquely identify an
+ * object and learn more about how exactly it is stored.
*/
-struct object_info_source {
+struct odb_source_info {
+ /* The source that this object has been looked up from. */
+ struct odb_source *source;
+
/*
* Backend-specific information about the specific object. This can be
* used for example to uniquely identify a given object in case it
* object lookups in case the same object exists in multiple sources,
* or multiple times in the same source.
*/
- struct object_info_source *sourcep;
+ struct odb_source_info *source_infop;
/* Response */
enum {
*oi->contentp = xmemdupz(object->buf, object->size);
if (oi->mtimep)
*oi->mtimep = 0;
+ if (oi->source_infop)
+ oi->source_infop->source = &source->base;
+
oi->whence = OI_CACHED;
}
oi->typep = NULL;
if (oi->delta_base_oid)
oidclr(oi->delta_base_oid, loose->base.odb->repo->hash_algo);
+ if (oi->source_infop && !ret)
+ oi->source_infop->source = &loose->base;
if (!ret)
oi->whence = OI_LOOSE;
}
hashmap_add(&delta_base_cache, &ent->ent);
}
-int packed_object_info_with_index_pos(struct odb_source_packed *source UNUSED,
+int packed_object_info_with_index_pos(struct odb_source_packed *source,
struct packed_git *p, off_t obj_offset,
uint32_t *maybe_index_pos, struct object_info *oi)
{
oi->whence = OI_PACKED;
- if (oi->sourcep) {
- oi->sourcep->u.packed.offset = obj_offset;
- oi->sourcep->u.packed.pack = p;
+ if (oi->source_infop) {
+ if (!source)
+ BUG("cannot request source without an owning source");
+ oi->source_infop->source = &source->base;
+
+ oi->source_infop->u.packed.offset = obj_offset;
+ oi->source_infop->u.packed.pack = p;
switch (type) {
case OBJ_NONE:
- oi->sourcep->u.packed.type = PACKED_OBJECT_TYPE_UNKNOWN;
+ oi->source_infop->u.packed.type = PACKED_OBJECT_TYPE_UNKNOWN;
break;
case OBJ_REF_DELTA:
- oi->sourcep->u.packed.type = PACKED_OBJECT_TYPE_REF_DELTA;
+ oi->source_infop->u.packed.type = PACKED_OBJECT_TYPE_REF_DELTA;
break;
case OBJ_OFS_DELTA:
- oi->sourcep->u.packed.type = PACKED_OBJECT_TYPE_OFS_DELTA;
+ oi->source_infop->u.packed.type = PACKED_OBJECT_TYPE_OFS_DELTA;
break;
default:
- oi->sourcep->u.packed.type = PACKED_OBJECT_TYPE_FULL;
+ oi->source_infop->u.packed.type = PACKED_OBJECT_TYPE_FULL;
break;
}
}
add_pending_object(data->revs, obj, "");
if (data->cb) {
if (oi->whence == OI_PACKED)
- data->cb(obj, oi->sourcep->u.packed.pack,
- oi->sourcep->u.packed.offset, *oi->mtimep);
+ data->cb(obj, oi->source_infop->u.packed.pack,
+ oi->source_infop->u.packed.offset, *oi->mtimep);
else
data->cb(obj, NULL, 0, *oi->mtimep);
}
unsigned flags;
enum object_type type;
time_t mtime;
- struct object_info_source oi_source;
+ struct odb_source_info source_info;
struct object_info oi = {
.mtimep = &mtime,
.typep = &type,
- .sourcep = &oi_source,
+ .source_infop = &source_info,
};
int r;