Jeff King <p...@peff.net> writes:
> On Tue, Mar 19, 2013 at 11:52:44AM -0400, Jeff King wrote:
>> > > > Commit 38a4556 (index-pack: start learning to emulate
>> > > > "verify-pack -v", 2011-06-03) added a "delta_depth" counter
>> > > > to each "struct object_entry". Initially, all object entries
>> > > > have their depth set to 0; in resolve_delta, we then set the
>> > > > depth of each delta to "base + 1". Base entries never have
>> > > > their depth touched, and remain at 0.
>> > >
>> > > This patch causes index-pack to fail on the pack that triggered the
>> > > whole discussion. More in a minute in another side thread, but
>> > > meanwhile: NAK until we understand what is really going on here.
>> > Odd; that's what I was testing with, and it worked fine.
>> Ah, interesting. I built the fix on top of d1a0ed1, the first commit
>> that shows the problem. And it works fine there. But when it is
>> forward-ported to the current master, it breaks as you saw.
>> More bisection fun.
> So after bisecting, I realize that it is indeed broken on top of
> d1a0ed1. I have no idea why I didn't notice that before; I'm guessing it
> was because I was running it under valgrind and paying attention only to
> valgrind errors.
> Anyway, the problem is simple and stupid. The original object array is
> not nr_objects item long; it is (nr_objects + 1) long, though I'm not
> clear why (1-indexing?).
It apparently relates to the use of .idx.offset to compute the "next"
offset, cf. append_obj_to_pack():
struct object_entry *obj = &objects[nr_objects++];
obj.idx.offset = obj.idx.offset + n;
obj.idx.offset += write_compressed(f, buf, size);
So you trashed the offset of the first object after all the objects that
are actually *in* the patch.
And with that: ACK.
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html