checkout.c 24.1 KB
Newer Older
D
Daniel Barkalow 已提交
1 2 3 4 5 6 7
#include "cache.h"
#include "builtin.h"
#include "parse-options.h"
#include "refs.h"
#include "commit.h"
#include "tree.h"
#include "tree-walk.h"
8
#include "cache-tree.h"
D
Daniel Barkalow 已提交
9 10 11 12 13 14 15
#include "unpack-trees.h"
#include "dir.h"
#include "run-command.h"
#include "merge-recursive.h"
#include "branch.h"
#include "diff.h"
#include "revision.h"
16
#include "remote.h"
17 18 19
#include "blob.h"
#include "xdiff-interface.h"
#include "ll-merge.h"
20
#include "resolve-undo.h"
D
Daniel Barkalow 已提交
21 22 23 24 25 26 27

static const char * const checkout_usage[] = {
	"git checkout [options] <branch>",
	"git checkout [options] [<branch>] -- <file>...",
	NULL,
};

28 29 30 31
struct checkout_opts {
	int quiet;
	int merge;
	int force;
32
	int writeout_stage;
33 34 35
	int writeout_error;

	const char *new_branch;
36
	const char *new_orphan_branch;
37 38 39 40
	int new_branch_log;
	enum branch_track track;
};

D
Daniel Barkalow 已提交
41 42 43
static int post_checkout_hook(struct commit *old, struct commit *new,
			      int changed)
{
44 45 46 47
	return run_hook(NULL, "post-checkout",
			sha1_to_hex(old ? old->object.sha1 : null_sha1),
			sha1_to_hex(new ? new->object.sha1 : null_sha1),
			changed ? "1" : "0", NULL);
48 49
	/* "new" can be NULL when checking out from the index before
	   a commit exists. */
50

D
Daniel Barkalow 已提交
51 52 53
}

static int update_some(const unsigned char *sha1, const char *base, int baselen,
54
		const char *pathname, unsigned mode, int stage, void *context)
D
Daniel Barkalow 已提交
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
{
	int len;
	struct cache_entry *ce;

	if (S_ISDIR(mode))
		return READ_TREE_RECURSIVE;

	len = baselen + strlen(pathname);
	ce = xcalloc(1, cache_entry_size(len));
	hashcpy(ce->sha1, sha1);
	memcpy(ce->name, base, baselen);
	memcpy(ce->name + baselen, pathname, len - baselen);
	ce->ce_flags = create_ce_flags(len, 0);
	ce->ce_mode = create_ce_mode(mode);
	add_cache_entry(ce, ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE);
	return 0;
}

static int read_tree_some(struct tree *tree, const char **pathspec)
{
75
	read_tree_recursive(tree, "", 0, 0, pathspec, update_some, NULL);
D
Daniel Barkalow 已提交
76 77 78 79 80 81 82 83

	/* update the index with the given tree's info
	 * for all args, expanding wildcards, and exit
	 * with any non-zero return code.
	 */
	return 0;
}

84 85 86 87 88 89 90 91
static int skip_same_name(struct cache_entry *ce, int pos)
{
	while (++pos < active_nr &&
	       !strcmp(active_cache[pos]->name, ce->name))
		; /* skip */
	return pos;
}

92 93 94 95 96 97 98 99 100 101 102 103 104
static int check_stage(int stage, struct cache_entry *ce, int pos)
{
	while (pos < active_nr &&
	       !strcmp(active_cache[pos]->name, ce->name)) {
		if (ce_stage(active_cache[pos]) == stage)
			return 0;
		pos++;
	}
	return error("path '%s' does not have %s version",
		     ce->name,
		     (stage == 2) ? "our" : "their");
}

105 106 107 108 109 110 111 112 113 114 115 116 117
static int check_all_stages(struct cache_entry *ce, int pos)
{
	if (ce_stage(ce) != 1 ||
	    active_nr <= pos + 2 ||
	    strcmp(active_cache[pos+1]->name, ce->name) ||
	    ce_stage(active_cache[pos+1]) != 2 ||
	    strcmp(active_cache[pos+2]->name, ce->name) ||
	    ce_stage(active_cache[pos+2]) != 3)
		return error("path '%s' does not have all three versions",
			     ce->name);
	return 0;
}

