Merge branch 'jt/transfer-fsck-with-promissor'
authorJunio C Hamano <gitster@pobox.com>
Wed, 21 Mar 2018 18:30:11 +0000 (11:30 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 21 Mar 2018 18:30:11 +0000 (11:30 -0700)
The transfer.fsckobjects configuration tells "git fetch" to
validate the data and connected-ness of objects in the received
pack; the code to perform this check has been taught about the
narrow clone's convention that missing objects that are reachable
from objects in a pack that came from a promissor remote is OK.

* jt/transfer-fsck-with-promissor:
fetch-pack: do not check links for partial fetch
index-pack: support checking objects but not links

Documentation/git-index-pack.txt
builtin/index-pack.c
fetch-pack.c
t/t5302-pack-index.sh
t/t5616-partial-clone.sh
index 1b4b65d6657b003079e0407d1da8d8c239933267..138edb47b6a17ab925ef3206c1aec6336ff380fe 100644 (file)
@@ -77,6 +77,9 @@ OPTIONS
 --check-self-contained-and-connected::
        Die if the pack contains broken links. For internal use only.
 
+--fsck-objects::
+       Die if the pack contains broken objects. For internal use only.
+
 --threads=<n>::
        Specifies the number of threads to spawn when resolving
        deltas. This requires that index-pack be compiled with
index 9791d428892f0f96d30ecb22d0ca9cf40e4b9f38..bda84a92effe41adb1e50a06ff6accac0563d04a 100644 (file)
@@ -828,7 +828,7 @@ static void sha1_object(const void *data, struct object_entry *obj_entry,
                free(has_data);
        }
 
-       if (strict) {
+       if (strict || do_fsck_object) {
                read_lock();
                if (type == OBJ_BLOB) {
                        struct blob *blob = lookup_blob(oid);
@@ -854,7 +854,7 @@ static void sha1_object(const void *data, struct object_entry *obj_entry,
                        if (do_fsck_object &&
                            fsck_object(obj, buf, size, &fsck_options))
                                die(_("Error in object"));
-                       if (fsck_walk(obj, NULL, &fsck_options))
+                       if (strict && fsck_walk(obj, NULL, &fsck_options))
                                die(_("Not all child objects of %s are reachable"), oid_to_hex(&obj->oid));
 
                        if (obj->type == OBJ_TREE) {
@@ -1689,6 +1689,8 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
                        } else if (!strcmp(arg, "--check-self-contained-and-connected")) {
                                strict = 1;
                                check_self_contained_and_connected = 1;
+                       } else if (!strcmp(arg, "--fsck-objects")) {
+                               do_fsck_object = 1;
                        } else if (!strcmp(arg, "--verify")) {
                                verify = 1;
                        } else if (!strcmp(arg, "--verify-stat")) {
index d97461296d5692521cd038f9ffa0b5f5c3c3f3dd..1d6117565c2067460efc50aa4e6ca2ecb167a976 100644 (file)
@@ -886,8 +886,17 @@ static int get_pack(struct fetch_pack_args *args,
            ? fetch_fsck_objects
            : transfer_fsck_objects >= 0
            ? transfer_fsck_objects
-           : 0)
-               argv_array_push(&cmd.args, "--strict");
+           : 0) {
+               if (args->from_promisor)
+                       /*
+                        * We cannot use --strict in index-pack because it
+                        * checks both broken objects and links, but we only
+                        * want to check for broken objects.
+                        */
+                       argv_array_push(&cmd.args, "--fsck-objects");
+               else
+                       argv_array_push(&cmd.args, "--strict");
+       }
 
        cmd.in = demux.out;
        cmd.git_cmd = 1;
index c2fc584dac3d7e96748866dd0a4ae31f7cae3fc2..d695a6082edf69c6ab377ea825519097f84162f3 100755 (executable)
@@ -262,4 +262,9 @@ EOF
     grep "^warning:.* expected .tagger. line" err
 '
 
+test_expect_success 'index-pack --fsck-objects also warns upon missing tagger in tag' '
+    git index-pack --fsck-objects tag-test-${pack1}.pack 2>err &&
+    grep "^warning:.* expected .tagger. line" err
+'
+
 test_done
index 29d8631184320cfb11b034df29a12c9260d2ea66..cee556536757128861e166ea8e2cab7f975282c6 100755 (executable)
@@ -143,4 +143,15 @@ test_expect_success 'manual prefetch of missing objects' '
        test_line_count = 0 observed.oids
 '
 
+test_expect_success 'partial clone with transfer.fsckobjects=1 uses index-pack --fsck-objects' '
+       git init src &&
+       test_commit -C src x &&
+       test_config -C src uploadpack.allowfilter 1 &&
+       test_config -C src uploadpack.allowanysha1inwant 1 &&
+
+       GIT_TRACE="$(pwd)/trace" git -c transfer.fsckobjects=1 \
+               clone --filter="blob:none" "file://$(pwd)/src" dst &&
+       grep "git index-pack.*--fsck-objects" trace
+'
+
 test_done