sha1_file: move delta base cache code up
In a subsequent patch, packed_object_info() will be modified to use the delta base cache, so move the relevant code to before packed_object_info(). Signed-off-by: Jonathan Tan <jonathantanmy@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jonathan Tan committed
Jun 21, 2017 at 17:40 UTC
845b102b9951949a2413b3e6d425d9fb4424ff9e
1 file changed
+110
-110
sha1_file.c
+110
-110
@@ -2239,116 +2239,6 @@ unwind:
2239
goto out;
2240
}
2241
2242
-int packed_object_info(struct packed_git *p, off_t obj_offset,
2243
- struct object_info *oi)
2244
-{
2245
- struct pack_window *w_curs = NULL;
2246
- unsigned long size;
2247
- off_t curpos = obj_offset;
2248
- enum object_type type;
2249
-
2250
- /*
2251
- * We always get the representation type, but only convert it to
2252
- * a "real" type later if the caller is interested.
2253
- */
2254
- type = unpack_object_header(p, &w_curs, &curpos, &size);
2255
-
2256
- if (oi->sizep) {
2257
- if (type == OBJ_OFS_DELTA || type == OBJ_REF_DELTA) {
2258
- off_t tmp_pos = curpos;
2259
- off_t base_offset = get_delta_base(p, &w_curs, &tmp_pos,
2260
- type, obj_offset);
2261
- if (!base_offset) {
2262
- type = OBJ_BAD;
2263
- goto out;
2264
- }
2265
- *oi->sizep = get_size_from_delta(p, &w_curs, tmp_pos);
2266
- if (*oi->sizep == 0) {
2267
- type = OBJ_BAD;
2268
- goto out;
2269
- }
2270
- } else {
2271
- *oi->sizep = size;
2272
- }
2273
- }
2274
-
2275
- if (oi->disk_sizep) {
2276
- struct revindex_entry *revidx = find_pack_revindex(p, obj_offset);
2277
- *oi->disk_sizep = revidx[1].offset - obj_offset;
2278
- }
2279
-
2280
- if (oi->typep || oi->typename) {
2281
- enum object_type ptot;
2282
- ptot = packed_to_object_type(p, obj_offset, type, &w_curs,
2283
- curpos);
2284
- if (oi->typep)
2285
- *oi->typep = ptot;
2286
- if (oi->typename) {
2287
- const char *tn = typename(ptot);
2288
- if (tn)
2289
- strbuf_addstr(oi->typename, tn);
2290
- }
2291
- if (ptot < 0) {
2292
- type = OBJ_BAD;
2293
- goto out;
2294
- }
2295
- }
2296
-
2297
- if (oi->delta_base_sha1) {
2298
- if (type == OBJ_OFS_DELTA || type == OBJ_REF_DELTA) {
2299
- const unsigned char *base;
2300
-
2301
- base = get_delta_base_sha1(p, &w_curs, curpos,
2302
- type, obj_offset);
2303
- if (!base) {
2304
- type = OBJ_BAD;
2305
- goto out;
2306
- }
2307
-
2308
- hashcpy(oi->delta_base_sha1, base);
2309
- } else
2310
- hashclr(oi->delta_base_sha1);
2311
- }
2312
-
2313
-out:
2314
- unuse_pack(&w_curs);
2315
- return type;
2316
-}
2317
-
2318
-static void *unpack_compressed_entry(struct packed_git *p,
2319
- struct pack_window **w_curs,
2320
- off_t curpos,
2321
- unsigned long size)
2322
-{
2323
- int st;
2324
- git_zstream stream;
2325
- unsigned char *buffer, *in;
2326
-
2327
- buffer = xmallocz_gently(size);
2328
- if (!buffer)
2329
- return NULL;
2330
- memset(&stream, 0, sizeof(stream));
2331
- stream.next_out = buffer;
2332
- stream.avail_out = size + 1;
2333
-
2334
- git_inflate_init(&stream);
2335
- do {
2336
- in = use_pack(p, w_curs, curpos, &stream.avail_in);
2337
- stream.next_in = in;
2338
- st = git_inflate(&stream, Z_FINISH);
2339
- if (!stream.avail_out)
2340
- break; /* the payload is larger than it should be */
2341
- curpos += stream.next_in - in;
2342
- } while (st == Z_OK || st == Z_BUF_ERROR);
2343
- git_inflate_end(&stream);
2344
- if ((st != Z_STREAM_END) || stream.total_out != size) {
2345
- free(buffer);
2346
- return NULL;
2347
- }
2348
-
2349
- return buffer;
2350
-}
2351
-
2242
static struct hashmap delta_base_cache;
2243
static size_t delta_base_cached;
2244
@@ -2486,6 +2376,116 @@ static void add_delta_base_cache(struct packed_git *p, off_t base_offset,
2376
hashmap_add(&delta_base_cache, ent);
2377
}
2378
2379
+int packed_object_info(struct packed_git *p, off_t obj_offset,
2380
+ struct object_info *oi)
2381
+{
2382
+ struct pack_window *w_curs = NULL;
2383
+ unsigned long size;
2384
+ off_t curpos = obj_offset;
2385
+ enum object_type type;
2386
+
2387
+ /*
2388
+ * We always get the representation type, but only convert it to
2389
+ * a "real" type later if the caller is interested.
2390
+ */
2391
+ type = unpack_object_header(p, &w_curs, &curpos, &size);
2392
+
2393
+ if (oi->sizep) {
2394
+ if (type == OBJ_OFS_DELTA || type == OBJ_REF_DELTA) {
2395
+ off_t tmp_pos = curpos;
2396
+ off_t base_offset = get_delta_base(p, &w_curs, &tmp_pos,
2397
+ type, obj_offset);
2398
+ if (!base_offset) {
2399
+ type = OBJ_BAD;
2400
+ goto out;
2401
+ }
2402
+ *oi->sizep = get_size_from_delta(p, &w_curs, tmp_pos);
2403
+ if (*oi->sizep == 0) {
2404
+ type = OBJ_BAD;
2405
+ goto out;
2406
+ }
2407
+ } else {
2408
+ *oi->sizep = size;
2409
+ }
2410
+ }
2411
+
2412
+ if (oi->disk_sizep) {
2413
+ struct revindex_entry *revidx = find_pack_revindex(p, obj_offset);
2414
+ *oi->disk_sizep = revidx[1].offset - obj_offset;
2415
+ }
2416
+
2417
+ if (oi->typep || oi->typename) {
2418
+ enum object_type ptot;
2419
+ ptot = packed_to_object_type(p, obj_offset, type, &w_curs,
2420
+ curpos);
2421
+ if (oi->typep)
2422
+ *oi->typep = ptot;
2423
+ if (oi->typename) {
2424
+ const char *tn = typename(ptot);
2425
+ if (tn)
2426
+ strbuf_addstr(oi->typename, tn);
2427
+ }
2428
+ if (ptot < 0) {
2429
+ type = OBJ_BAD;
2430
+ goto out;
2431
+ }
2432
+ }
2433
+
2434
+ if (oi->delta_base_sha1) {
2435
+ if (type == OBJ_OFS_DELTA || type == OBJ_REF_DELTA) {
2436
+ const unsigned char *base;
2437
+
2438
+ base = get_delta_base_sha1(p, &w_curs, curpos,
2439
+ type, obj_offset);
2440
+ if (!base) {
2441
+ type = OBJ_BAD;
2442
+ goto out;
2443
+ }
2444
+
2445
+ hashcpy(oi->delta_base_sha1, base);
2446
+ } else
2447
+ hashclr(oi->delta_base_sha1);
2448
+ }
2449
+
2450
+out:
2451
+ unuse_pack(&w_curs);
2452
+ return type;
2453
+}
2454
+
2455
+static void *unpack_compressed_entry(struct packed_git *p,
2456
+ struct pack_window **w_curs,
2457
+ off_t curpos,
2458
+ unsigned long size)
2459
+{
2460
+ int st;
2461
+ git_zstream stream;
2462
+ unsigned char *buffer, *in;
2463
+
2464
+ buffer = xmallocz_gently(size);
2465
+ if (!buffer)
2466
+ return NULL;
2467
+ memset(&stream, 0, sizeof(stream));
2468
+ stream.next_out = buffer;
2469
+ stream.avail_out = size + 1;
2470
+
2471
+ git_inflate_init(&stream);
2472
+ do {
2473
+ in = use_pack(p, w_curs, curpos, &stream.avail_in);
2474
+ stream.next_in = in;
2475
+ st = git_inflate(&stream, Z_FINISH);
2476
+ if (!stream.avail_out)
2477
+ break; /* the payload is larger than it should be */
2478
+ curpos += stream.next_in - in;
2479
+ } while (st == Z_OK || st == Z_BUF_ERROR);
2480
+ git_inflate_end(&stream);
2481
+ if ((st != Z_STREAM_END) || stream.total_out != size) {
2482
+ free(buffer);
2483
+ return NULL;
2484
+ }
2485
+
2486
+ return buffer;
2487
+}
2488
+
2489
static void *read_object(const unsigned char *sha1, enum object_type *type,
2490
unsigned long *size);
2491