118 119 120 121 122 123 124 125 126 127 128 129 130
static int checkout_stage(int stage, struct cache_entry *ce, int pos,
			  struct checkout *state)
{
	while (pos < active_nr &&
	       !strcmp(active_cache[pos]->name, ce->name)) {
		if (ce_stage(active_cache[pos]) == stage)
			return checkout_entry(active_cache[pos], state, NULL);
		pos++;
	}
	return error("path '%s' does not have %s version",
		     ce->name,
		     (stage == 2) ? "our" : "their");
}
131

132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
static int checkout_merged(int pos, struct checkout *state)
{
	struct cache_entry *ce = active_cache[pos];
	const char *path = ce->name;
	mmfile_t ancestor, ours, theirs;
	int status;
	unsigned char sha1[20];
	mmbuffer_t result_buf;

	if (ce_stage(ce) != 1 ||
	    active_nr <= pos + 2 ||
	    strcmp(active_cache[pos+1]->name, path) ||
	    ce_stage(active_cache[pos+1]) != 2 ||
	    strcmp(active_cache[pos+2]->name, path) ||
	    ce_stage(active_cache[pos+2]) != 3)
		return error("path '%s' does not have all 3 versions", path);

149 150 151
	read_mmblob(&ancestor, active_cache[pos]->sha1);
	read_mmblob(&ours, active_cache[pos+1]->sha1);
	read_mmblob(&theirs, active_cache[pos+2]->sha1);
152

153
	status = ll_merge(&result_buf, path, &ancestor, "base",
154
			  &ours, "ours", &theirs, "theirs", 0);
155 156 157 158 159 160 161 162 163 164 165
	free(ancestor.ptr);
	free(ours.ptr);
	free(theirs.ptr);
	if (status < 0 || !result_buf.ptr) {
		free(result_buf.ptr);
		return error("path '%s': cannot merge", path);
	}

	/*
	 * NEEDSWORK:
	 * There is absolutely no reason to write this as a blob object
M
Mike Ralphson 已提交
166
	 * and create a phony cache entry just to leak.  This hack is
167 168 169 170 171 172 173 174 175 176 177 178 179 180
	 * primarily to get to the write_entry() machinery that massages
	 * the contents to work-tree format and writes out which only
	 * allows it for a cache entry.  The code in write_entry() needs
	 * to be refactored to allow us to feed a <buffer, size, mode>
	 * instead of a cache entry.  Such a refactoring would help
	 * merge_recursive as well (it also writes the merge result to the
	 * object database even when it may contain conflicts).
	 */
	if (write_sha1_file(result_buf.ptr, result_buf.size,
			    blob_type, sha1))
		die("Unable to add merge result for '%s'", path);
	ce = make_cache_entry(create_ce_mode(active_cache[pos+1]->ce_mode),
			      sha1,
			      path, 2, 0);
181 182
	if (!ce)
		die("make_cache_entry failed for path '%s'", path);
183 184 185
	status = checkout_entry(ce, state, NULL);
	return status;
}
186

187 188
static int checkout_paths(struct tree *source_tree, const char **pathspec,
			  struct checkout_opts *opts)
D
Daniel Barkalow 已提交
189 190 191 192 193 194 195
{
	int pos;
	struct checkout state;
	static char *ps_matched;
	unsigned char rev[20];
	int flag;
	struct commit *head;
196
	int errs = 0;
197
	int stage = opts->writeout_stage;
198
	int merge = opts->merge;
199 200 201 202
	int newfd;
	struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));

	newfd = hold_locked_index(lock_file, 1);
203
	if (read_cache_preload(pathspec) < 0)
204
		return error("corrupt index file");
205 206 207 208

	if (source_tree)
		read_tree_some(source_tree, pathspec);

D
Daniel Barkalow 已提交
209 210 211 212 213 214
	for (pos = 0; pathspec[pos]; pos++)
		;
	ps_matched = xcalloc(1, pos);

	for (pos = 0; pos < active_nr; pos++) {
		struct cache_entry *ce = active_cache[pos];
215
		match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, ps_matched);
D
Daniel Barkalow 已提交
216 217 218 219 220
	}

	if (report_path_error(ps_matched, pathspec, 0))
		return 1;

221 222 223 224
	/* "checkout -m path" to recreate conflicted state */
	if (opts->merge)
		unmerge_cache(pathspec);

