]> git.ipfire.org Git - thirdparty/git.git/commit - commit.c
commit,shallow: unparse commits if grafts changed
authorJonathan Tan <jonathantanmy@google.com>
Mon, 6 Jun 2022 17:54:37 +0000 (10:54 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 6 Jun 2022 18:50:34 +0000 (11:50 -0700)
commit4d4e49fff17122e0eec185857fa87d526174859f
tree987539eb1a4cd50d6321b409e75779c61db130ee
parent2668e3608e47494f2f10ef2b6e69f08a84816bcb
commit,shallow: unparse commits if grafts changed

When a commit is parsed, it pretends to have a different (possibly
empty) list of parents if there is graft information for that commit.
But there is a bug that could occur when a commit is parsed, the graft
information is updated (for example, when a shallow file is rewritten),
and the same commit is subsequently used: the parents of the commit do
not conform to the updated graft information, but the information at the
time of parsing.

This is usually not an issue, as a commit is usually introduced into the
repository at the same time as its graft information. That means that
when we try to parse that commit, we already have its graft information.

But it is an issue when fetching a shallow point directly into a
repository with submodules. The function
assign_shallow_commits_to_refs() parses all sought objects (including
the shallow point, which we are directly fetching). In update_shallow()
in fetch-pack.c, assign_shallow_commits_to_refs() is called before
commit_shallow_file(), which means that the shallow point would have
been parsed before graft information is updated. Once a commit is
parsed, it is no longer sensitive to any graft information updates. This
parsed commit is subsequently used when we do a revision walk to search
for submodules to fetch, meaning that the commit is considered to have
parents even though it is a shallow point (and therefore should be
treated as having no parents).

Therefore, whenever graft information is updated, mark the commits that
were previously grafts and the commits that are newly grafts as
unparsed.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
commit.c
shallow.c
t/t5537-fetch-shallow.sh