clone.c 27.8 KB
Newer Older
D
Daniel Barkalow 已提交
1 2 3 4 5 6 7 8 9 10
/*
 * Builtin "git clone"
 *
 * Copyright (c) 2007 Kristian Høgsberg <krh@redhat.com>,
 *		 2008 Daniel Barkalow <barkalow@iabervon.org>
 * Based on git-commit.sh by Junio C Hamano and Linus Torvalds
 *
 * Clone a repository into a different directory that does not yet exist.
 */

S
Stephen Boyd 已提交
11
#include "builtin.h"
12
#include "lockfile.h"
D
Daniel Barkalow 已提交
13 14 15 16 17 18 19 20 21
#include "parse-options.h"
#include "fetch-pack.h"
#include "refs.h"
#include "tree.h"
#include "tree-walk.h"
#include "unpack-trees.h"
#include "transport.h"
#include "strbuf.h"
#include "dir.h"
22
#include "sigchain.h"
23
#include "branch.h"
J
Jay Soffian 已提交
24
#include "remote.h"
25
#include "run-command.h"
26
#include "connected.h"
D
Daniel Barkalow 已提交
27 28 29 30 31 32 33 34 35 36

/*
 * Overall FIXMEs:
 *  - respect DB_ENVIRONMENT for .git/objects.
 *
 * Implementation notes:
 *  - dropping use-separate-remote and no-separate-remote compatibility
 *
 */
static const char * const builtin_clone_usage[] = {
37
	N_("git clone [<options>] [--] <repo> [<dir>]"),
D
Daniel Barkalow 已提交
38 39 40
	NULL
};

41
static int option_no_checkout, option_bare, option_mirror, option_single_branch = -1;
42
static int option_local = -1, option_no_hardlinks, option_shared, option_recursive;
43
static char *option_template, *option_depth;
D
Daniel Barkalow 已提交
44
static char *option_origin = NULL;
45
static char *option_branch = NULL;
46
static const char *real_git_dir;
D
Daniel Barkalow 已提交
47
static char *option_upload_pack = "git-upload-pack";
48
static int option_verbosity;
49
static int option_progress = -1;
50
static struct string_list option_config;
51
static struct string_list option_reference;
52
static int option_dissociate;
53

D
Daniel Barkalow 已提交
54
static struct option builtin_clone_options[] = {
55
	OPT__VERBOSITY(&option_verbosity),
56
	OPT_BOOL(0, "progress", &option_progress,
57
		 N_("force progress reporting")),
58 59
	OPT_BOOL('n', "no-checkout", &option_no_checkout,
		 N_("don't create a checkout")),
60 61 62
	OPT_BOOL(0, "bare", &option_bare, N_("create a bare repository")),
	OPT_HIDDEN_BOOL(0, "naked", &option_bare,
			N_("create a bare repository")),
63 64
	OPT_BOOL(0, "mirror", &option_mirror,
		 N_("create a mirror repository (implies bare)")),
65
	OPT_BOOL('l', "local", &option_local,
66
		N_("to clone from a local repository")),
67
	OPT_BOOL(0, "no-hardlinks", &option_no_hardlinks,
68
		    N_("don't use local hardlinks, always copy")),
69
	OPT_BOOL('s', "shared", &option_shared,
70
		    N_("setup as shared repository")),
71
	OPT_BOOL(0, "recursive", &option_recursive,
72
		    N_("initialize submodules in the clone")),
73
	OPT_BOOL(0, "recurse-submodules", &option_recursive,
74 75 76
		    N_("initialize submodules in the clone")),
	OPT_STRING(0, "template", &option_template, N_("template-directory"),
		   N_("directory from which templates will be used")),
77 78
	OPT_STRING_LIST(0, "reference", &option_reference, N_("repo"),
			N_("reference repository")),
79 80
	OPT_BOOL(0, "dissociate", &option_dissociate,
		 N_("use --reference only while cloning")),
81 82 83 84 85 86 87 88
	OPT_STRING('o', "origin", &option_origin, N_("name"),
		   N_("use <name> instead of 'origin' to track upstream")),
	OPT_STRING('b', "branch", &option_branch, N_("branch"),
		   N_("checkout <branch> instead of the remote's HEAD")),
	OPT_STRING('u', "upload-pack", &option_upload_pack, N_("path"),
		   N_("path to git-upload-pack on the remote")),
	OPT_STRING(0, "depth", &option_depth, N_("depth"),
		    N_("create a shallow clone of that depth")),
89
	OPT_BOOL(0, "single-branch", &option_single_branch,
90 91 92 93 94
		    N_("clone only one branch, HEAD or --branch")),
	OPT_STRING(0, "separate-git-dir", &real_git_dir, N_("gitdir"),
		   N_("separate git dir from working tree")),
	OPT_STRING_LIST('c', "config", &option_config, N_("key=value"),
			N_("set config inside the new repository")),
D
Daniel Barkalow 已提交
95 96 97
	OPT_END()
};

98 99 100 101
static const char *argv_submodule[] = {
	"submodule", "update", "--init", "--recursive", NULL
};

