return ret ? ret : pack_errors;
}
+struct packfile_store_for_each_object_wrapper_data {
+ struct packfile_store *store;
+ struct object_info *oi;
+ odb_for_each_object_cb cb;
+ void *cb_data;
+};
+
+static int packfile_store_for_each_object_wrapper(const struct object_id *oid,
+ struct packed_git *pack,
+ uint32_t index_pos,
+ void *cb_data)
+{
+ struct packfile_store_for_each_object_wrapper_data *data = cb_data;
+
+ if (data->oi) {
+ off_t offset = nth_packed_object_offset(pack, index_pos);
+
+ if (packed_object_info(pack, offset, data->oi) < 0) {
+ mark_bad_packed_object(pack, oid);
+ return -1;
+ }
+ }
+
+ return data->cb(oid, data->oi, data->cb_data);
+}
+
+int packfile_store_for_each_object(struct packfile_store *store,
+ struct object_info *oi,
+ odb_for_each_object_cb cb,
+ void *cb_data,
+ unsigned flags)
+{
+ struct packfile_store_for_each_object_wrapper_data data = {
+ .store = store,
+ .oi = oi,
+ .cb = cb,
+ .cb_data = cb_data,
+ };
+ int pack_errors = 0, ret;
+
+ ret = packfile_store_for_each_object_internal(store, packfile_store_for_each_object_wrapper,
+ &data, flags, &pack_errors);
+ if (ret)
+ return ret;
+
+ return pack_errors ? -1 : 0;
+}
+
static int add_promisor_object(const struct object_id *oid,
struct packed_git *pack,
uint32_t pos UNUSED,
int for_each_packed_object(struct repository *repo, each_packed_object_fn cb,
void *data, unsigned flags);
+/*
+ * Iterate through all packed objects in the given packfile store and invoke
+ * the callback function for each of them. If given, the object info will be
+ * populated with the object's data as if you had called
+ * `packfile_store_read_object_info()` on the object.
+ *
+ * The flags parameter is a combination of `odb_for_each_object_flags`.
+ */
+int packfile_store_for_each_object(struct packfile_store *store,
+ struct object_info *oi,
+ odb_for_each_object_cb cb,
+ void *cb_data,
+ unsigned flags);
+
/* A hook to report invalid files in pack directory */
#define PACKDIR_FILE_PACK 1
#define PACKDIR_FILE_IDX 2