Merge branch 'jk/maint-clone-shared-no-connectivity-validation'
authorJunio C Hamano <gitster@pobox.com>
Thu, 18 Jul 2013 19:48:28 +0000 (12:48 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 18 Jul 2013 19:48:29 +0000 (12:48 -0700)
"git clone -s/-l" is a filesystem level copy and does not offer any
protection against source repository being corrupt. While the
connectivity validation checks commits and trees being readable, it
made the otherwise instantaneous local modes of clone much more
expensive, without protecting blob data from bitflips.

* jk/maint-clone-shared-no-connectivity-validation:
clone: drop connectivity check for local clones

builtin/clone.c
t/t5710-info-alternate.sh
index 17f57cdf29a4c74550795ce3f711fbfc57bf38b3..430307b298b4f9ea03ff4caea283b133fde0077e 100644 (file)
@@ -545,17 +545,20 @@ static void update_remote_refs(const struct ref *refs,
                               const struct ref *remote_head_points_at,
                               const char *branch_top,
                               const char *msg,
-                              struct transport *transport)
+                              struct transport *transport,
+                              int check_connectivity)
 {
        const struct ref *rm = mapped_refs;
 
-       if (0 <= option_verbosity)
-               printf(_("Checking connectivity... "));
-       if (check_everything_connected_with_transport(iterate_ref_map,
-                                                     0, &rm, transport))
-               die(_("remote did not send all necessary objects"));
-       if (0 <= option_verbosity)
-               printf(_("done\n"));
+       if (check_connectivity) {
+               if (0 <= option_verbosity)
+                       printf(_("Checking connectivity... "));
+               if (check_everything_connected_with_transport(iterate_ref_map,
+                                                             0, &rm, transport))
+                       die(_("remote did not send all necessary objects"));
+               if (0 <= option_verbosity)
+                       printf(_("done\n"));
+       }
 
        if (refs) {
                write_remote_refs(mapped_refs);
@@ -963,7 +966,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
                transport_fetch_refs(transport, mapped_refs);
 
        update_remote_refs(refs, mapped_refs, remote_head_points_at,
-                          branch_top.buf, reflog_msg.buf, transport);
+                          branch_top.buf, reflog_msg.buf, transport, !is_local);
 
        update_head(our_head_points_at, remote_head, reflog_msg.buf);
 
index 8956c21617410863660bff0bc22ec8e81903e81a..5a6e49d18d6f9e6e06409093d9b9f426d70de475 100755 (executable)
@@ -58,7 +58,13 @@ test_expect_success 'creating too deep nesting' \
 git clone -l -s D E &&
 git clone -l -s E F &&
 git clone -l -s F G &&
-test_must_fail git clone --bare -l -s G H'
+git clone --bare -l -s G H'
+
+test_expect_success 'invalidity of deepest repository' \
+'cd H && {
+       test_valid_repo
+       test $? -ne 0
+}'
 
 cd "$base_dir"