225 226 227
	/* Any unmerged paths? */
	for (pos = 0; pos < active_nr; pos++) {
		struct cache_entry *ce = active_cache[pos];
228
		if (match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, NULL)) {
229 230
			if (!ce_stage(ce))
				continue;
231 232
			if (opts->force) {
				warning("path '%s' is unmerged", ce->name);
233 234
			} else if (stage) {
				errs |= check_stage(stage, ce, pos);
235 236
			} else if (opts->merge) {
				errs |= check_all_stages(ce, pos);
237 238 239 240
			} else {
				errs = 1;
				error("path '%s' is unmerged", ce->name);
			}
241 242 243 244 245 246
			pos = skip_same_name(ce, pos) - 1;
		}
	}
	if (errs)
		return 1;

247
	/* Now we are committed to check them out */
D
Daniel Barkalow 已提交
248 249 250 251 252
	memset(&state, 0, sizeof(state));
	state.force = 1;
	state.refresh_cache = 1;
	for (pos = 0; pos < active_nr; pos++) {
		struct cache_entry *ce = active_cache[pos];
253
		if (match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, NULL)) {
254 255 256 257
			if (!ce_stage(ce)) {
				errs |= checkout_entry(ce, &state, NULL);
				continue;
			}
258 259
			if (stage)
				errs |= checkout_stage(stage, ce, pos, &state);
260 261
			else if (merge)
				errs |= checkout_merged(pos, &state);
262
			pos = skip_same_name(ce, pos) - 1;
D
Daniel Barkalow 已提交
263 264 265
		}
	}

266 267 268 269
	if (write_cache(newfd, active_cache, active_nr) ||
	    commit_locked_index(lock_file))
		die("unable to write new index file");

D
Daniel Barkalow 已提交
270 271 272
	resolve_ref("HEAD", rev, 0, &flag);
	head = lookup_commit_reference_gently(rev, 1);

273 274
	errs |= post_checkout_hook(head, head, 0);
	return errs;
D
Daniel Barkalow 已提交
275 276 277 278 279 280 281 282 283
}

static void show_local_changes(struct object *head)
{
	struct rev_info rev;
	/* I think we want full paths, even if we're in a subdirectory. */
	init_revisions(&rev, NULL);
	rev.abbrev = 0;
	rev.diffopt.output_format |= DIFF_FORMAT_NAME_STATUS;
284 285
	if (diff_setup_done(&rev.diffopt) < 0)
		die("diff_setup_done failed");
D
Daniel Barkalow 已提交
286 287 288 289 290 291
	add_pending_object(&rev, head, NULL);
	run_diff_index(&rev, 0);
}

static void describe_detached_head(char *msg, struct commit *commit)
{
292
	struct strbuf sb = STRBUF_INIT;
293
	struct pretty_print_context ctx = {0};
D
Daniel Barkalow 已提交
294
	parse_commit(commit);
295
	pretty_print_commit(CMIT_FMT_ONELINE, commit, &sb, &ctx);
D
Daniel Barkalow 已提交
296 297 298 299 300
	fprintf(stderr, "%s %s... %s\n", msg,
		find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV), sb.buf);
	strbuf_release(&sb);
}

301
static int reset_tree(struct tree *tree, struct checkout_opts *o, int worktree)
D
Daniel Barkalow 已提交
302 303 304
{
	struct unpack_trees_options opts;
	struct tree_desc tree_desc;
305

D
Daniel Barkalow 已提交
306 307
	memset(&opts, 0, sizeof(opts));
	opts.head_idx = -1;
308 309
	opts.update = worktree;
	opts.skip_unmerged = !worktree;
D
Daniel Barkalow 已提交
310 311 312
	opts.reset = 1;
	opts.merge = 1;
	opts.fn = oneway_merge;
313
	opts.verbose_update = !o->quiet;
314 315
	opts.src_index = &the_index;
	opts.dst_index = &the_index;
D
Daniel Barkalow 已提交
316 317
	parse_tree(tree);
	init_tree_desc(&tree_desc, tree->buffer, tree->size);
318 319 320 321 322 323 324 325 326 327 328 329
	switch (unpack_trees(1, &tree_desc, &opts)) {
	case -2:
		o->writeout_error = 1;
		/*
		 * We return 0 nevertheless, as the index is all right
		 * and more importantly we have made best efforts to
		 * update paths in the work tree, and we cannot revert
		 * them.
		 */
	case 0:
		return 0;
	default:
330
		return 128;
331
	}
D
Daniel Barkalow 已提交
332 333 334 335 336 337 338 339 340 341
}

struct branch_info {
	const char *name; /* The short name used */
	const char *path; /* The full name of a real branch */
	struct commit *commit; /* The named commit */
};

