]> git.ipfire.org Git - thirdparty/git.git/commit - builtin/pack-objects.c
pack-objects: fix off-by-one in delta-island tree-depth computation
authorJeff King <peff@peff.net>
Tue, 20 Nov 2018 09:50:53 +0000 (04:50 -0500)
committerJunio C Hamano <gitster@pobox.com>
Wed, 21 Nov 2018 04:50:28 +0000 (13:50 +0900)
commit3949053617652693b659a933a1393f8be189f26a
tree274ffd2cd3a6c2514e89d9f7f1020bcc4a377633
parente159b8107190aa53b27f9f106e5874597106eb88
pack-objects: fix off-by-one in delta-island tree-depth computation

When delta-islands are in use, we need to record the deepest path at
which we find each tree and blob. Our loop to do so counts slashes, so
"foo" is depth 0, "foo/bar" is depth 1, and so on.

However, this neglects root trees, which are represented by the empty
string. Those also have depth 0, but are at a layer above "foo". Thus,
"foo" should be 1, "foo/bar" at 2, and so on. We use this depth to
topo-sort the trees in resolve_tree_islands(). As a result, we may fail
to visit a root tree before the sub-trees it contains, and therefore not
correctly pass down the island marks.

That in turn could lead to missing some delta opportunities (objects are
in the same island, but we didn't realize it) or creating unwanted
cross-island deltas (one object is in an island another isn't, but we
don't realize). In practice, it seems to have only a small effect.  Some
experiments on the real-world git/git fork network at GitHub showed an
improvement of only 0.14% in the resulting clone size.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/pack-objects.c