D
Daniel Barkalow 已提交
102 103
static char *get_repo_path(const char *repo, int *is_bundle)
{
104
	static char *suffix[] = { "/.git", "", ".git/.git", ".git" };
D
Daniel Barkalow 已提交
105 106 107 108 109 110 111
	static char *bundle_suffix[] = { ".bundle", "" };
	struct stat st;
	int i;

	for (i = 0; i < ARRAY_SIZE(suffix); i++) {
		const char *path;
		path = mkpath("%s%s", repo, suffix[i]);
112 113
		if (stat(path, &st))
			continue;
114
		if (S_ISDIR(st.st_mode) && is_git_directory(path)) {
D
Daniel Barkalow 已提交
115
			*is_bundle = 0;
116
			return xstrdup(absolute_path(path));
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
		} else if (S_ISREG(st.st_mode) && st.st_size > 8) {
			/* Is it a "gitfile"? */
			char signature[8];
			int len, fd = open(path, O_RDONLY);
			if (fd < 0)
				continue;
			len = read_in_full(fd, signature, 8);
			close(fd);
			if (len != 8 || strncmp(signature, "gitdir: ", 8))
				continue;
			path = read_gitfile(path);
			if (path) {
				*is_bundle = 0;
				return xstrdup(absolute_path(path));
			}
D
Daniel Barkalow 已提交
132 133 134 135 136 137 138 139
		}
	}

	for (i = 0; i < ARRAY_SIZE(bundle_suffix); i++) {
		const char *path;
		path = mkpath("%s%s", repo, bundle_suffix[i]);
		if (!stat(path, &st) && S_ISREG(st.st_mode)) {
			*is_bundle = 1;
140
			return xstrdup(absolute_path(path));
D
Daniel Barkalow 已提交
141 142 143 144 145 146
		}
	}

	return NULL;
}

147
static char *guess_dir_name(const char *repo, int is_bundle, int is_bare)
D
Daniel Barkalow 已提交
148
{
149
	const char *end = repo + strlen(repo), *start, *ptr;
150
	size_t len;
151
	char *dir;
152

153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
	/*
	 * Skip scheme.
	 */
	start = strstr(repo, "://");
	if (start == NULL)
		start = repo;
	else
		start += 3;

	/*
	 * Skip authentication data. The stripping does happen
	 * greedily, such that we strip up to the last '@' inside
	 * the host part.
	 */
	for (ptr = start; ptr < end && !is_dir_sep(*ptr); ptr++) {
		if (*ptr == '@')
			start = ptr + 1;
	}

172
	/*
173
	 * Strip trailing spaces, slashes and /.git
174
	 */
175
	while (start < end && (is_dir_sep(end[-1]) || isspace(end[-1])))
176
		end--;
177
	if (end - start > 5 && is_dir_sep(end[-5]) &&
178 179
	    !strncmp(end - 4, ".git", 4)) {
		end -= 5;
180
		while (start < end && is_dir_sep(end[-1]))
181 182 183 184
			end--;
	}

	/*
185 186 187 188
	 * Find last component. To remain backwards compatible we
	 * also regard colons as path separators, such that
	 * cloning a repository 'foo:bar.git' would result in a
	 * directory 'bar' being guessed.
189
	 */
190 191 192 193
	ptr = end;
	while (start < ptr && !is_dir_sep(ptr[-1]) && ptr[-1] != ':')
		ptr--;
	start = ptr;
194 195 196 197

	/*
	 * Strip .{bundle,git}.
	 */
198 199
	len = end - start;
	strip_suffix_mem(start, &len, is_bundle ? ".bundle" : ".git");
D
Daniel Barkalow 已提交
200

201 202 203 204
	if (is_bare)
		dir = xstrfmt("%.*s.git", (int)len, start);
	else
		dir = xstrndup(start, len);
205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
	/*
	 * Replace sequences of 'control' characters and whitespace
	 * with one ascii space, remove leading and trailing spaces.
	 */
	if (*dir) {
		char *out = dir;
		int prev_space = 1 /* strip leading whitespace */;
		for (end = dir; *end; ++end) {
			char ch = *end;
			if ((unsigned char)ch < '\x20')
				ch = '\x20';
			if (isspace(ch)) {
				if (prev_space)
					continue;
				prev_space = 1;
			} else
				prev_space = 0;
			*out++ = ch;
		}
		*out = '\0';
		if (out > dir && prev_space)
			out[-1] = '\0';
227
	}
228
	return dir;
D
Daniel Barkalow 已提交
229 230
}

231 232 233 234 235 236 237 238 239
static void strip_trailing_slashes(char *dir)
{
	char *end = dir + strlen(dir);

	while (dir < end - 1 && is_dir_sep(end[-1]))
		end--;
	*end = '\0';
}

