Commit Diff


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;
 }