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