240
static int add_one_reference(struct string_list_item *item, void *cb_data)
D
Daniel Barkalow 已提交
241
{
242
	char *ref_git;
243
	const char *repo;
244
	struct strbuf alternate = STRBUF_INIT;
D
Daniel Barkalow 已提交
245

246
	/* Beware: read_gitfile(), real_path() and mkpath() return static buffer */
247
	ref_git = xstrdup(real_path(item->string));
248 249 250 251 252 253 254 255 256 257

	repo = read_gitfile(ref_git);
	if (!repo)
		repo = read_gitfile(mkpath("%s/.git", ref_git));
	if (repo) {
		free(ref_git);
		ref_git = xstrdup(repo);
	}

	if (!repo && is_directory(mkpath("%s/.git/objects", ref_git))) {
258
		char *ref_git_git = mkpathdup("%s/.git", ref_git);
259 260 261
		free(ref_git);
		ref_git = ref_git_git;
	} else if (!is_directory(mkpath("%s/objects", ref_git)))
262
		die(_("reference repository '%s' is not a local repository."),
263
		    item->string);
D
Daniel Barkalow 已提交
264

265 266 267 268 269 270
	if (!access(mkpath("%s/shallow", ref_git), F_OK))
		die(_("reference repository '%s' is shallow"), item->string);

	if (!access(mkpath("%s/info/grafts", ref_git), F_OK))
		die(_("reference repository '%s' is grafted"), item->string);

271 272 273 274
	strbuf_addf(&alternate, "%s/objects", ref_git);
	add_to_alternates_file(alternate.buf);
	strbuf_release(&alternate);
	free(ref_git);
275 276
	return 0;
}
D
Daniel Barkalow 已提交
277

278 279 280
static void setup_reference(void)
{
	for_each_string_list(&option_reference, add_one_reference, NULL);
D
Daniel Barkalow 已提交
281 282
}

283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318
static void copy_alternates(struct strbuf *src, struct strbuf *dst,
			    const char *src_repo)
{
	/*
	 * Read from the source objects/info/alternates file
	 * and copy the entries to corresponding file in the
	 * destination repository with add_to_alternates_file().
	 * Both src and dst have "$path/objects/info/alternates".
	 *
	 * Instead of copying bit-for-bit from the original,
	 * we need to append to existing one so that the already
	 * created entry via "clone -s" is not lost, and also
	 * to turn entries with paths relative to the original
	 * absolute, so that they can be used in the new repository.
	 */
	FILE *in = fopen(src->buf, "r");
	struct strbuf line = STRBUF_INIT;

	while (strbuf_getline(&line, in, '\n') != EOF) {
		char *abs_path, abs_buf[PATH_MAX];
		if (!line.len || line.buf[0] == '#')
			continue;
		if (is_absolute_path(line.buf)) {
			add_to_alternates_file(line.buf);
			continue;
		}
		abs_path = mkpath("%s/objects/%s", src_repo, line.buf);
		normalize_path_copy(abs_buf, abs_path);
		add_to_alternates_file(abs_buf);
	}
	strbuf_release(&line);
	fclose(in);
}

static void copy_or_link_directory(struct strbuf *src, struct strbuf *dest,
				   const char *src_repo, int src_baselen)
D
Daniel Barkalow 已提交
319 320 321 322 323 324
{
	struct dirent *de;
	struct stat buf;
	int src_len, dest_len;
	DIR *dir;

325
	dir = opendir(src->buf);
D
Daniel Barkalow 已提交
326
	if (!dir)
327
		die_errno(_("failed to open '%s'"), src->buf);
D
Daniel Barkalow 已提交
328

329
	if (mkdir(dest->buf, 0777)) {
D
Daniel Barkalow 已提交
330
		if (errno != EEXIST)
331
			die_errno(_("failed to create directory '%s'"), dest->buf);
332
		else if (stat(dest->buf, &buf))
333
			die_errno(_("failed to stat '%s'"), dest->buf);
D
Daniel Barkalow 已提交
334
		else if (!S_ISDIR(buf.st_mode))
335
			die(_("%s exists and is not a directory"), dest->buf);
D
Daniel Barkalow 已提交
336 337
	}

338 339 340 341
	strbuf_addch(src, '/');
	src_len = src->len;
	strbuf_addch(dest, '/');
	dest_len = dest->len;
D
Daniel Barkalow 已提交
342 343

	while ((de = readdir(dir)) != NULL) {
344 345 346 347 348
		strbuf_setlen(src, src_len);
		strbuf_addstr(src, de->d_name);
		strbuf_setlen(dest, dest_len);
		strbuf_addstr(dest, de->d_name);
		if (stat(src->buf, &buf)) {
349
			warning (_("failed to stat %s\n"), src->buf);
D
Daniel Barkalow 已提交
350 351 352 353
			continue;
		}
		if (S_ISDIR(buf.st_mode)) {
			if (de->d_name[0] != '.')
354 355 356 357 358 359 360 361
				copy_or_link_directory(src, dest,
						       src_repo, src_baselen);
			continue;
		}

		/* Files that cannot be copied bit-for-bit... */
		if (!strcmp(src->buf + src_baselen, "/info/alternates")) {
			copy_alternates(src, dest, src_repo);
D
Daniel Barkalow 已提交
362 363 364
			continue;
		}

365
		if (unlink(dest->buf) && errno != ENOENT)
366
			die_errno(_("failed to unlink '%s'"), dest->buf);
367
		if (!option_no_hardlinks) {
368
			if (!link(src->buf, dest->buf))
369
				continue;
370
			if (option_local > 0)
371
				die_errno(_("failed to create link '%s'"), dest->buf);
372
			option_no_hardlinks = 1;
D
Daniel Barkalow 已提交
373
		}
374
		if (copy_file_with_time(dest->buf, src->buf, 0666))
375
			die_errno(_("failed to copy file to '%s'"), dest->buf);
D
Daniel Barkalow 已提交
376
	}
377
	closedir(dir);
D
Daniel Barkalow 已提交
378 379
}

