commit 35c737652c512af7df226e47cd871f42f1390820 from: Stefan Sperling date: Sun Sep 09 14:14:11 2018 UTC make open_packed_object() expect a pack instead of a repo commit - a98c62b1252a198ab3ea7c779687a84cd9fed1c9 commit + 35c737652c512af7df226e47cd871f42f1390820 blob - 9ca9a73a4daf579ca4592983a2c42647172d87a0 blob + 20a09ecc2a52c54c526be4a47c82245cdab89902 --- lib/pack.c +++ lib/pack.c @@ -1146,13 +1146,11 @@ done: } static const struct got_error * -open_packed_object(struct got_object **obj, struct got_repository *repo, +open_packed_object(struct got_object **obj, struct got_pack *pack, struct got_packidx *packidx, int idx, struct got_object_id *id) { const struct got_error *err = NULL; off_t offset; - char *path_packfile; - struct got_pack *pack; uint8_t type; uint64_t size; size_t tslen; @@ -1163,42 +1161,28 @@ open_packed_object(struct got_object **obj, struct got if (offset == (uint64_t)-1) return got_error(GOT_ERR_BAD_PACKIDX); - err = get_packfile_path(&path_packfile, packidx); - if (err) - return err; - - pack = get_cached_pack(path_packfile, repo); - if (pack == NULL) { - err = cache_pack(&pack, path_packfile, packidx, repo); - if (err) - goto done; - } - err = parse_object_type_and_size(&type, &size, &tslen, pack, offset); if (err) - goto done; + return err; switch (type) { case GOT_OBJ_TYPE_COMMIT: case GOT_OBJ_TYPE_TREE: case GOT_OBJ_TYPE_BLOB: case GOT_OBJ_TYPE_TAG: - err = open_plain_object(obj, path_packfile, id, type, + err = open_plain_object(obj, pack->path_packfile, id, type, offset + tslen, size); break; - case GOT_OBJ_TYPE_OFFSET_DELTA: case GOT_OBJ_TYPE_REF_DELTA: err = open_delta_object(obj, packidx, pack, id, offset, tslen, type, size); break; - default: err = got_error(GOT_ERR_OBJ_TYPE); - goto done; + break; } -done: - free(path_packfile); + return err; } @@ -1208,17 +1192,32 @@ got_packfile_open_object(struct got_object **obj, stru { const struct got_error *err = NULL; struct got_packidx *packidx = NULL; + struct got_pack *pack; int idx; + char *path_packfile; err = search_packidx(&packidx, &idx, repo, id); if (err) return err; - err = open_packed_object(obj, repo, packidx, idx, id); + err = get_packfile_path(&path_packfile, packidx); if (err) return err; + pack = get_cached_pack(path_packfile, repo); + if (pack == NULL) { + err = cache_pack(&pack, path_packfile, packidx, repo); + if (err) + goto done; + } + + err = open_packed_object(obj, pack, packidx, idx, id); + if (err) + goto done; + err = cache_pack(NULL, (*obj)->path_packfile, packidx, repo); +done: + free(path_packfile); return err; }