Changeset 782 for git/branches/dmik/builtin/clone.c
- Timestamp:
- Jun 23, 2014, 9:45:51 PM (11 years ago)
- Location:
- git/branches/dmik
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
git/branches/dmik ¶
- Property svn:mergeinfo changed
/git/vendor/2.0.0 (added) merged: 777 /git/vendor/current merged: 772,774,776
- Property svn:mergeinfo changed
-
TabularUnified git/branches/dmik/builtin/clone.c ¶
r626 r782 19 19 #include "strbuf.h" 20 20 #include "dir.h" 21 #include "pack-refs.h"22 21 #include "sigchain.h" 23 22 #include "branch.h" 24 23 #include "remote.h" 25 24 #include "run-command.h" 25 #include "connected.h" 26 26 27 27 /* … … 34 34 */ 35 35 static const char * const builtin_clone_usage[] = { 36 "git clone [options] [--] <repo> [<dir>]",36 N_("git clone [options] [--] <repo> [<dir>]"), 37 37 NULL 38 38 }; 39 39 40 static int option_no_checkout, option_bare, option_mirror ;41 static int option_local , option_no_hardlinks, option_shared, option_recursive;40 static int option_no_checkout, option_bare, option_mirror, option_single_branch = -1; 41 static int option_local = -1, option_no_hardlinks, option_shared, option_recursive; 42 42 static char *option_template, *option_depth; 43 43 static char *option_origin = NULL; … … 62 62 OPT__VERBOSITY(&option_verbosity), 63 63 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")), 99 100 OPT_END() 100 101 }; … … 230 231 { 231 232 char *ref_git; 233 const char *repo; 232 234 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 */ 238 237 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); 241 249 free(ref_git); 242 250 ref_git = ref_git_git; 243 251 } 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."), 245 253 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); 246 260 247 261 strbuf_addf(&alternate, "%s/objects", ref_git); 248 262 add_to_alternates_file(alternate.buf); 249 263 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);258 264 free(ref_git); 259 265 return 0; … … 352 358 if (!link(src->buf, dest->buf)) 353 359 continue; 354 if (option_local )360 if (option_local > 0) 355 361 die_errno(_("failed to create link '%s'"), dest->buf); 356 362 option_no_hardlinks = 1; … … 362 368 } 363 369 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 370 static void clone_local(const char *src_repo, const char *dest_repo) 371 { 371 372 if (option_shared) { 372 373 struct strbuf alt = STRBUF_INIT; … … 384 385 } 385 386 386 remote = remote_get(src_repo);387 transport = transport_get(remote, src_repo);388 ret = transport_get_remote_refs(transport);389 transport_disconnect(transport);390 387 if (0 <= option_verbosity) 391 printf(_("done.\n")); 392 return ret; 388 fprintf(stderr, _("done.\n")); 393 389 } 394 390 … … 396 392 static const char *junk_git_dir; 397 393 static pid_t junk_pid; 394 static enum { 395 JUNK_LEAVE_NONE, 396 JUNK_LEAVE_REPO, 397 JUNK_LEAVE_ALL 398 } junk_mode = JUNK_LEAVE_NONE; 399 400 static const char junk_leave_repo_msg[] = 401 N_("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"); 398 404 399 405 static void remove_junk(void) 400 406 { 401 407 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 402 420 if (getpid() != junk_pid) 403 421 return; … … 421 439 } 422 440 441 static 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 423 461 static struct ref *wanted_peer_refs(const struct ref *refs, 424 462 struct refspec *refspec) … … 428 466 struct ref **tail = head ? &head->next : &local_refs; 429 467 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) 432 492 get_fetch_map(refs, tag_refspec, &tail, 0); 433 493 … … 438 498 { 439 499 const struct ref *r; 500 501 lock_packed_refs(LOCK_DIE_ON_ERROR); 440 502 441 503 for (r = local_refs; r; r = r->next) { 442 504 if (!r->peer_ref) 443 505 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 513 static 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 528 static 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 548 static 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 584 static 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 611 static 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; 449 670 } 450 671 … … 463 684 die("unable to write parameters to config file"); 464 685 } 686 } 687 688 static 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); 465 734 } 466 735 … … 476 745 const struct ref *our_head_points_at; 477 746 struct ref *mapped_refs; 747 const struct ref *ref; 478 748 struct strbuf key = STRBUF_INIT, value = STRBUF_INIT; 479 749 struct strbuf branch_top = STRBUF_INIT, reflog_msg = STRBUF_INIT; 480 750 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; 483 754 484 755 struct refspec *refspec; … … 498 769 usage_msg_opt(_("You must specify a repository to clone."), 499 770 builtin_clone_usage, builtin_clone_options); 771 772 if (option_single_branch == -1) 773 option_single_branch = option_depth ? 1 : 0; 500 774 501 775 if (option_mirror) … … 506 780 die(_("--bare and --origin %s options are incompatible."), 507 781 option_origin); 782 if (real_git_dir) 783 die(_("--bare and --separate-git-dir are incompatible.")); 508 784 option_no_checkout = 1; 509 785 } … … 521 797 else 522 798 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); 526 815 527 816 if (argc == 2) … … 550 839 else { 551 840 work_tree = dir; 552 git_dir = xstrdup(mkpath("%s/.git", dir));841 git_dir = mkpathdup("%s/.git", dir); 553 842 } 554 843 … … 558 847 die_errno(_("could not create leading directories of '%s'"), 559 848 work_tree); 560 if (!dest_exists && mkdir(work_tree, 07 55))849 if (!dest_exists && mkdir(work_tree, 0777)) 561 850 die_errno(_("could not create work tree dir '%s'."), 562 851 work_tree); … … 567 856 sigchain_push_common(remove_junk_on_signal); 568 857 569 setenv(CONFIG_ENVIRONMENT, mkpath("%s/config", git_dir), 1);570 571 858 if (safe_create_leading_directories_const(git_dir) < 0) 572 859 die(_("could not create leading directories of '%s'"), git_dir); 573 860 574 861 set_git_dir_init(git_dir, real_git_dir, 0); 575 if (real_git_dir) 862 if (real_git_dir) { 576 863 git_dir = real_git_dir; 864 junk_git_dir = real_git_dir; 865 } 577 866 578 867 if (0 <= option_verbosity) { 579 868 if (option_bare) 580 printf(_("Cloning into bare repository '%s'...\n"), dir);869 fprintf(stderr, _("Cloning into bare repository '%s'...\n"), dir); 581 870 else 582 printf(_("Cloning into '%s'...\n"), dir);871 fprintf(stderr, _("Cloning into '%s'...\n"), dir); 583 872 } 584 873 init_db(option_template, INIT_DB_QUIET); 585 874 write_config(&option_config); 586 587 /*588 * At this point, the config exists, so we do not need the589 * environment variable. We actually need to unset it, too, to590 * re-enable parsing of the global configs.591 */592 unsetenv(CONFIG_ENVIRONMENT);593 875 594 876 git_config(git_default_config, NULL); … … 605 887 606 888 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 621 889 strbuf_addf(&key, "remote.%s.url", option_origin); 622 890 git_config_set(key.buf, repo); … … 631 899 strbuf_reset(&value); 632 900 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) { 635 928 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) 658 946 transport_fetch_refs(transport, mapped_refs); 659 }660 }661 662 if (refs) {663 clear_extra_refs();664 665 write_remote_refs(mapped_refs);666 947 667 948 remote_head = find_ref_by_name(refs, "HEAD"); … … 670 951 671 952 if (option_branch) { 672 struct strbuf head = STRBUF_INIT;673 strbuf_addstr(&head, src_ref_prefix);674 strbuf_addstr(&head, option_branch);675 953 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); 685 959 } 686 960 else … … 688 962 } 689 963 else { 964 if (option_branch) 965 die(_("Remote branch %s not found in upstream %s"), 966 option_branch, option_origin); 967 690 968 warning(_("You appear to have cloned an empty repository.")); 969 mapped_refs = NULL; 691 970 our_head_points_at = NULL; 692 971 remote_head_points_at = NULL; … … 698 977 } 699 978 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(); 778 997 779 998 strbuf_release(&reflog_msg); … … 781 1000 strbuf_release(&key); 782 1001 strbuf_release(&value); 783 junk_ pid = 0;1002 junk_mode = JUNK_LEAVE_ALL; 784 1003 return err; 785 1004 }
Note:
See TracChangeset
for help on using the changeset viewer.