380
static void clone_local(const char *src_repo, const char *dest_repo)
D
Daniel Barkalow 已提交
381
{
382 383 384 385 386 387 388 389
	if (option_shared) {
		struct strbuf alt = STRBUF_INIT;
		strbuf_addf(&alt, "%s/objects", src_repo);
		add_to_alternates_file(alt.buf);
		strbuf_release(&alt);
	} else {
		struct strbuf src = STRBUF_INIT;
		struct strbuf dest = STRBUF_INIT;
390 391
		strbuf_addf(&src, "%s/objects", src_repo);
		strbuf_addf(&dest, "%s/objects", dest_repo);
392
		copy_or_link_directory(&src, &dest, src_repo, src.len);
393 394
		strbuf_release(&src);
		strbuf_release(&dest);
D
Daniel Barkalow 已提交
395 396
	}

397
	if (0 <= option_verbosity)
398
		fprintf(stderr, _("done.\n"));
D
Daniel Barkalow 已提交
399 400 401 402
}

static const char *junk_work_tree;
static const char *junk_git_dir;
403
static enum {
404 405 406 407 408 409 410 411 412
	JUNK_LEAVE_NONE,
	JUNK_LEAVE_REPO,
	JUNK_LEAVE_ALL
} junk_mode = JUNK_LEAVE_NONE;

static const char junk_leave_repo_msg[] =
N_("Clone succeeded, but checkout failed.\n"
   "You can inspect what was checked out with 'git status'\n"
   "and retry the checkout with 'git checkout -f HEAD'\n");
D
Daniel Barkalow 已提交
413 414 415

static void remove_junk(void)
{
416
	struct strbuf sb = STRBUF_INIT;
417 418 419 420 421 422 423 424 425 426 427 428

	switch (junk_mode) {
	case JUNK_LEAVE_REPO:
		warning("%s", _(junk_leave_repo_msg));
		/* fall-through */
	case JUNK_LEAVE_ALL:
		return;
	default:
		/* proceed to removal */
		break;
	}

D
Daniel Barkalow 已提交
429 430 431 432 433 434 435 436 437 438 439 440 441 442 443
	if (junk_git_dir) {
		strbuf_addstr(&sb, junk_git_dir);
		remove_dir_recursively(&sb, 0);
		strbuf_reset(&sb);
	}
	if (junk_work_tree) {
		strbuf_addstr(&sb, junk_work_tree);
		remove_dir_recursively(&sb, 0);
		strbuf_reset(&sb);
	}
}

static void remove_junk_on_signal(int signo)
{
	remove_junk();
444
	sigchain_pop(signo);
D
Daniel Barkalow 已提交
445 446 447
	raise(signo);
}

448 449 450 451 452 453 454 455
static struct ref *find_remote_branch(const struct ref *refs, const char *branch)
{
	struct ref *ref;
	struct strbuf head = STRBUF_INIT;
	strbuf_addstr(&head, "refs/heads/");
	strbuf_addstr(&head, branch);
	ref = find_ref_by_name(refs, head.buf);
	strbuf_release(&head);
456 457 458 459 460 461 462 463 464

	if (ref)
		return ref;

	strbuf_addstr(&head, "refs/tags/");
	strbuf_addstr(&head, branch);
	ref = find_ref_by_name(refs, head.buf);
	strbuf_release(&head);

465 466 467
	return ref;
}

468 469
static struct ref *wanted_peer_refs(const struct ref *refs,
		struct refspec *refspec)
D
Daniel Barkalow 已提交
470
{
J
Jeff King 已提交
471 472 473
	struct ref *head = copy_ref(find_ref_by_name(refs, "HEAD"));
	struct ref *local_refs = head;
	struct ref **tail = head ? &head->next : &local_refs;
D
Daniel Barkalow 已提交
474

475 476 477 478 479
	if (option_single_branch) {
		struct ref *remote_head = NULL;

		if (!option_branch)
			remote_head = guess_remote_head(head, refs, 0);
480 481 482 483 484
		else {
			local_refs = NULL;
			tail = &local_refs;
			remote_head = copy_ref(find_remote_branch(refs, option_branch));
		}
485 486 487 488

		if (!remote_head && option_branch)
			warning(_("Could not find remote branch %s to clone."),
				option_branch);
489
		else {
490
			get_fetch_map(remote_head, refspec, &tail, 0);
491 492 493 494

			/* if --branch=tag, pull the requested tag explicitly */
			get_fetch_map(remote_head, tag_refspec, &tail, 0);
		}
495 496 497 498
	} else
		get_fetch_map(refs, refspec, &tail, 0);

	if (!option_mirror && !option_single_branch)
499
		get_fetch_map(refs, tag_refspec, &tail, 0);
D
Daniel Barkalow 已提交
500

501 502 503 504 505 506 507
	return local_refs;
}

static void write_remote_refs(const struct ref *local_refs)
{
	const struct ref *r;

508 509
	lock_packed_refs(LOCK_DIE_ON_ERROR);

J
Jeff King 已提交
510 511 512
	for (r = local_refs; r; r = r->next) {
		if (!r->peer_ref)
			continue;
513
		add_packed_ref(r->peer_ref->name, r->old_sha1);
J
Jeff King 已提交
514
	}
J
Johan Herland 已提交
515

516 517
	if (commit_packed_refs())
		die_errno("unable to overwrite old ref-pack file");
D
Daniel Barkalow 已提交
518 519
}