static void setup_branch_path(struct branch_info *branch)
{
342
	struct strbuf buf = STRBUF_INIT;
343

344 345
	strbuf_branchname(&buf, branch->name);
	if (strcmp(buf.buf, branch->name))
346
		branch->name = xstrdup(buf.buf);
347
	strbuf_splice(&buf, 0, 0, "refs/heads/", 11);
D
Daniel Barkalow 已提交
348 349 350 351
	branch->path = strbuf_detach(&buf, NULL);
}

static int merge_working_tree(struct checkout_opts *opts,
352
			      struct branch_info *old, struct branch_info *new)
D
Daniel Barkalow 已提交
353 354 355 356
{
	int ret;
	struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
	int newfd = hold_locked_index(lock_file, 1);
357

358
	if (read_cache_preload(NULL) < 0)
359
		return error("corrupt index file");
D
Daniel Barkalow 已提交
360

361
	resolve_undo_clear();
D
Daniel Barkalow 已提交
362
	if (opts->force) {
363
		ret = reset_tree(new->commit->tree, opts, 1);
D
Daniel Barkalow 已提交
364 365 366 367 368 369
		if (ret)
			return ret;
	} else {
		struct tree_desc trees[2];
		struct tree *tree;
		struct unpack_trees_options topts;
370

D
Daniel Barkalow 已提交
371 372
		memset(&topts, 0, sizeof(topts));
		topts.head_idx = -1;
373 374
		topts.src_index = &the_index;
		topts.dst_index = &the_index;
D
Daniel Barkalow 已提交
375

376 377
		topts.msgs.not_uptodate_file = "You have local changes to '%s'; cannot switch branches.";

D
Daniel Barkalow 已提交
378 379 380
		refresh_cache(REFRESH_QUIET);

		if (unmerged_cache()) {
381 382
			error("you need to resolve your current index first");
			return 1;
D
Daniel Barkalow 已提交
383
		}
384 385

		/* 2-way merge to the new branch */
386
		topts.initial_checkout = is_cache_unborn();
387 388
		topts.update = 1;
		topts.merge = 1;
389
		topts.gently = opts->merge && old->commit;
390 391 392
		topts.verbose_update = !opts->quiet;
		topts.fn = twoway_merge;
		topts.dir = xcalloc(1, sizeof(*topts.dir));
393
		topts.dir->flags |= DIR_SHOW_IGNORED;
394
		topts.dir->exclude_per_dir = ".gitignore";
395 396 397
		tree = parse_tree_indirect(old->commit ?
					   old->commit->object.sha1 :
					   (unsigned char *)EMPTY_TREE_SHA1_BIN);
398 399 400 401
		init_tree_desc(&trees[0], tree->buffer, tree->size);
		tree = parse_tree_indirect(new->commit->object.sha1);
		init_tree_desc(&trees[1], tree->buffer, tree->size);

402
		ret = unpack_trees(2, trees, &topts);
403
		if (ret == -1) {
D
Daniel Barkalow 已提交
404 405 406 407 408 409 410
			/*
			 * Unpack couldn't do a trivial merge; either
			 * give up or do a real merge, depending on
			 * whether the merge flag was used.
			 */
			struct tree *result;
			struct tree *work;
411
			struct merge_options o;
D
Daniel Barkalow 已提交
412 413
			if (!opts->merge)
				return 1;
414 415 416 417 418 419 420

			/*
			 * Without old->commit, the below is the same as
			 * the two-tree unpack we already tried and failed.
			 */
			if (!old->commit)
				return 1;
D
Daniel Barkalow 已提交
421 422 423 424 425 426 427 428 429 430 431 432 433 434

			/* Do more real merge */

			/*
			 * We update the index fully, then write the
			 * tree from the index, then merge the new
			 * branch with the current tree, with the old
			 * branch as the base. Then we reset the index
			 * (but not the working tree) to the new
			 * branch, leaving the working tree as the
			 * merged version, but skipping unmerged
			 * entries in the index.
			 */

435
			add_files_to_cache(NULL, NULL, 0);
436 437 438
			init_merge_options(&o);
			o.verbosity = 0;
			work = write_tree_from_memory(&o);
D
Daniel Barkalow 已提交
439

440
			ret = reset_tree(new->commit->tree, opts, 1);
D
Daniel Barkalow 已提交
441 442
			if (ret)
				return ret;
443
			o.ancestor = old->name;
444 445 446 447
			o.branch1 = new->name;
			o.branch2 = "local";
			merge_trees(&o, new->commit->tree, work,
				old->commit->tree, &result);
448
			ret = reset_tree(new->commit->tree, opts, 0);
449 450
			if (ret)
				return ret;
D
Daniel Barkalow 已提交
451 452 453 454 455 456 457
		}
	}

	if (write_cache(newfd, active_cache, active_nr) ||
	    commit_locked_index(lock_file))
		die("unable to write new index file");

458
	if (!opts->force && !opts->quiet)
D
Daniel Barkalow 已提交
459 460 461 462 463
		show_local_changes(&new->commit->object);

	return 0;
}

