]> granicus.if.org Git - git/commitdiff
fsck: support refs pointing to promisor objects
authorJonathan Tan <jonathantanmy@google.com>
Tue, 5 Dec 2017 16:58:45 +0000 (16:58 +0000)
committerJunio C Hamano <gitster@pobox.com>
Tue, 5 Dec 2017 17:46:05 +0000 (09:46 -0800)
Teach fsck to not treat refs referring to missing promisor objects as an
error when extensions.partialclone is set.

For the purposes of warning about no default refs, such refs are still
treated as legitimate refs.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/fsck.c
t/t0410-partial-clone.sh

index 29342998fd7adb3aeafee01049d146591982a3fb..ee937bbdbc45f8223155cec07ec22acaf1e9929f 100644 (file)
@@ -434,6 +434,14 @@ static int fsck_handle_ref(const char *refname, const struct object_id *oid,
 
        obj = parse_object(oid);
        if (!obj) {
+               if (is_promisor_object(oid)) {
+                       /*
+                        * Increment default_refs anyway, because this is a
+                        * valid ref.
+                        */
+                        default_refs++;
+                        return 0;
+               }
                error("%s: invalid sha1 pointer %s", refname, oid_to_hex(oid));
                errors_found |= ERROR_REACHABLE;
                /* We'll continue with the rest despite the error.. */
index 3ddb3b98fe5001c722c5d21a0f48694ffb81aee5..bf75162c16b8fdef724f479415c9c94065280894 100755 (executable)
@@ -13,6 +13,14 @@ pack_as_from_promisor () {
        >repo/.git/objects/pack/pack-$HASH.promisor
 }
 
+promise_and_delete () {
+       HASH=$(git -C repo rev-parse "$1") &&
+       git -C repo tag -a -m message my_annotated_tag "$HASH" &&
+       git -C repo rev-parse my_annotated_tag | pack_as_from_promisor &&
+       git -C repo tag -d my_annotated_tag &&
+       delete_object repo "$HASH"
+}
+
 test_expect_success 'missing reflog object, but promised by a commit, passes fsck' '
        test_create_repo repo &&
        test_commit -C repo my_commit &&
@@ -78,4 +86,20 @@ test_expect_success 'missing reflog object alone fails fsck, even with extension
        test_must_fail git -C repo fsck
 '
 
+test_expect_success 'missing ref object, but promised, passes fsck' '
+       rm -rf repo &&
+       test_create_repo repo &&
+       test_commit -C repo my_commit &&
+
+       A=$(git -C repo commit-tree -m a HEAD^{tree}) &&
+
+       # Reference $A only from ref
+       git -C repo branch my_branch "$A" &&
+       promise_and_delete "$A" &&
+
+       git -C repo config core.repositoryformatversion 1 &&
+       git -C repo config extensions.partialclone "arbitrary string" &&
+       git -C repo fsck
+'
+
 test_done