520 521 522 523
static void write_followtags(const struct ref *refs, const char *msg)
{
	const struct ref *ref;
	for (ref = refs; ref; ref = ref->next) {
524
		if (!starts_with(ref->name, "refs/tags/"))
525
			continue;
526
		if (ends_with(ref->name, "^{}"))
527 528 529 530
			continue;
		if (!has_sha1_file(ref->old_sha1))
			continue;
		update_ref(msg, ref->name, ref->old_sha1,
531
			   NULL, 0, UPDATE_REFS_DIE_ON_ERR);
532 533 534
	}
}

535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554
static int iterate_ref_map(void *cb_data, unsigned char sha1[20])
{
	struct ref **rm = cb_data;
	struct ref *ref = *rm;

	/*
	 * Skip anything missing a peer_ref, which we are not
	 * actually going to write a ref for.
	 */
	while (ref && !ref->peer_ref)
		ref = ref->next;
	/* Returning -1 notes "end of list" to the caller. */
	if (!ref)
		return -1;

	hashcpy(sha1, ref->old_sha1);
	*rm = ref->next;
	return 0;
}

555 556 557 558
static void update_remote_refs(const struct ref *refs,
			       const struct ref *mapped_refs,
			       const struct ref *remote_head_points_at,
			       const char *branch_top,
559
			       const char *msg,
560
			       struct transport *transport,
561
			       int check_connectivity)
562
{
563 564
	const struct ref *rm = mapped_refs;

565
	if (check_connectivity) {
566
		if (transport->progress)
567
			fprintf(stderr, _("Checking connectivity... "));
568 569
		if (check_everything_connected_with_transport(iterate_ref_map,
							      0, &rm, transport))
570
			die(_("remote did not send all necessary objects"));
571
		if (transport->progress)
572
			fprintf(stderr, _("done.\n"));
573
	}
574

575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590
	if (refs) {
		write_remote_refs(mapped_refs);
		if (option_single_branch)
			write_followtags(refs, msg);
	}

	if (remote_head_points_at && !option_bare) {
		struct strbuf head_ref = STRBUF_INIT;
		strbuf_addstr(&head_ref, branch_top);
		strbuf_addstr(&head_ref, "HEAD");
		create_symref(head_ref.buf,
			      remote_head_points_at->peer_ref->name,
			      msg);
	}
}

591 592 593
static void update_head(const struct ref *our, const struct ref *remote,
			const char *msg)
{
594 595
	const char *head;
	if (our && skip_prefix(our->name, "refs/heads/", &head)) {
596 597 598
		/* Local default branch link */
		create_symref("HEAD", our->name, NULL);
		if (!option_bare) {
599 600
			update_ref(msg, "HEAD", our->old_sha1, NULL, 0,
				   UPDATE_REFS_DIE_ON_ERR);
601 602
			install_branch_config(0, head, option_origin, our->name);
		}
603 604 605 606
	} else if (our) {
		struct commit *c = lookup_commit_reference(our->old_sha1);
		/* --branch specifies a non-branch (i.e. tags), detach HEAD */
		update_ref(msg, "HEAD", c->object.sha1,
607
			   NULL, REF_NODEREF, UPDATE_REFS_DIE_ON_ERR);
608 609 610
	} else if (remote) {
		/*
		 * We know remote HEAD points to a non-branch, or
611
		 * HEAD points to a branch but we don't know which one.
612 613 614
		 * Detach HEAD in all these cases.
		 */
		update_ref(msg, "HEAD", remote->old_sha1,
615
			   NULL, REF_NODEREF, UPDATE_REFS_DIE_ON_ERR);
616 617 618
	}
}

619 620 621 622 623 624 625 626
static int checkout(void)
{
	unsigned char sha1[20];
	char *head;
	struct lock_file *lock_file;
	struct unpack_trees_options opts;
	struct tree *tree;
	struct tree_desc t;
627
	int err = 0;
628 629 630 631

	if (option_no_checkout)
		return 0;

632
	head = resolve_refdup("HEAD", RESOLVE_REF_READING, sha1, NULL);
633 634 635 636 637
	if (!head) {
		warning(_("remote HEAD refers to nonexistent ref, "
			  "unable to checkout.\n"));
		return 0;
	}
638 639 640 641
	if (!strcmp(head, "HEAD")) {
		if (advice_detached_head)
			detach_advice(sha1_to_hex(sha1));
	} else {
642
		if (!starts_with(head, "refs/heads/"))
643 644 645 646 647 648 649 650
			die(_("HEAD not found below refs/heads!"));
	}
	free(head);

	/* We need to be in the new work tree for the checkout */
	setup_work_tree();

	lock_file = xcalloc(1, sizeof(struct lock_file));
651
	hold_locked_index(lock_file, 1);
652 653 654 655 656

	memset(&opts, 0, sizeof opts);
	opts.update = 1;
	opts.merge = 1;
	opts.fn = oneway_merge;
657
	opts.verbose_update = (option_verbosity >= 0);
658 659 660 661 662 663
	opts.src_index = &the_index;
	opts.dst_index = &the_index;

	tree = parse_tree_indirect(sha1);
	parse_tree(tree);
	init_tree_desc(&t, tree->buffer, tree->size);
664 665
	if (unpack_trees(1, &t, &opts) < 0)
		die(_("unable to checkout working tree"));
666

667
	if (write_locked_index(&the_index, lock_file, COMMIT_LOCK))
668 669
		die(_("unable to write new index file"));

670 671
	err |= run_hook_le(NULL, "post-checkout", sha1_to_hex(null_sha1),
			   sha1_to_hex(sha1), "1", NULL);
672 673 674 675 676 677 678

	if (!err && option_recursive)
		err = run_command_v_opt(argv_submodule, RUN_GIT_CMD);

	return err;
}