464
static void report_tracking(struct branch_info *new)
465
{
466
	struct strbuf sb = STRBUF_INIT;
467
	struct branch *branch = branch_get(new->name);
468

469
	if (!format_tracking_info(branch, &sb))
470
		return;
471 472
	fputs(sb.buf, stdout);
	strbuf_release(&sb);
473
}
474

475 476 477 478 479 480 481 482 483 484 485 486 487 488
static void detach_advice(const char *old_path, const char *new_name)
{
	const char fmt[] =
	"Note: checking out '%s'.\n\n"
	"You are in 'detached HEAD' state. You can look around, make experimental\n"
	"changes and commit them, and you can discard any commits you make in this\n"
	"state without impacting any branches by performing another checkout.\n\n"
	"If you want to create a new branch to retain commits you create, you may\n"
	"do so (now or later) by using -b with the checkout command again. Example:\n\n"
	"  git checkout -b new_branch_name\n\n";

	fprintf(stderr, fmt, new_name);
}

D
Daniel Barkalow 已提交
489 490 491 492
static void update_refs_for_switch(struct checkout_opts *opts,
				   struct branch_info *old,
				   struct branch_info *new)
{
493
	struct strbuf msg = STRBUF_INIT;
D
Daniel Barkalow 已提交
494 495
	const char *old_desc;
	if (opts->new_branch) {
496 497 498
		if (opts->new_orphan_branch) {
			if (opts->new_branch_log && !log_all_ref_updates) {
				int temp;
499
				char log_file[PATH_MAX];
500 501 502 503
				char *ref_name = mkpath("refs/heads/%s", opts->new_orphan_branch);

				temp = log_all_ref_updates;
				log_all_ref_updates = 1;
504
				if (log_ref_setup(ref_name, log_file, sizeof(log_file))) {
505 506 507 508 509 510 511 512 513
					fprintf(stderr, "Can not do reflog for '%s'\n",
					    opts->new_orphan_branch);
					log_all_ref_updates = temp;
					return;
				}
				log_all_ref_updates = temp;
			}
		}
		else
514 515
			create_branch(old->name, opts->new_branch, new->name, 0,
				      opts->new_branch_log, opts->track);
D
Daniel Barkalow 已提交
516 517 518 519 520
		new->name = opts->new_branch;
		setup_branch_path(new);
	}

	old_desc = old->name;
521
	if (!old_desc && old->commit)
D
Daniel Barkalow 已提交
522 523
		old_desc = sha1_to_hex(old->commit->object.sha1);
	strbuf_addf(&msg, "checkout: moving from %s to %s",
524
		    old_desc ? old_desc : "(invalid)", new->name);
D
Daniel Barkalow 已提交
525 526 527 528 529

	if (new->path) {
		create_symref("HEAD", new->path, msg.buf);
		if (!opts->quiet) {
			if (old->path && !strcmp(new->path, old->path))
530
				fprintf(stderr, "Already on '%s'\n",
D
Daniel Barkalow 已提交
531 532
					new->name);
			else
533
				fprintf(stderr, "Switched to%s branch '%s'\n",
D
Daniel Barkalow 已提交
534 535 536
					opts->new_branch ? " a new" : "",
					new->name);
		}
537 538 539 540 541 542 543 544
		if (old->path && old->name) {
			char log_file[PATH_MAX], ref_file[PATH_MAX];

			git_snpath(log_file, sizeof(log_file), "logs/%s", old->path);
			git_snpath(ref_file, sizeof(ref_file), "%s", old->path);
			if (!file_exists(ref_file) && file_exists(log_file))
				remove_path(log_file);
		}
D
Daniel Barkalow 已提交
545 546 547 548
	} else if (strcmp(new->name, "HEAD")) {
		update_ref(msg.buf, "HEAD", new->commit->object.sha1, NULL,
			   REF_NODEREF, DIE_ON_ERR);
		if (!opts->quiet) {
549 550
			if (old->path && advice_detached_head)
				detach_advice(old->path, new->name);
D
Daniel Barkalow 已提交
551 552 553 554 555
			describe_detached_head("HEAD is now at", new->commit);
		}
	}
	remove_branch_state();
	strbuf_release(&msg);
556
	if (!opts->quiet && (new->path || !strcmp(new->name, "HEAD")))
557
		report_tracking(new);
D
Daniel Barkalow 已提交
558 559
}

