On Sat, 18 May 2019, Duy Nguyen wrote: > On Fri, May 17, 2019 at 3:55 PM Jeff King <peff@xxxxxxxx> wrote: > > > > On Fri, May 17, 2019 at 02:20:42PM +0700, Duy Nguyen wrote: > > > > > On Fri, May 17, 2019 at 12:35 PM Jeff King <peff@xxxxxxxx> wrote: > > > > As it turns out, index-pack does not handle these complicated cases at > > > > all! In the final fix_unresolved_deltas(), we are only looking for thin > > > > deltas, and anything that was not yet resolved is assumed to be a thin > > > > object. In many of these cases we _could_ resolve them if we tried > > > > harder. But that is good news for us because it means that these > > > > expectations about delta relationships are already there, and the > > > > pre-fetch done by your patch should always be 100% correct and > > > > efficient. > > > > > > Is it worth keeping some of these notes in the "third pass" comment > > > block in index-pack.c to help future readers? > > > > Perhaps. I started on the patch below, but I had trouble in the commit > > message. I couldn't find the part of the code that explains why we would > > never produce this combination, though empirically we do not. Good question indeed. > That still has some value even if your commit ends up with a question > mark. There's not much to dig out of 636171cb80 (make index-pack able > to complete thin packs., 2006-10-25). Adding Nico, maybe he still > remembers... What about this comment in fix_unresolved_deltas(): /* * Since many unresolved deltas may well be themselves base objects * for more unresolved deltas, we really want to include the * smallest number of base objects that would cover as much delta * as possible by picking the * trunc deltas first, allowing for other deltas to resolve without * additional base objects. Since most base objects are to be found * before deltas depending on them, a good heuristic is to start * resolving deltas in the same order as their position in the pack. */ Doesn't that cover it? In pack-objects, another comment says: * Depth value does not matter - find_deltas() will * never consider reused delta as the base object to * deltify other objects against, in order to avoid * circular deltas. Sorry if I'm not of any help here. Although I used to have my brain wrapped around this code pretty tightly, it's been quite a while, and the code did change as well since then. Nicolas