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

1  2 
builtin/clone.c
diff --combined builtin/clone.c
index 17f57cdf29a4c74550795ce3f711fbfc57bf38b3,38a0a64c61659a99f9c9243dd834a23ea81508f1..430307b298b4f9ea03ff4caea283b133fde0077e
@@@ -18,6 -18,7 +18,6 @@@
  #include "transport.h"
  #include "strbuf.h"
  #include "dir.h"
 -#include "pack-refs.h"
  #include "sigchain.h"
  #include "branch.h"
  #include "remote.h"
@@@ -493,16 -494,13 +493,16 @@@ static void write_remote_refs(const str
  {
        const struct ref *r;
  
 +      lock_packed_refs(LOCK_DIE_ON_ERROR);
 +
        for (r = local_refs; r; r = r->next) {
                if (!r->peer_ref)
                        continue;
                add_packed_ref(r->peer_ref->name, r->old_sha1);
        }
  
 -      pack_refs(PACK_REFS_ALL);
 +      if (commit_packed_refs())
 +              die_errno("unable to overwrite old ref-pack file");
  }
  
  static void write_followtags(const struct ref *refs, const char *msg)
@@@ -545,17 -543,14 +545,20 @@@ static void update_remote_refs(const st
                               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 (check_everything_connected(iterate_ref_map, 0, &rm))
++              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);
@@@ -701,7 -696,7 +704,7 @@@ static void write_refspec_config(const 
                        /*
                         * otherwise, the next "git fetch" will
                         * simply fetch from HEAD without updating
 -                       * any remote tracking branch, which is what
 +                       * any remote-tracking branch, which is what
                         * we want.
                         */
                } else {
@@@ -791,8 -786,6 +794,8 @@@ int cmd_clone(int argc, const char **ar
        is_local = option_local != 0 && path && !is_bundle;
        if (is_local && option_depth)
                warning(_("--depth is ignored in local clones; use file:// instead."));
 +      if (option_local > 0 && !is_local)
 +              warning(_("--local is ignored"));
  
        if (argc == 2)
                dir = xstrdup(argv[1]);
                if (option_upload_pack)
                        transport_set_option(transport, TRANS_OPT_UPLOADPACK,
                                             option_upload_pack);
 +
 +              if (transport->smart_options && !option_depth)
 +                      transport->smart_options->check_self_contained_and_connected = 1;
        }
  
        refs = transport_get_remote_refs(transport);
                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, !is_local);
++                         branch_top.buf, reflog_msg.buf, transport, !is_local);
  
        update_head(our_head_points_at, remote_head, reflog_msg.buf);