560
static int switch_branches(struct checkout_opts *opts, struct branch_info *new)
D
Daniel Barkalow 已提交
561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582
{
	int ret = 0;
	struct branch_info old;
	unsigned char rev[20];
	int flag;
	memset(&old, 0, sizeof(old));
	old.path = resolve_ref("HEAD", rev, 0, &flag);
	old.commit = lookup_commit_reference_gently(rev, 1);
	if (!(flag & REF_ISSYMREF))
		old.path = NULL;

	if (old.path && !prefixcmp(old.path, "refs/heads/"))
		old.name = old.path + strlen("refs/heads/");

	if (!new->name) {
		new->name = "HEAD";
		new->commit = old.commit;
		if (!new->commit)
			die("You are on a branch yet to be born");
		parse_commit(new->commit);
	}

583
	ret = merge_working_tree(opts, &old, new);
D
Daniel Barkalow 已提交
584 585 586
	if (ret)
		return ret;

587 588 589 590 591 592 593 594
	/*
	 * If we were on a detached HEAD, but have now moved to
	 * a new commit, we want to mention the old commit once more
	 * to remind the user that it might be lost.
	 */
	if (!opts->quiet && !old.path && old.commit && new->commit != old.commit)
		describe_detached_head("Previous HEAD position was", old.commit);

D
Daniel Barkalow 已提交
595 596
	update_refs_for_switch(opts, &old, new);

597 598
	ret = post_checkout_hook(old.commit, new->commit, 1);
	return ret || opts->writeout_error;
D
Daniel Barkalow 已提交
599 600
}

601 602 603 604 605
static int git_checkout_config(const char *var, const char *value, void *cb)
{
	return git_xmerge_config(var, value, cb);
}

T
Thomas Rast 已提交
606 607 608 609 610 611
static int interactive_checkout(const char *revision, const char **pathspec,
				struct checkout_opts *opts)
{
	return run_add_interactive(revision, "--patch=checkout", pathspec);
}

612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638
struct tracking_name_data {
	const char *name;
	char *remote;
	int unique;
};

static int check_tracking_name(const char *refname, const unsigned char *sha1,
			       int flags, void *cb_data)
{
	struct tracking_name_data *cb = cb_data;
	const char *slash;

	if (prefixcmp(refname, "refs/remotes/"))
		return 0;
	slash = strchr(refname + 13, '/');
	if (!slash || strcmp(slash + 1, cb->name))
		return 0;
	if (cb->remote) {
		cb->unique = 0;
		return 0;
	}
	cb->remote = xstrdup(refname);
	return 0;
}

static const char *unique_tracking_name(const char *name)
{
639 640
	struct tracking_name_data cb_data = { NULL, NULL, 1 };
	cb_data.name = name;
641 642 643 644 645 646
	for_each_ref(check_tracking_name, &cb_data);
	if (cb_data.unique)
		return cb_data.remote;
	free(cb_data.remote);
	return NULL;
}
T
Thomas Rast 已提交
647