679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694
static int write_one_config(const char *key, const char *value, void *data)
{
	return git_config_set_multivar(key, value ? value : "true", "^$", 0);
}

static void write_config(struct string_list *config)
{
	int i;

	for (i = 0; i < config->nr; i++) {
		if (git_config_parse_parameter(config->items[i].string,
					       write_one_config, NULL) < 0)
			die("unable to write parameters to config file");
	}
}

695 696 697 698
static void write_refspec_config(const char *src_ref_prefix,
		const struct ref *our_head_points_at,
		const struct ref *remote_head_points_at,
		struct strbuf *branch_top)
699 700 701 702 703 704 705
{
	struct strbuf key = STRBUF_INIT;
	struct strbuf value = STRBUF_INIT;

	if (option_mirror || !option_bare) {
		if (option_single_branch && !option_mirror) {
			if (option_branch) {
706
				if (starts_with(our_head_points_at->name, "refs/tags/"))
707 708 709 710 711 712
					strbuf_addf(&value, "+%s:%s", our_head_points_at->name,
						our_head_points_at->name);
				else
					strbuf_addf(&value, "+%s:%s%s", our_head_points_at->name,
						branch_top->buf, option_branch);
			} else if (remote_head_points_at) {
713 714 715 716
				const char *head = remote_head_points_at->name;
				if (!skip_prefix(head, "refs/heads/", &head))
					die("BUG: remote HEAD points at non-head?");

717
				strbuf_addf(&value, "+%s:%s%s", remote_head_points_at->name,
718
						branch_top->buf, head);
719 720 721 722
			}
			/*
			 * otherwise, the next "git fetch" will
			 * simply fetch from HEAD without updating
723
			 * any remote-tracking branch, which is what
724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746
			 * we want.
			 */
		} else {
			strbuf_addf(&value, "+%s*:%s*", src_ref_prefix, branch_top->buf);
		}
		/* Configure the remote */
		if (value.len) {
			strbuf_addf(&key, "remote.%s.fetch", option_origin);
			git_config_set_multivar(key.buf, value.buf, "^$", 0);
			strbuf_reset(&key);

			if (option_mirror) {
				strbuf_addf(&key, "remote.%s.mirror", option_origin);
				git_config_set(key.buf, "true");
				strbuf_reset(&key);
			}
		}
	}

	strbuf_release(&key);
	strbuf_release(&value);
}

747 748 749 750 751 752 753 754 755 756
static void dissociate_from_references(void)
{
	static const char* argv[] = { "repack", "-a", "-d", NULL };

	if (run_command_v_opt(argv, RUN_GIT_CMD|RUN_COMMAND_NO_STDIN))
		die(_("cannot repack to clean up"));
	if (unlink(git_path("objects/info/alternates")) && errno != ENOENT)
		die_errno(_("cannot unlink temporary alternates file"));
}

