fetch-pack: write fetched refs to .promisor
authorJonathan Tan <jonathantanmy@google.com>
Tue, 15 Oct 2019 00:12:31 +0000 (17:12 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 16 Oct 2019 02:07:51 +0000 (11:07 +0900)
commit5374a290aa56390f9f44547d52f8f30fb2e866aa
tree046ddf404e5b98365119a7fd12d3cb34a5a35919
parent08da6496b61341ec45eac36afcc8f94242763468
fetch-pack: write fetched refs to .promisor

The specification of promisor packfiles (in partial-clone.txt) states
that the .promisor files that accompany packfiles do not matter (just
like .keep files), so whenever a packfile is fetched from the promisor
remote, Git has been writing empty .promisor files. But these files
could contain more useful information.

So instead of writing empty files, write the refs fetched to these
files. This makes it easier to debug issues with partial clones, as we
can identify what refs (and their associated hashes) were fetched at the
time the packfile was downloaded, and if necessary, compare those hashes
against what the promisor remote reports now.

This is implemented by teaching fetch-pack to write its own non-empty
.promisor file whenever it knows the name of the pack's lockfile. This
covers the case wherein the user runs "git fetch" with an internal
protocol or HTTP protocol v2 (fetch_refs_via_pack() in transport.c sets
lock_pack) and with HTTP protocol v0/v1 (fetch_git() in remote-curl.c
passes "--lock-pack" to "fetch-pack").

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Acked-by: Josh Steadmon <steadmon@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/repack.c
fetch-pack.c
t/t5616-partial-clone.sh