Git fork

pack-revindex: factor out `midx_key_to_pack_pos()` helper

The `midx_to_pack_pos()` function implements a binary search over
objects in the MIDX between lexical and pseudo-pack order. It does this
by taking in an index into the lexical order (i.e. the same argument
you'd use for `nth_midxed_object_id()` and similar) and spits out a
position in the pseudo-pack order.

This works for all callers, since they currently all are translating
from lexical order to pseudo-pack order. But future callers may want to
translate a known (offset, pack_id) tuple into an index into the
psuedo-pack order, without knowing where that (offset, pack_id) tuple
appears in lexical order.

Prepare for implementing a function that translates between a (offset,
pack_id) tuple into an index into the psuedo-pack order by extracting a
helper function which does just that, and then reimplementing
midx_to_pack_pos() in terms of it.

Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

authored by

Taylor Blau and committed by
Junio C Hamano
e1bfe30c b1e33330

+24 -15
+24 -15
pack-revindex.c
··· 520 520 return 0; 521 521 } 522 522 523 - int midx_to_pack_pos(struct multi_pack_index *m, uint32_t at, uint32_t *pos) 523 + static int midx_key_to_pack_pos(struct multi_pack_index *m, 524 + struct midx_pack_key *key, 525 + uint32_t *pos) 524 526 { 525 - struct midx_pack_key key; 526 527 uint32_t *found; 527 528 528 - if (!m->revindex_data) 529 - BUG("midx_to_pack_pos: reverse index not yet loaded"); 530 - if (m->num_objects <= at) 531 - BUG("midx_to_pack_pos: out-of-bounds object at %"PRIu32, at); 532 - 533 - key.pack = nth_midxed_pack_int_id(m, at); 534 - key.offset = nth_midxed_offset(m, at); 535 - key.midx = m; 536 529 /* 537 530 * The preferred pack sorts first, so determine its identifier by 538 531 * looking at the first object in pseudo-pack order. ··· 542 535 * implicitly is preferred (and includes all its objects, since ties are 543 536 * broken first by pack identifier). 544 537 */ 545 - if (midx_preferred_pack(key.midx, &key.preferred_pack) < 0) 538 + if (midx_preferred_pack(key->midx, &key->preferred_pack) < 0) 546 539 return error(_("could not determine preferred pack")); 547 540 548 - 549 - found = bsearch(&key, m->revindex_data, m->num_objects, 550 - sizeof(*m->revindex_data), midx_pack_order_cmp); 541 + found = bsearch(key, m->revindex_data, m->num_objects, 542 + sizeof(*m->revindex_data), 543 + midx_pack_order_cmp); 551 544 552 545 if (!found) 553 - return error("bad offset for revindex"); 546 + return -1; 554 547 555 548 *pos = found - m->revindex_data; 556 549 return 0; 557 550 } 551 + 552 + int midx_to_pack_pos(struct multi_pack_index *m, uint32_t at, uint32_t *pos) 553 + { 554 + struct midx_pack_key key; 555 + 556 + if (!m->revindex_data) 557 + BUG("midx_to_pack_pos: reverse index not yet loaded"); 558 + if (m->num_objects <= at) 559 + BUG("midx_to_pack_pos: out-of-bounds object at %"PRIu32, at); 560 + 561 + key.pack = nth_midxed_pack_int_id(m, at); 562 + key.offset = nth_midxed_offset(m, at); 563 + key.midx = m; 564 + 565 + return midx_key_to_pack_pos(m, &key, pos); 566 + }