mirror of
https://github.com/git/git.git
synced 2024-11-27 20:14:30 +08:00
fsck: support referenced promisor objects
Teach fsck to not treat missing promisor objects indirectly pointed to by refs as an error when extensions.partialclone is set. Signed-off-by: Jonathan Tan <jonathantanmy@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
43f25158ca
commit
caba7fc31a
@ -149,6 +149,15 @@ static int mark_object(struct object *obj, int type, void *data, struct fsck_opt
|
||||
if (obj->flags & REACHABLE)
|
||||
return 0;
|
||||
obj->flags |= REACHABLE;
|
||||
|
||||
if (is_promisor_object(&obj->oid))
|
||||
/*
|
||||
* Further recursion does not need to be performed on this
|
||||
* object since it is a promisor object (so it does not need to
|
||||
* be added to "pending").
|
||||
*/
|
||||
return 0;
|
||||
|
||||
if (!(obj->flags & HAS_OBJ)) {
|
||||
if (parent && !has_object_file(&obj->oid)) {
|
||||
printf("broken link from %7s %s\n",
|
||||
@ -208,6 +217,8 @@ static void check_reachable_object(struct object *obj)
|
||||
* do a full fsck
|
||||
*/
|
||||
if (!(obj->flags & HAS_OBJ)) {
|
||||
if (is_promisor_object(&obj->oid))
|
||||
return;
|
||||
if (has_sha1_pack(obj->oid.hash))
|
||||
return; /* it is in pack - forget about it */
|
||||
printf("missing %s %s\n", printable_type(obj),
|
||||
|
@ -102,4 +102,27 @@ test_expect_success 'missing ref object, but promised, passes fsck' '
|
||||
git -C repo fsck
|
||||
'
|
||||
|
||||
test_expect_success 'missing object, but promised, passes fsck' '
|
||||
rm -rf repo &&
|
||||
test_create_repo repo &&
|
||||
test_commit -C repo 1 &&
|
||||
test_commit -C repo 2 &&
|
||||
test_commit -C repo 3 &&
|
||||
git -C repo tag -a annotated_tag -m "annotated tag" &&
|
||||
|
||||
C=$(git -C repo rev-parse 1) &&
|
||||
T=$(git -C repo rev-parse 2^{tree}) &&
|
||||
B=$(git hash-object repo/3.t) &&
|
||||
AT=$(git -C repo rev-parse annotated_tag) &&
|
||||
|
||||
promise_and_delete "$C" &&
|
||||
promise_and_delete "$T" &&
|
||||
promise_and_delete "$B" &&
|
||||
promise_and_delete "$AT" &&
|
||||
|
||||
git -C repo config core.repositoryformatversion 1 &&
|
||||
git -C repo config extensions.partialclone "arbitrary string" &&
|
||||
git -C repo fsck
|
||||
'
|
||||
|
||||
test_done
|
||||
|
Loading…
Reference in New Issue
Block a user