Skip to content

Implement discovering branch targets from the archive

With the proper implementation of packfile negotiation, remotes can return packfiles that do not contain all of our wanted objects. Consider the following two histories:

* c1                                      c1     ← [refs/tags/original]
↑                                         ↑  ↖
* c2 ← [refs/heads/main]                  |   c3 ← [refs/heads/main]
                                          c2     ← [refs/heads/broken]

The first visit of the origin would load commits c1 and c2, and write a snapshot referencing c2.

During the second visit, the loader would tell the origin that c2 is known, and that c1 and c3 are wanted (as new heads). The origin, knowing that c1 is a parent of c2, would be allowed by the git protocol to send a packfile containing only c3. Under these circumstances, the loader cannot tell what object type the snapshot branch [refs/tags/original] should point to.

The repository in tests has a similar structure ([refs/heads/master] is in the history of [refs/tags/branch2-before-delete]), so refactor the incremental load test to exercise this specific behavior. This test can be moved to the common tests as well.

(Bundle two small refactoring commits to make sure the dumb protocol loader has the same behavior as the smart protocol loader for tests)

Test Plan

improved existing test to trigger the behavior


Migrated from D8817 (view on Phabricator)

Merge request reports