D
Daniel Barkalow 已提交
757 758
int cmd_clone(int argc, const char **argv, const char *prefix)
{
759
	int is_bundle = 0, is_local;
D
Daniel Barkalow 已提交
760 761 762
	struct stat buf;
	const char *repo_name, *repo, *work_tree, *git_dir;
	char *path, *dir;
763
	int dest_exists;
D
Daniel Barkalow 已提交
764
	const struct ref *refs, *remote_head;
765 766
	const struct ref *remote_head_points_at;
	const struct ref *our_head_points_at;
D
Daniel Barkalow 已提交
767
	struct ref *mapped_refs;
768
	const struct ref *ref;
769 770
	struct strbuf key = STRBUF_INIT, value = STRBUF_INIT;
	struct strbuf branch_top = STRBUF_INIT, reflog_msg = STRBUF_INIT;
771
	struct transport *transport = NULL;
772
	const char *src_ref_prefix = "refs/heads/";
773
	struct remote *remote;
774
	int err = 0, complete_refs_before_fetch = 1;
D
Daniel Barkalow 已提交
775

776 777
	struct refspec *refspec;
	const char *fetch_pattern;
D
Daniel Barkalow 已提交
778

J
Jeff King 已提交
779
	packet_trace_identity("clone");
780
	argc = parse_options(argc, argv, prefix, builtin_clone_options,
D
Daniel Barkalow 已提交
781 782
			     builtin_clone_usage, 0);

J
Jonathan Nieder 已提交
783
	if (argc > 2)
784
		usage_msg_opt(_("Too many arguments."),
J
Jonathan Nieder 已提交
785 786
			builtin_clone_usage, builtin_clone_options);

D
Daniel Barkalow 已提交
787
	if (argc == 0)
788
		usage_msg_opt(_("You must specify a repository to clone."),
J
Jonathan Nieder 已提交
789
			builtin_clone_usage, builtin_clone_options);
D
Daniel Barkalow 已提交
790

791 792 793
	if (option_single_branch == -1)
		option_single_branch = option_depth ? 1 : 0;

794 795 796
	if (option_mirror)
		option_bare = 1;

D
Daniel Barkalow 已提交
797 798
	if (option_bare) {
		if (option_origin)
799
			die(_("--bare and --origin %s options are incompatible."),
D
Daniel Barkalow 已提交
800
			    option_origin);
801 802
		if (real_git_dir)
			die(_("--bare and --separate-git-dir are incompatible."));
D
Daniel Barkalow 已提交
803 804 805 806 807 808 809 810 811 812
		option_no_checkout = 1;
	}

	if (!option_origin)
		option_origin = "origin";

	repo_name = argv[0];

	path = get_repo_path(repo_name, &is_bundle);
	if (path)
813
		repo = xstrdup(absolute_path(repo_name));
D
Daniel Barkalow 已提交
814
	else if (!strchr(repo_name, ':'))
815
		die(_("repository '%s' does not exist"), repo_name);
D
Daniel Barkalow 已提交
816 817 818
	else
		repo = repo_name;

819 820 821 822
	/* no need to be strict, transport_set_option() will validate it again */
	if (option_depth && atoi(option_depth) < 1)
		die(_("depth %s is not a positive number"), option_depth);

D
Daniel Barkalow 已提交
823 824 825
	if (argc == 2)
		dir = xstrdup(argv[1]);
	else
826
		dir = guess_dir_name(repo_name, is_bundle, option_bare);
827
	strip_trailing_slashes(dir);
D
Daniel Barkalow 已提交
828

829 830
	dest_exists = !stat(dir, &buf);
	if (dest_exists && !is_empty_dir(dir))
831 832
		die(_("destination path '%s' already exists and is not "
			"an empty directory."), dir);
D
Daniel Barkalow 已提交
833 834 835 836 837 838 839 840

	strbuf_addf(&reflog_msg, "clone: from %s", repo);

	if (option_bare)
		work_tree = NULL;
	else {
		work_tree = getenv("GIT_WORK_TREE");
		if (work_tree && !stat(work_tree, &buf))
841
			die(_("working tree '%s' already exists."), work_tree);
D
Daniel Barkalow 已提交
842 843 844 845 846 847
	}

	if (option_bare || work_tree)
		git_dir = xstrdup(dir);
	else {
		work_tree = dir;
848
		git_dir = mkpathdup("%s/.git", dir);
D
Daniel Barkalow 已提交
849 850
	}

851 852 853
	atexit(remove_junk);
	sigchain_push_common(remove_junk_on_signal);

D
Daniel Barkalow 已提交
854
	if (!option_bare) {
855
		if (safe_create_leading_directories_const(work_tree) < 0)
856
			die_errno(_("could not create leading directories of '%s'"),
857
				  work_tree);
858
		if (!dest_exists && mkdir(work_tree, 0777))
859
			die_errno(_("could not create work tree dir '%s'"),
860
				  work_tree);
861
		junk_work_tree = work_tree;
D
Daniel Barkalow 已提交
862 863 864
		set_git_work_tree(work_tree);
	}

865
	junk_git_dir = git_dir;
866
	if (safe_create_leading_directories_const(git_dir) < 0)
867
		die(_("could not create leading directories of '%s'"), git_dir);
868 869

	set_git_dir_init(git_dir, real_git_dir, 0);
870
	if (real_git_dir) {
871
		git_dir = real_git_dir;
872 873
		junk_git_dir = real_git_dir;
	}
D
Daniel Barkalow 已提交
874

875 876
	if (0 <= option_verbosity) {
		if (option_bare)
877
			fprintf(stderr, _("Cloning into bare repository '%s'...\n"), dir);
878
		else
879
			fprintf(stderr, _("Cloning into '%s'...\n"), dir);
880
	}
881
	init_db(option_template, INIT_DB_QUIET);
882
	write_config(&option_config);
D
Daniel Barkalow 已提交
883

J
Junio C Hamano 已提交
884
	git_config(git_default_config, NULL);
D
Daniel Barkalow 已提交
885 886

	if (option_bare) {
887 888
		if (option_mirror)
			src_ref_prefix = "refs/";
889
		strbuf_addstr(&branch_top, src_ref_prefix);
D
Daniel Barkalow 已提交
890 891 892

		git_config_set("core.bare", "true");
	} else {
893
		strbuf_addf(&branch_top, "refs/remotes/%s/", option_origin);
894
	}
D
Daniel Barkalow 已提交
895

896
	strbuf_addf(&value, "+%s*:%s*", src_ref_prefix, branch_top.buf);
897 898 899 900
	strbuf_addf(&key, "remote.%s.url", option_origin);
	git_config_set(key.buf, repo);
	strbuf_reset(&key);

901 902
	if (option_reference.nr)
		setup_reference();
903 904 905 906
	else if (option_dissociate) {
		warning(_("--dissociate given, but there is no --reference"));
		option_dissociate = 0;
	}
907

908 909 910 911
	fetch_pattern = value.buf;
	refspec = parse_fetch_refspec(1, &fetch_pattern);

	strbuf_reset(&value);
D
Daniel Barkalow 已提交
912

913 914
	remote = remote_get(option_origin);
	transport = transport_get(remote, remote->url[0]);
915 916
	transport_set_verbosity(transport, option_verbosity, option_progress);

917 918 919 920 921 922 923 924 925 926 927 928 929
	path = get_repo_path(remote->url[0], &is_bundle);
	is_local = option_local != 0 && path && !is_bundle;
	if (is_local) {
		if (option_depth)
			warning(_("--depth is ignored in local clones; use file:// instead."));
		if (!access(mkpath("%s/shallow", path), F_OK)) {
			if (option_local > 0)
				warning(_("source repository is shallow, ignoring --local"));
			is_local = 0;
		}
	}
	if (option_local > 0 && !is_local)
		warning(_("--local is ignored"));
930
	transport->cloning = 1;
D
Daniel Barkalow 已提交
931

J
Jeff King 已提交
932 933
	if (!transport->get_refs_list || (!is_local && !transport->fetch))
		die(_("Don't know how to clone %s"), transport->url);
934

J
Jeff King 已提交
935
	transport_set_option(transport, TRANS_OPT_KEEP, "yes");
D
Daniel Barkalow 已提交
936

J
Jeff King 已提交
937 938 939 940 941
	if (option_depth)
		transport_set_option(transport, TRANS_OPT_DEPTH,
				     option_depth);
	if (option_single_branch)
		transport_set_option(transport, TRANS_OPT_FOLLOWTAGS, "1");
D
Daniel Barkalow 已提交
942

J
Jeff King 已提交
943 944 945
	if (option_upload_pack)
		transport_set_option(transport, TRANS_OPT_UPLOADPACK,
				     option_upload_pack);
946

J
Jeff King 已提交
947 948
	if (transport->smart_options && !option_depth)
		transport->smart_options->check_self_contained_and_connected = 1;
D
Daniel Barkalow 已提交
949

950
	refs = transport_get_remote_refs(transport);
D
Daniel Barkalow 已提交
951

952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968
	if (refs) {
		mapped_refs = wanted_peer_refs(refs, refspec);
		/*
		 * transport_get_remote_refs() may return refs with null sha-1
		 * in mapped_refs (see struct transport->get_refs_list
		 * comment). In that case we need fetch it early because
		 * remote_head code below relies on it.
		 *
		 * for normal clones, transport_get_remote_refs() should
		 * return reliable ref set, we can delay cloning until after
		 * remote HEAD check.
		 */
		for (ref = refs; ref; ref = ref->next)
			if (is_null_sha1(ref->old_sha1)) {
				complete_refs_before_fetch = 0;
				break;
			}
969

970 971
		if (!is_local && !complete_refs_before_fetch)
			transport_fetch_refs(transport, mapped_refs);
D
Daniel Barkalow 已提交
972

973
		remote_head = find_ref_by_name(refs, "HEAD");
974 975 976 977 978
		remote_head_points_at =
			guess_remote_head(remote_head, mapped_refs, 0);

		if (option_branch) {
			our_head_points_at =
979
				find_remote_branch(mapped_refs, option_branch);
980

981 982 983
			if (!our_head_points_at)
				die(_("Remote branch %s not found in upstream %s"),
				    option_branch, option_origin);
984 985 986
		}
		else
			our_head_points_at = remote_head_points_at;
987 988
	}
	else {
989 990 991 992
		if (option_branch)
			die(_("Remote branch %s not found in upstream %s"),
					option_branch, option_origin);

993
		warning(_("You appear to have cloned an empty repository."));
994
		mapped_refs = NULL;
995 996
		our_head_points_at = NULL;
		remote_head_points_at = NULL;
997 998
		remote_head = NULL;
		option_no_checkout = 1;
999
		if (!option_bare)
1000
			install_branch_config(0, "master", option_origin,
1001
					      "refs/heads/master");
1002
	}
D
Daniel Barkalow 已提交
1003

1004 1005 1006
	write_refspec_config(src_ref_prefix, our_head_points_at,
			remote_head_points_at, &branch_top);

1007 1008
	if (is_local)
		clone_local(path, git_dir);
1009
	else if (refs && complete_refs_before_fetch)
1010
		transport_fetch_refs(transport, mapped_refs);
D
Daniel Barkalow 已提交
1011

1012
	update_remote_refs(refs, mapped_refs, remote_head_points_at,
1013
			   branch_top.buf, reflog_msg.buf, transport, !is_local);
D
Daniel Barkalow 已提交
1014

1015
	update_head(our_head_points_at, remote_head, reflog_msg.buf);
1016

1017 1018
	transport_unlock_pack(transport);
	transport_disconnect(transport);
1019

1020 1021 1022
	if (option_dissociate)
		dissociate_from_references();

1023
	junk_mode = JUNK_LEAVE_REPO;
1024
	err = checkout();
D
Daniel Barkalow 已提交
1025 1026

	strbuf_release(&reflog_msg);
1027 1028 1029
	strbuf_release(&branch_top);
	strbuf_release(&key);
	strbuf_release(&value);
1030
	junk_mode = JUNK_LEAVE_ALL;
1031 1032

	free(refspec);
1033
	return err;
D
Daniel Barkalow 已提交
1034
}