D
Daniel Barkalow 已提交
648 649 650 651 652 653 654
int cmd_checkout(int argc, const char **argv, const char *prefix)
{
	struct checkout_opts opts;
	unsigned char rev[20];
	const char *arg;
	struct branch_info new;
	struct tree *source_tree = NULL;
655
	char *conflict_style = NULL;
T
Thomas Rast 已提交
656
	int patch_mode = 0;
J
Junio C Hamano 已提交
657
	int dwim_new_local_branch = 1;
D
Daniel Barkalow 已提交
658 659 660 661
	struct option options[] = {
		OPT__QUIET(&opts.quiet),
		OPT_STRING('b', NULL, &opts.new_branch, "new branch", "branch"),
		OPT_BOOLEAN('l', NULL, &opts.new_branch_log, "log for new branch"),
662
		OPT_SET_INT('t', "track",  &opts.track, "track",
663
			BRANCH_TRACK_EXPLICIT),
664
		OPT_STRING(0, "orphan", &opts.new_orphan_branch, "new branch", "new unparented branch"),
665 666 667 668
		OPT_SET_INT('2', "ours", &opts.writeout_stage, "stage",
			    2),
		OPT_SET_INT('3', "theirs", &opts.writeout_stage, "stage",
			    3),
669
		OPT_BOOLEAN('f', "force", &opts.force, "force"),
670 671 672
		OPT_BOOLEAN('m', "merge", &opts.merge, "merge"),
		OPT_STRING(0, "conflict", &conflict_style, "style",
			   "conflict style (merge or diff3)"),
T
Thomas Rast 已提交
673
		OPT_BOOLEAN('p', "patch", &patch_mode, "select hunks interactively"),
J
Junio C Hamano 已提交
674 675 676
		{ OPTION_BOOLEAN, 0, "guess", &dwim_new_local_branch, NULL,
		  "second guess 'git checkout no-such-branch'",
		  PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
677
		OPT_END(),
D
Daniel Barkalow 已提交
678
	};
679
	int has_dash_dash;
D
Daniel Barkalow 已提交
680 681 682 683

	memset(&opts, 0, sizeof(opts));
	memset(&new, 0, sizeof(new));

684
	git_config(git_checkout_config, NULL);
D
Daniel Barkalow 已提交
685

686
	opts.track = BRANCH_TRACK_UNSPECIFIED;
D
Daniel Barkalow 已提交
687

688
	argc = parse_options(argc, argv, prefix, options, checkout_usage,
689
			     PARSE_OPT_KEEP_DASHDASH);
690

T
Thomas Rast 已提交
691 692 693 694
	if (patch_mode && (opts.track > 0 || opts.new_branch
			   || opts.new_branch_log || opts.merge || opts.force))
		die ("--patch is incompatible with all other options");

695
	/* --track without -b should DWIM */
696 697 698
	if (0 < opts.track && !opts.new_branch) {
		const char *argv0 = argv[0];
		if (!argc || !strcmp(argv0, "--"))
699
			die ("--track needs a branch name");
700 701 702 703 704 705
		if (!prefixcmp(argv0, "refs/"))
			argv0 += 5;
		if (!prefixcmp(argv0, "remotes/"))
			argv0 += 8;
		argv0 = strchr(argv0, '/');
		if (!argv0 || !argv0[1])
706
			die ("Missing branch name; try -b");
707
		opts.new_branch = argv0 + 1;
708 709
	}

710 711 712
	if (opts.new_orphan_branch) {
		if (opts.new_branch)
			die("--orphan and -b are mutually exclusive");
713 714
		if (opts.track > 0)
			die("--orphan cannot be used with -t");
715 716 717
		opts.new_branch = opts.new_orphan_branch;
	}

718 719 720 721 722
	if (conflict_style) {
		opts.merge = 1; /* implied */
		git_xmerge_config("merge.conflictstyle", conflict_style, NULL);
	}

723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738
	if (opts.force && opts.merge)
		die("git checkout: -f and -m are incompatible");

	/*
	 * case 1: git checkout <ref> -- [<paths>]
	 *
	 *   <ref> must be a valid tree, everything after the '--' must be
	 *   a path.
	 *
	 * case 2: git checkout -- [<paths>]
	 *
	 *   everything after the '--' must be paths.
	 *
	 * case 3: git checkout <something> [<paths>]
	 *
	 *   With no paths, if <something> is a commit, that is to
739 740 741 742
	 *   switch to the branch or detach HEAD at it.  As a special case,
	 *   if <something> is A...B (missing A or B means HEAD but you can
	 *   omit at most one side), and if there is a unique merge base
	 *   between A and B, A...B names that merge base.
743
	 *
744 745 746 747 748
	 *   With no paths, if <something> is _not_ a commit, no -t nor -b
	 *   was given, and there is a tracking branch whose name is
	 *   <something> in one and only one remote, then this is a short-hand
	 *   to fork local <something> from that remote tracking branch.
	 *
749 750 751 752 753 754
	 *   Otherwise <something> shall not be ambiguous.
	 *   - If it's *only* a reference, treat it like case (1).
	 *   - If it's only a path, treat it like case (2).
	 *   - else: fail.
	 *
	 */
D
Daniel Barkalow 已提交
755
	if (argc) {
756 757 758 759 760 761
		if (!strcmp(argv[0], "--")) {       /* case (2) */
			argv++;
			argc--;
			goto no_reference;
		}

D
Daniel Barkalow 已提交
762
		arg = argv[0];
763 764
		has_dash_dash = (argc > 1) && !strcmp(argv[1], "--");

765 766 767
		if (!strcmp(arg, "-"))
			arg = "@{-1}";

768
		if (get_sha1_mb(arg, rev)) {
769 770
			if (has_dash_dash)          /* case (1) */
				die("invalid reference: %s", arg);
771
			if (!patch_mode &&
J
Junio C Hamano 已提交
772
			    dwim_new_local_branch &&
773 774 775 776 777 778 779 780 781 782 783 784 785
			    opts.track == BRANCH_TRACK_UNSPECIFIED &&
			    !opts.new_branch &&
			    !check_filename(NULL, arg) &&
			    argc == 1) {
				const char *remote = unique_tracking_name(arg);
				if (!remote || get_sha1(remote, rev))
					goto no_reference;
				opts.new_branch = arg;
				arg = remote;
				/* DWIMmed to create local branch */
			}
			else
				goto no_reference;
786 787 788 789 790 791
		}

		/* we can't end up being in (2) anymore, eat the argument */
		argv++;
		argc--;

792
		new.name = arg;
793
		if ((new.commit = lookup_commit_reference_gently(rev, 1))) {
D
Daniel Barkalow 已提交
794
			setup_branch_path(&new);
795 796 797 798

			if ((check_ref_format(new.path) == CHECK_REF_FORMAT_OK) &&
			    resolve_ref(new.path, rev, 1, NULL))
				;
D
Daniel Barkalow 已提交
799 800 801 802
			else
				new.path = NULL;
			parse_commit(new.commit);
			source_tree = new.commit->tree;
803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818
		} else
			source_tree = parse_tree_indirect(rev);

		if (!source_tree)                   /* case (1): want a tree */
			die("reference is not a tree: %s", arg);
		if (!has_dash_dash) {/* case (3 -> 1) */
			/*
			 * Do not complain the most common case
			 *	git checkout branch
			 * even if there happen to be a file called 'branch';
			 * it would be extremely annoying.
			 */
			if (argc)
				verify_non_filename(NULL, arg);
		}
		else {
D
Daniel Barkalow 已提交
819 820 821 822 823
			argv++;
			argc--;
		}
	}

824
no_reference:
825 826 827 828

	if (opts.track == BRANCH_TRACK_UNSPECIFIED)
		opts.track = git_branch_track;

D
Daniel Barkalow 已提交
829 830
	if (argc) {
		const char **pathspec = get_pathspec(prefix, argv);
831 832 833 834

		if (!pathspec)
			die("invalid path specification");

T
Thomas Rast 已提交
835 836 837
		if (patch_mode)
			return interactive_checkout(new.name, pathspec, &opts);

D
Daniel Barkalow 已提交
838
		/* Checkout paths */
839
		if (opts.new_branch) {
D
Daniel Barkalow 已提交
840
			if (argc == 1) {
841
				die("git checkout: updating paths is incompatible with switching branches.\nDid you intend to checkout '%s' which can not be resolved as commit?", argv[0]);
D
Daniel Barkalow 已提交
842
			} else {
843
				die("git checkout: updating paths is incompatible with switching branches.");
D
Daniel Barkalow 已提交
844 845 846
			}
		}

847 848 849
		if (1 < !!opts.writeout_stage + !!opts.force + !!opts.merge)
			die("git checkout: --ours/--theirs, --force and --merge are incompatible when\nchecking out of the index.");

850
		return checkout_paths(source_tree, pathspec, &opts);
D
Daniel Barkalow 已提交
851 852
	}

T
Thomas Rast 已提交
853 854 855
	if (patch_mode)
		return interactive_checkout(new.name, NULL, &opts);

856
	if (opts.new_branch) {
857
		struct strbuf buf = STRBUF_INIT;
858 859 860
		if (strbuf_check_branch_ref(&buf, opts.new_branch))
			die("git checkout: we do not like '%s' as a branch name.",
			    opts.new_branch);
861 862 863 864 865
		if (!get_sha1(buf.buf, rev))
			die("git checkout: branch %s already exists", opts.new_branch);
		strbuf_release(&buf);
	}

D
Daniel Barkalow 已提交
866 867 868
	if (new.name && !new.commit) {
		die("Cannot switch branch to a non-commit.");
	}
869 870
	if (opts.writeout_stage)
		die("--ours/--theirs is incompatible with switching branches.");
D
Daniel Barkalow 已提交
871

872
	return switch_branches(&opts, &new);
D
Daniel Barkalow 已提交
873
}