commit 7e212e3dbc3a87450c1a245dd3a735e05c8d3eb0 from: Stefan Sperling date: Sun Sep 09 15:24:46 2018 UTC make got_packfile_extract_object_to_mem() accept pack instead of repo commit - 2414057009d67a0aca89ca9ad97b16b14d367fc5 commit + 7e212e3dbc3a87450c1a245dd3a735e05c8d3eb0 blob - 549406dfabb371dffda19cf1c7976a64e1a4c9d6 blob + 4de7dfb978353377b576337a4fb4bea2052821a4 --- lib/got_lib_pack.h +++ lib/got_lib_pack.h @@ -165,6 +165,6 @@ const struct got_error *got_packfile_open_object(struc const struct got_error *got_packfile_extract_object(struct got_pack *, struct got_object *, FILE *); const struct got_error *got_packfile_extract_object_to_mem(uint8_t **, size_t *, - struct got_object *, struct got_repository *); + struct got_object *, struct got_pack *); const struct got_error *got_pack_get_packfile_size(size_t *, const char *); struct got_pack *got_repo_get_cached_pack(struct got_repository *, const char *); blob - a19cdc7ece99ae20df97577502b0da732fa3e59e blob + 876b0f74524ae19d1d229b5b36fdf463a0b76678 --- lib/object.c +++ lib/object.c @@ -326,7 +326,28 @@ got_object_qid_alloc(struct got_object_qid **qid, stru return NULL; } + +static const struct got_error * +extract_packed_object_to_mem(uint8_t **buf, size_t *len, + struct got_object *obj, struct got_repository *repo) +{ + const struct got_error *err = NULL; + struct got_pack *pack; + if ((obj->flags & GOT_OBJ_FLAG_PACKED) == 0) + return got_error(GOT_ERR_OBJ_NOT_PACKED); + + pack = got_repo_get_cached_pack(repo, obj->path_packfile); + if (pack == NULL) { + err = got_repo_cache_pack(&pack, repo, + obj->path_packfile, NULL); + if (err) + return err; + } + + return got_packfile_extract_object_to_mem(buf, len, obj, pack); +} + const struct got_error * got_object_commit_open(struct got_commit_object **commit, struct got_repository *repo, struct got_object *obj) @@ -345,7 +366,7 @@ got_object_commit_open(struct got_commit_object **comm if (obj->flags & GOT_OBJ_FLAG_PACKED) { uint8_t *buf; size_t len; - err = got_packfile_extract_object_to_mem(&buf, &len, obj, repo); + err = extract_packed_object_to_mem(&buf, &len, obj, repo); if (err) return err; obj->size = len; @@ -386,7 +407,7 @@ got_object_tree_open(struct got_tree_object **tree, if (obj->flags & GOT_OBJ_FLAG_PACKED) { uint8_t *buf; size_t len; - err = got_packfile_extract_object_to_mem(&buf, &len, obj, repo); + err = extract_packed_object_to_mem(&buf, &len, obj, repo); if (err) return err; obj->size = len; blob - 329d024506b82b9f8617ebc0bb30e490bf5d62a3 blob + d1d6698bbe777d1e7c5bc0da143c2b36684b5347 --- lib/pack.c +++ lib/pack.c @@ -1231,39 +1231,27 @@ got_packfile_extract_object(struct got_pack *pack, str const struct got_error * got_packfile_extract_object_to_mem(uint8_t **buf, size_t *len, - struct got_object *obj, struct got_repository *repo) + struct got_object *obj, struct got_pack *pack) { const struct got_error *err = NULL; - struct got_pack *pack; if ((obj->flags & GOT_OBJ_FLAG_PACKED) == 0) return got_error(GOT_ERR_OBJ_NOT_PACKED); - - pack = got_repo_get_cached_pack(repo, obj->path_packfile); - if (pack == NULL) { - err = got_repo_cache_pack(&pack, repo, obj->path_packfile, NULL); - if (err) - goto done; - } if ((obj->flags & GOT_OBJ_FLAG_DELTIFIED) == 0) { - if (obj->pack_offset >= pack->filesize) { - err = got_error(GOT_ERR_PACK_OFFSET); - goto done; - } + if (obj->pack_offset >= pack->filesize) + return got_error(GOT_ERR_PACK_OFFSET); if (pack->map) { size_t mapoff = (size_t)obj->pack_offset; err = got_inflate_to_mem_mmap(buf, len, pack->map, mapoff, pack->filesize - mapoff); } else { - if (lseek(pack->fd, obj->pack_offset, SEEK_SET) == -1) { - err = got_error_from_errno(); - goto done; - } + if (lseek(pack->fd, obj->pack_offset, SEEK_SET) == -1) + return got_error_from_errno(); err = got_inflate_to_mem_fd(buf, len, pack->fd); } } else err = dump_delta_chain_to_mem(buf, len, &obj->deltas, pack); -done: + return err; }