Ignore:
Timestamp:
Jun 23, 2014, 9:45:51 PM (11 years ago)
Author:
dmik
Message:

git: Merge version 2.0.0 from vendor to dmik branch.

Location:
git/branches/dmik
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • git/branches/dmik

  • TabularUnified git/branches/dmik/builtin/clone.c

    r626 r782  
    1919#include "strbuf.h"
    2020#include "dir.h"
    21 #include "pack-refs.h"
    2221#include "sigchain.h"
    2322#include "branch.h"
    2423#include "remote.h"
    2524#include "run-command.h"
     25#include "connected.h"
    2626
    2727/*
     
    3434 */
    3535static const char * const builtin_clone_usage[] = {
    36         "git clone [options] [--] <repo> [<dir>]",
     36        N_("git clone [options] [--] <repo> [<dir>]"),
    3737        NULL
    3838};
    3939
    40 static int option_no_checkout, option_bare, option_mirror;
    41 static int option_local, option_no_hardlinks, option_shared, option_recursive;
     40static int option_no_checkout, option_bare, option_mirror, option_single_branch = -1;
     41static int option_local = -1, option_no_hardlinks, option_shared, option_recursive;
    4242static char *option_template, *option_depth;
    4343static char *option_origin = NULL;
     
    6262        OPT__VERBOSITY(&option_verbosity),
    6363        OPT_BOOL(0, "progress", &option_progress,
    64                  "force progress reporting"),
    65         OPT_BOOLEAN('n', "no-checkout", &option_no_checkout,
    66                     "don't create a checkout"),
    67         OPT_BOOLEAN(0, "bare", &option_bare, "create a bare repository"),
    68         { OPTION_BOOLEAN, 0, "naked", &option_bare, NULL,
    69                 "create a bare repository",
    70                 PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
    71         OPT_BOOLEAN(0, "mirror", &option_mirror,
    72                     "create a mirror repository (implies bare)"),
    73         OPT_BOOLEAN('l', "local", &option_local,
    74                     "to clone from a local repository"),
    75         OPT_BOOLEAN(0, "no-hardlinks", &option_no_hardlinks,
    76                     "don't use local hardlinks, always copy"),
    77         OPT_BOOLEAN('s', "shared", &option_shared,
    78                     "setup as shared repository"),
    79         OPT_BOOLEAN(0, "recursive", &option_recursive,
    80                     "initialize submodules in the clone"),
    81         OPT_BOOLEAN(0, "recurse-submodules", &option_recursive,
    82                     "initialize submodules in the clone"),
    83         OPT_STRING(0, "template", &option_template, "template-directory",
    84                    "directory from which templates will be used"),
    85         OPT_CALLBACK(0 , "reference", &option_reference, "repo",
    86                      "reference repository", &opt_parse_reference),
    87         OPT_STRING('o', "origin", &option_origin, "name",
    88                    "use <name> instead of 'origin' to track upstream"),
    89         OPT_STRING('b', "branch", &option_branch, "branch",
    90                    "checkout <branch> instead of the remote's HEAD"),
    91         OPT_STRING('u', "upload-pack", &option_upload_pack, "path",
    92                    "path to git-upload-pack on the remote"),
    93         OPT_STRING(0, "depth", &option_depth, "depth",
    94                     "create a shallow clone of that depth"),
    95         OPT_STRING(0, "separate-git-dir", &real_git_dir, "gitdir",
    96                    "separate git dir from working tree"),
    97         OPT_STRING_LIST('c', "config", &option_config, "key=value",
    98                         "set config inside the new repository"),
     64                 N_("force progress reporting")),
     65        OPT_BOOL('n', "no-checkout", &option_no_checkout,
     66                 N_("don't create a checkout")),
     67        OPT_BOOL(0, "bare", &option_bare, N_("create a bare repository")),
     68        OPT_HIDDEN_BOOL(0, "naked", &option_bare,
     69                        N_("create a bare repository")),
     70        OPT_BOOL(0, "mirror", &option_mirror,
     71                 N_("create a mirror repository (implies bare)")),
     72        OPT_BOOL('l', "local", &option_local,
     73                N_("to clone from a local repository")),
     74        OPT_BOOL(0, "no-hardlinks", &option_no_hardlinks,
     75                    N_("don't use local hardlinks, always copy")),
     76        OPT_BOOL('s', "shared", &option_shared,
     77                    N_("setup as shared repository")),
     78        OPT_BOOL(0, "recursive", &option_recursive,
     79                    N_("initialize submodules in the clone")),
     80        OPT_BOOL(0, "recurse-submodules", &option_recursive,
     81                    N_("initialize submodules in the clone")),
     82        OPT_STRING(0, "template", &option_template, N_("template-directory"),
     83                   N_("directory from which templates will be used")),
     84        OPT_CALLBACK(0 , "reference", &option_reference, N_("repo"),
     85                     N_("reference repository"), &opt_parse_reference),
     86        OPT_STRING('o', "origin", &option_origin, N_("name"),
     87                   N_("use <name> instead of 'origin' to track upstream")),
     88        OPT_STRING('b', "branch", &option_branch, N_("branch"),
     89                   N_("checkout <branch> instead of the remote's HEAD")),
     90        OPT_STRING('u', "upload-pack", &option_upload_pack, N_("path"),
     91                   N_("path to git-upload-pack on the remote")),
     92        OPT_STRING(0, "depth", &option_depth, N_("depth"),
     93                    N_("create a shallow clone of that depth")),
     94        OPT_BOOL(0, "single-branch", &option_single_branch,
     95                    N_("clone only one branch, HEAD or --branch")),
     96        OPT_STRING(0, "separate-git-dir", &real_git_dir, N_("gitdir"),
     97                   N_("separate git dir from working tree")),
     98        OPT_STRING_LIST('c', "config", &option_config, N_("key=value"),
     99                        N_("set config inside the new repository")),
    99100        OPT_END()
    100101};
     
    230231{
    231232        char *ref_git;
     233        const char *repo;
    232234        struct strbuf alternate = STRBUF_INIT;
    233         struct remote *remote;
    234         struct transport *transport;
    235         const struct ref *extra;
    236 
    237         /* Beware: real_path() and mkpath() return static buffer */
     235
     236        /* Beware: read_gitfile(), real_path() and mkpath() return static buffer */
    238237        ref_git = xstrdup(real_path(item->string));
    239         if (is_directory(mkpath("%s/.git/objects", ref_git))) {
    240                 char *ref_git_git = xstrdup(mkpath("%s/.git", ref_git));
     238
     239        repo = read_gitfile(ref_git);
     240        if (!repo)
     241                repo = read_gitfile(mkpath("%s/.git", ref_git));
     242        if (repo) {
     243                free(ref_git);
     244                ref_git = xstrdup(repo);
     245        }
     246
     247        if (!repo && is_directory(mkpath("%s/.git/objects", ref_git))) {
     248                char *ref_git_git = mkpathdup("%s/.git", ref_git);
    241249                free(ref_git);
    242250                ref_git = ref_git_git;
    243251        } else if (!is_directory(mkpath("%s/objects", ref_git)))
    244                 die(_("reference repository '%s' is not a local directory."),
     252                die(_("reference repository '%s' is not a local repository."),
    245253                    item->string);
     254
     255        if (!access(mkpath("%s/shallow", ref_git), F_OK))
     256                die(_("reference repository '%s' is shallow"), item->string);
     257
     258        if (!access(mkpath("%s/info/grafts", ref_git), F_OK))
     259                die(_("reference repository '%s' is grafted"), item->string);
    246260
    247261        strbuf_addf(&alternate, "%s/objects", ref_git);
    248262        add_to_alternates_file(alternate.buf);
    249263        strbuf_release(&alternate);
    250 
    251         remote = remote_get(ref_git);
    252         transport = transport_get(remote, ref_git);
    253         for (extra = transport_get_remote_refs(transport); extra;
    254              extra = extra->next)
    255                 add_extra_ref(extra->name, extra->old_sha1, 0);
    256 
    257         transport_disconnect(transport);
    258264        free(ref_git);
    259265        return 0;
     
    352358                        if (!link(src->buf, dest->buf))
    353359                                continue;
    354                         if (option_local)
     360                        if (option_local > 0)
    355361                                die_errno(_("failed to create link '%s'"), dest->buf);
    356362                        option_no_hardlinks = 1;
     
    362368}
    363369
    364 static const struct ref *clone_local(const char *src_repo,
    365                                      const char *dest_repo)
    366 {
    367         const struct ref *ret;
    368         struct remote *remote;
    369         struct transport *transport;
    370 
     370static void clone_local(const char *src_repo, const char *dest_repo)
     371{
    371372        if (option_shared) {
    372373                struct strbuf alt = STRBUF_INIT;
     
    384385        }
    385386
    386         remote = remote_get(src_repo);
    387         transport = transport_get(remote, src_repo);
    388         ret = transport_get_remote_refs(transport);
    389         transport_disconnect(transport);
    390387        if (0 <= option_verbosity)
    391                 printf(_("done.\n"));
    392         return ret;
     388                fprintf(stderr, _("done.\n"));
    393389}
    394390
     
    396392static const char *junk_git_dir;
    397393static pid_t junk_pid;
     394static enum {
     395        JUNK_LEAVE_NONE,
     396        JUNK_LEAVE_REPO,
     397        JUNK_LEAVE_ALL
     398} junk_mode = JUNK_LEAVE_NONE;
     399
     400static const char junk_leave_repo_msg[] =
     401N_("Clone succeeded, but checkout failed.\n"
     402   "You can inspect what was checked out with 'git status'\n"
     403   "and retry the checkout with 'git checkout -f HEAD'\n");
    398404
    399405static void remove_junk(void)
    400406{
    401407        struct strbuf sb = STRBUF_INIT;
     408
     409        switch (junk_mode) {
     410        case JUNK_LEAVE_REPO:
     411                warning("%s", _(junk_leave_repo_msg));
     412                /* fall-through */
     413        case JUNK_LEAVE_ALL:
     414                return;
     415        default:
     416                /* proceed to removal */
     417                break;
     418        }
     419
    402420        if (getpid() != junk_pid)
    403421                return;
     
    421439}
    422440
     441static struct ref *find_remote_branch(const struct ref *refs, const char *branch)
     442{
     443        struct ref *ref;
     444        struct strbuf head = STRBUF_INIT;
     445        strbuf_addstr(&head, "refs/heads/");
     446        strbuf_addstr(&head, branch);
     447        ref = find_ref_by_name(refs, head.buf);
     448        strbuf_release(&head);
     449
     450        if (ref)
     451                return ref;
     452
     453        strbuf_addstr(&head, "refs/tags/");
     454        strbuf_addstr(&head, branch);
     455        ref = find_ref_by_name(refs, head.buf);
     456        strbuf_release(&head);
     457
     458        return ref;
     459}
     460
    423461static struct ref *wanted_peer_refs(const struct ref *refs,
    424462                struct refspec *refspec)
     
    428466        struct ref **tail = head ? &head->next : &local_refs;
    429467
    430         get_fetch_map(refs, refspec, &tail, 0);
    431         if (!option_mirror)
     468        if (option_single_branch) {
     469                struct ref *remote_head = NULL;
     470
     471                if (!option_branch)
     472                        remote_head = guess_remote_head(head, refs, 0);
     473                else {
     474                        local_refs = NULL;
     475                        tail = &local_refs;
     476                        remote_head = copy_ref(find_remote_branch(refs, option_branch));
     477                }
     478
     479                if (!remote_head && option_branch)
     480                        warning(_("Could not find remote branch %s to clone."),
     481                                option_branch);
     482                else {
     483                        get_fetch_map(remote_head, refspec, &tail, 0);
     484
     485                        /* if --branch=tag, pull the requested tag explicitly */
     486                        get_fetch_map(remote_head, tag_refspec, &tail, 0);
     487                }
     488        } else
     489                get_fetch_map(refs, refspec, &tail, 0);
     490
     491        if (!option_mirror && !option_single_branch)
    432492                get_fetch_map(refs, tag_refspec, &tail, 0);
    433493
     
    438498{
    439499        const struct ref *r;
     500
     501        lock_packed_refs(LOCK_DIE_ON_ERROR);
    440502
    441503        for (r = local_refs; r; r = r->next) {
    442504                if (!r->peer_ref)
    443505                        continue;
    444                 add_extra_ref(r->peer_ref->name, r->old_sha1, 0);
    445         }
    446 
    447         pack_refs(PACK_REFS_ALL);
    448         clear_extra_refs();
     506                add_packed_ref(r->peer_ref->name, r->old_sha1);
     507        }
     508
     509        if (commit_packed_refs())
     510                die_errno("unable to overwrite old ref-pack file");
     511}
     512
     513static void write_followtags(const struct ref *refs, const char *msg)
     514{
     515        const struct ref *ref;
     516        for (ref = refs; ref; ref = ref->next) {
     517                if (!starts_with(ref->name, "refs/tags/"))
     518                        continue;
     519                if (ends_with(ref->name, "^{}"))
     520                        continue;
     521                if (!has_sha1_file(ref->old_sha1))
     522                        continue;
     523                update_ref(msg, ref->name, ref->old_sha1,
     524                           NULL, 0, DIE_ON_ERR);
     525        }
     526}
     527
     528static int iterate_ref_map(void *cb_data, unsigned char sha1[20])
     529{
     530        struct ref **rm = cb_data;
     531        struct ref *ref = *rm;
     532
     533        /*
     534         * Skip anything missing a peer_ref, which we are not
     535         * actually going to write a ref for.
     536         */
     537        while (ref && !ref->peer_ref)
     538                ref = ref->next;
     539        /* Returning -1 notes "end of list" to the caller. */
     540        if (!ref)
     541                return -1;
     542
     543        hashcpy(sha1, ref->old_sha1);
     544        *rm = ref->next;
     545        return 0;
     546}
     547
     548static void update_remote_refs(const struct ref *refs,
     549                               const struct ref *mapped_refs,
     550                               const struct ref *remote_head_points_at,
     551                               const char *branch_top,
     552                               const char *msg,
     553                               struct transport *transport,
     554                               int check_connectivity)
     555{
     556        const struct ref *rm = mapped_refs;
     557
     558        if (check_connectivity) {
     559                if (transport->progress)
     560                        fprintf(stderr, _("Checking connectivity... "));
     561                if (check_everything_connected_with_transport(iterate_ref_map,
     562                                                              0, &rm, transport))
     563                        die(_("remote did not send all necessary objects"));
     564                if (transport->progress)
     565                        fprintf(stderr, _("done.\n"));
     566        }
     567
     568        if (refs) {
     569                write_remote_refs(mapped_refs);
     570                if (option_single_branch)
     571                        write_followtags(refs, msg);
     572        }
     573
     574        if (remote_head_points_at && !option_bare) {
     575                struct strbuf head_ref = STRBUF_INIT;
     576                strbuf_addstr(&head_ref, branch_top);
     577                strbuf_addstr(&head_ref, "HEAD");
     578                create_symref(head_ref.buf,
     579                              remote_head_points_at->peer_ref->name,
     580                              msg);
     581        }
     582}
     583
     584static void update_head(const struct ref *our, const struct ref *remote,
     585                        const char *msg)
     586{
     587        if (our && starts_with(our->name, "refs/heads/")) {
     588                /* Local default branch link */
     589                create_symref("HEAD", our->name, NULL);
     590                if (!option_bare) {
     591                        const char *head = skip_prefix(our->name, "refs/heads/");
     592                        update_ref(msg, "HEAD", our->old_sha1, NULL, 0, DIE_ON_ERR);
     593                        install_branch_config(0, head, option_origin, our->name);
     594                }
     595        } else if (our) {
     596                struct commit *c = lookup_commit_reference(our->old_sha1);
     597                /* --branch specifies a non-branch (i.e. tags), detach HEAD */
     598                update_ref(msg, "HEAD", c->object.sha1,
     599                           NULL, REF_NODEREF, DIE_ON_ERR);
     600        } else if (remote) {
     601                /*
     602                 * We know remote HEAD points to a non-branch, or
     603                 * HEAD points to a branch but we don't know which one.
     604                 * Detach HEAD in all these cases.
     605                 */
     606                update_ref(msg, "HEAD", remote->old_sha1,
     607                           NULL, REF_NODEREF, DIE_ON_ERR);
     608        }
     609}
     610
     611static int checkout(void)
     612{
     613        unsigned char sha1[20];
     614        char *head;
     615        struct lock_file *lock_file;
     616        struct unpack_trees_options opts;
     617        struct tree *tree;
     618        struct tree_desc t;
     619        int err = 0, fd;
     620
     621        if (option_no_checkout)
     622                return 0;
     623
     624        head = resolve_refdup("HEAD", sha1, 1, NULL);
     625        if (!head) {
     626                warning(_("remote HEAD refers to nonexistent ref, "
     627                          "unable to checkout.\n"));
     628                return 0;
     629        }
     630        if (!strcmp(head, "HEAD")) {
     631                if (advice_detached_head)
     632                        detach_advice(sha1_to_hex(sha1));
     633        } else {
     634                if (!starts_with(head, "refs/heads/"))
     635                        die(_("HEAD not found below refs/heads!"));
     636        }
     637        free(head);
     638
     639        /* We need to be in the new work tree for the checkout */
     640        setup_work_tree();
     641
     642        lock_file = xcalloc(1, sizeof(struct lock_file));
     643        fd = hold_locked_index(lock_file, 1);
     644
     645        memset(&opts, 0, sizeof opts);
     646        opts.update = 1;
     647        opts.merge = 1;
     648        opts.fn = oneway_merge;
     649        opts.verbose_update = (option_verbosity >= 0);
     650        opts.src_index = &the_index;
     651        opts.dst_index = &the_index;
     652
     653        tree = parse_tree_indirect(sha1);
     654        parse_tree(tree);
     655        init_tree_desc(&t, tree->buffer, tree->size);
     656        if (unpack_trees(1, &t, &opts) < 0)
     657                die(_("unable to checkout working tree"));
     658
     659        if (write_cache(fd, active_cache, active_nr) ||
     660            commit_locked_index(lock_file))
     661                die(_("unable to write new index file"));
     662
     663        err |= run_hook_le(NULL, "post-checkout", sha1_to_hex(null_sha1),
     664                           sha1_to_hex(sha1), "1", NULL);
     665
     666        if (!err && option_recursive)
     667                err = run_command_v_opt(argv_submodule, RUN_GIT_CMD);
     668
     669        return err;
    449670}
    450671
     
    463684                        die("unable to write parameters to config file");
    464685        }
     686}
     687
     688static void write_refspec_config(const char* src_ref_prefix,
     689                const struct ref* our_head_points_at,
     690                const struct ref* remote_head_points_at, struct strbuf* branch_top)
     691{
     692        struct strbuf key = STRBUF_INIT;
     693        struct strbuf value = STRBUF_INIT;
     694
     695        if (option_mirror || !option_bare) {
     696                if (option_single_branch && !option_mirror) {
     697                        if (option_branch) {
     698                                if (strstr(our_head_points_at->name, "refs/tags/"))
     699                                        strbuf_addf(&value, "+%s:%s", our_head_points_at->name,
     700                                                our_head_points_at->name);
     701                                else
     702                                        strbuf_addf(&value, "+%s:%s%s", our_head_points_at->name,
     703                                                branch_top->buf, option_branch);
     704                        } else if (remote_head_points_at) {
     705                                strbuf_addf(&value, "+%s:%s%s", remote_head_points_at->name,
     706                                                branch_top->buf,
     707                                                skip_prefix(remote_head_points_at->name, "refs/heads/"));
     708                        }
     709                        /*
     710                         * otherwise, the next "git fetch" will
     711                         * simply fetch from HEAD without updating
     712                         * any remote-tracking branch, which is what
     713                         * we want.
     714                         */
     715                } else {
     716                        strbuf_addf(&value, "+%s*:%s*", src_ref_prefix, branch_top->buf);
     717                }
     718                /* Configure the remote */
     719                if (value.len) {
     720                        strbuf_addf(&key, "remote.%s.fetch", option_origin);
     721                        git_config_set_multivar(key.buf, value.buf, "^$", 0);
     722                        strbuf_reset(&key);
     723
     724                        if (option_mirror) {
     725                                strbuf_addf(&key, "remote.%s.mirror", option_origin);
     726                                git_config_set(key.buf, "true");
     727                                strbuf_reset(&key);
     728                        }
     729                }
     730        }
     731
     732        strbuf_release(&key);
     733        strbuf_release(&value);
    465734}
    466735
     
    476745        const struct ref *our_head_points_at;
    477746        struct ref *mapped_refs;
     747        const struct ref *ref;
    478748        struct strbuf key = STRBUF_INIT, value = STRBUF_INIT;
    479749        struct strbuf branch_top = STRBUF_INIT, reflog_msg = STRBUF_INIT;
    480750        struct transport *transport = NULL;
    481         char *src_ref_prefix = "refs/heads/";
    482         int err = 0;
     751        const char *src_ref_prefix = "refs/heads/";
     752        struct remote *remote;
     753        int err = 0, complete_refs_before_fetch = 1;
    483754
    484755        struct refspec *refspec;
     
    498769                usage_msg_opt(_("You must specify a repository to clone."),
    499770                        builtin_clone_usage, builtin_clone_options);
     771
     772        if (option_single_branch == -1)
     773                option_single_branch = option_depth ? 1 : 0;
    500774
    501775        if (option_mirror)
     
    506780                        die(_("--bare and --origin %s options are incompatible."),
    507781                            option_origin);
     782                if (real_git_dir)
     783                        die(_("--bare and --separate-git-dir are incompatible."));
    508784                option_no_checkout = 1;
    509785        }
     
    521797        else
    522798                repo = repo_name;
    523         is_local = path && !is_bundle;
    524         if (is_local && option_depth)
    525                 warning(_("--depth is ignored in local clones; use file:// instead."));
     799        is_local = option_local != 0 && path && !is_bundle;
     800        if (is_local) {
     801                if (option_depth)
     802                        warning(_("--depth is ignored in local clones; use file:// instead."));
     803                if (!access(mkpath("%s/shallow", path), F_OK)) {
     804                        if (option_local > 0)
     805                                warning(_("source repository is shallow, ignoring --local"));
     806                        is_local = 0;
     807                }
     808        }
     809        if (option_local > 0 && !is_local)
     810                warning(_("--local is ignored"));
     811
     812        /* no need to be strict, transport_set_option() will validate it again */
     813        if (option_depth && atoi(option_depth) < 1)
     814                die(_("depth %s is not a positive number"), option_depth);
    526815
    527816        if (argc == 2)
     
    550839        else {
    551840                work_tree = dir;
    552                 git_dir = xstrdup(mkpath("%s/.git", dir));
     841                git_dir = mkpathdup("%s/.git", dir);
    553842        }
    554843
     
    558847                        die_errno(_("could not create leading directories of '%s'"),
    559848                                  work_tree);
    560                 if (!dest_exists && mkdir(work_tree, 0755))
     849                if (!dest_exists && mkdir(work_tree, 0777))
    561850                        die_errno(_("could not create work tree dir '%s'."),
    562851                                  work_tree);
     
    567856        sigchain_push_common(remove_junk_on_signal);
    568857
    569         setenv(CONFIG_ENVIRONMENT, mkpath("%s/config", git_dir), 1);
    570 
    571858        if (safe_create_leading_directories_const(git_dir) < 0)
    572859                die(_("could not create leading directories of '%s'"), git_dir);
    573860
    574861        set_git_dir_init(git_dir, real_git_dir, 0);
    575         if (real_git_dir)
     862        if (real_git_dir) {
    576863                git_dir = real_git_dir;
     864                junk_git_dir = real_git_dir;
     865        }
    577866
    578867        if (0 <= option_verbosity) {
    579868                if (option_bare)
    580                         printf(_("Cloning into bare repository '%s'...\n"), dir);
     869                        fprintf(stderr, _("Cloning into bare repository '%s'...\n"), dir);
    581870                else
    582                         printf(_("Cloning into '%s'...\n"), dir);
     871                        fprintf(stderr, _("Cloning into '%s'...\n"), dir);
    583872        }
    584873        init_db(option_template, INIT_DB_QUIET);
    585874        write_config(&option_config);
    586 
    587         /*
    588          * At this point, the config exists, so we do not need the
    589          * environment variable.  We actually need to unset it, too, to
    590          * re-enable parsing of the global configs.
    591          */
    592         unsetenv(CONFIG_ENVIRONMENT);
    593875
    594876        git_config(git_default_config, NULL);
     
    605887
    606888        strbuf_addf(&value, "+%s*:%s*", src_ref_prefix, branch_top.buf);
    607 
    608         if (option_mirror || !option_bare) {
    609                 /* Configure the remote */
    610                 strbuf_addf(&key, "remote.%s.fetch", option_origin);
    611                 git_config_set_multivar(key.buf, value.buf, "^$", 0);
    612                 strbuf_reset(&key);
    613 
    614                 if (option_mirror) {
    615                         strbuf_addf(&key, "remote.%s.mirror", option_origin);
    616                         git_config_set(key.buf, "true");
    617                         strbuf_reset(&key);
    618                 }
    619         }
    620 
    621889        strbuf_addf(&key, "remote.%s.url", option_origin);
    622890        git_config_set(key.buf, repo);
     
    631899        strbuf_reset(&value);
    632900
    633         if (is_local) {
    634                 refs = clone_local(path, git_dir);
     901        remote = remote_get(option_origin);
     902        transport = transport_get(remote, remote->url[0]);
     903        transport->cloning = 1;
     904
     905        if (!transport->get_refs_list || (!is_local && !transport->fetch))
     906                die(_("Don't know how to clone %s"), transport->url);
     907
     908        transport_set_option(transport, TRANS_OPT_KEEP, "yes");
     909
     910        if (option_depth)
     911                transport_set_option(transport, TRANS_OPT_DEPTH,
     912                                     option_depth);
     913        if (option_single_branch)
     914                transport_set_option(transport, TRANS_OPT_FOLLOWTAGS, "1");
     915
     916        transport_set_verbosity(transport, option_verbosity, option_progress);
     917
     918        if (option_upload_pack)
     919                transport_set_option(transport, TRANS_OPT_UPLOADPACK,
     920                                     option_upload_pack);
     921
     922        if (transport->smart_options && !option_depth)
     923                transport->smart_options->check_self_contained_and_connected = 1;
     924
     925        refs = transport_get_remote_refs(transport);
     926
     927        if (refs) {
    635928                mapped_refs = wanted_peer_refs(refs, refspec);
    636         } else {
    637                 struct remote *remote = remote_get(option_origin);
    638                 transport = transport_get(remote, remote->url[0]);
    639 
    640                 if (!transport->get_refs_list || !transport->fetch)
    641                         die(_("Don't know how to clone %s"), transport->url);
    642 
    643                 transport_set_option(transport, TRANS_OPT_KEEP, "yes");
    644 
    645                 if (option_depth)
    646                         transport_set_option(transport, TRANS_OPT_DEPTH,
    647                                              option_depth);
    648 
    649                 transport_set_verbosity(transport, option_verbosity, option_progress);
    650 
    651                 if (option_upload_pack)
    652                         transport_set_option(transport, TRANS_OPT_UPLOADPACK,
    653                                              option_upload_pack);
    654 
    655                 refs = transport_get_remote_refs(transport);
    656                 if (refs) {
    657                         mapped_refs = wanted_peer_refs(refs, refspec);
     929                /*
     930                 * transport_get_remote_refs() may return refs with null sha-1
     931                 * in mapped_refs (see struct transport->get_refs_list
     932                 * comment). In that case we need fetch it early because
     933                 * remote_head code below relies on it.
     934                 *
     935                 * for normal clones, transport_get_remote_refs() should
     936                 * return reliable ref set, we can delay cloning until after
     937                 * remote HEAD check.
     938                 */
     939                for (ref = refs; ref; ref = ref->next)
     940                        if (is_null_sha1(ref->old_sha1)) {
     941                                complete_refs_before_fetch = 0;
     942                                break;
     943                        }
     944
     945                if (!is_local && !complete_refs_before_fetch)
    658946                        transport_fetch_refs(transport, mapped_refs);
    659                 }
    660         }
    661 
    662         if (refs) {
    663                 clear_extra_refs();
    664 
    665                 write_remote_refs(mapped_refs);
    666947
    667948                remote_head = find_ref_by_name(refs, "HEAD");
     
    670951
    671952                if (option_branch) {
    672                         struct strbuf head = STRBUF_INIT;
    673                         strbuf_addstr(&head, src_ref_prefix);
    674                         strbuf_addstr(&head, option_branch);
    675953                        our_head_points_at =
    676                                 find_ref_by_name(mapped_refs, head.buf);
    677                         strbuf_release(&head);
    678 
    679                         if (!our_head_points_at) {
    680                                 warning(_("Remote branch %s not found in "
    681                                         "upstream %s, using HEAD instead"),
    682                                         option_branch, option_origin);
    683                                 our_head_points_at = remote_head_points_at;
    684                         }
     954                                find_remote_branch(mapped_refs, option_branch);
     955
     956                        if (!our_head_points_at)
     957                                die(_("Remote branch %s not found in upstream %s"),
     958                                    option_branch, option_origin);
    685959                }
    686960                else
     
    688962        }
    689963        else {
     964                if (option_branch)
     965                        die(_("Remote branch %s not found in upstream %s"),
     966                                        option_branch, option_origin);
     967
    690968                warning(_("You appear to have cloned an empty repository."));
     969                mapped_refs = NULL;
    691970                our_head_points_at = NULL;
    692971                remote_head_points_at = NULL;
     
    698977        }
    699978
    700         if (remote_head_points_at && !option_bare) {
    701                 struct strbuf head_ref = STRBUF_INIT;
    702                 strbuf_addstr(&head_ref, branch_top.buf);
    703                 strbuf_addstr(&head_ref, "HEAD");
    704                 create_symref(head_ref.buf,
    705                               remote_head_points_at->peer_ref->name,
    706                               reflog_msg.buf);
    707         }
    708 
    709         if (our_head_points_at) {
    710                 /* Local default branch link */
    711                 create_symref("HEAD", our_head_points_at->name, NULL);
    712                 if (!option_bare) {
    713                         const char *head = skip_prefix(our_head_points_at->name,
    714                                                        "refs/heads/");
    715                         update_ref(reflog_msg.buf, "HEAD",
    716                                    our_head_points_at->old_sha1,
    717                                    NULL, 0, DIE_ON_ERR);
    718                         install_branch_config(0, head, option_origin,
    719                                               our_head_points_at->name);
    720                 }
    721         } else if (remote_head) {
    722                 /* Source had detached HEAD pointing somewhere. */
    723                 if (!option_bare) {
    724                         update_ref(reflog_msg.buf, "HEAD",
    725                                    remote_head->old_sha1,
    726                                    NULL, REF_NODEREF, DIE_ON_ERR);
    727                         our_head_points_at = remote_head;
    728                 }
    729         } else {
    730                 /* Nothing to checkout out */
    731                 if (!option_no_checkout)
    732                         warning(_("remote HEAD refers to nonexistent ref, "
    733                                 "unable to checkout.\n"));
    734                 option_no_checkout = 1;
    735         }
    736 
    737         if (transport) {
    738                 transport_unlock_pack(transport);
    739                 transport_disconnect(transport);
    740         }
    741 
    742         if (!option_no_checkout) {
    743                 struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
    744                 struct unpack_trees_options opts;
    745                 struct tree *tree;
    746                 struct tree_desc t;
    747                 int fd;
    748 
    749                 /* We need to be in the new work tree for the checkout */
    750                 setup_work_tree();
    751 
    752                 fd = hold_locked_index(lock_file, 1);
    753 
    754                 memset(&opts, 0, sizeof opts);
    755                 opts.update = 1;
    756                 opts.merge = 1;
    757                 opts.fn = oneway_merge;
    758                 opts.verbose_update = (option_verbosity > 0);
    759                 opts.src_index = &the_index;
    760                 opts.dst_index = &the_index;
    761 
    762                 tree = parse_tree_indirect(our_head_points_at->old_sha1);
    763                 parse_tree(tree);
    764                 init_tree_desc(&t, tree->buffer, tree->size);
    765                 unpack_trees(1, &t, &opts);
    766 
    767                 if (write_cache(fd, active_cache, active_nr) ||
    768                     commit_locked_index(lock_file))
    769                         die(_("unable to write new index file"));
    770 
    771                 err |= run_hook(NULL, "post-checkout", sha1_to_hex(null_sha1),
    772                                 sha1_to_hex(our_head_points_at->old_sha1), "1",
    773                                 NULL);
    774 
    775                 if (!err && option_recursive)
    776                         err = run_command_v_opt(argv_submodule, RUN_GIT_CMD);
    777         }
     979        write_refspec_config(src_ref_prefix, our_head_points_at,
     980                        remote_head_points_at, &branch_top);
     981
     982        if (is_local)
     983                clone_local(path, git_dir);
     984        else if (refs && complete_refs_before_fetch)
     985                transport_fetch_refs(transport, mapped_refs);
     986
     987        update_remote_refs(refs, mapped_refs, remote_head_points_at,
     988                           branch_top.buf, reflog_msg.buf, transport, !is_local);
     989
     990        update_head(our_head_points_at, remote_head, reflog_msg.buf);
     991
     992        transport_unlock_pack(transport);
     993        transport_disconnect(transport);
     994
     995        junk_mode = JUNK_LEAVE_REPO;
     996        err = checkout();
    778997
    779998        strbuf_release(&reflog_msg);
     
    7811000        strbuf_release(&key);
    7821001        strbuf_release(&value);
    783         junk_pid = 0;
     1002        junk_mode = JUNK_LEAVE_ALL;
    7841003        return err;
    7851004}
Note: See TracChangeset for help on using the changeset viewer.