Thread-safe xmalloc and xrealloc needs a recursive mutex
[git/dscho.git] / builtin-checkout.c
blobc5ab7835e1fe260b9ec61f216bf198011eabf6f7
1 #include "cache.h"
2 #include "builtin.h"
3 #include "parse-options.h"
4 #include "refs.h"
5 #include "commit.h"
6 #include "tree.h"
7 #include "tree-walk.h"
8 #include "cache-tree.h"
9 #include "unpack-trees.h"
10 #include "dir.h"
11 #include "run-command.h"
12 #include "merge-recursive.h"
13 #include "branch.h"
14 #include "diff.h"
15 #include "revision.h"
16 #include "remote.h"
17 #include "blob.h"
18 #include "xdiff-interface.h"
19 #include "ll-merge.h"
20 #include "resolve-undo.h"
22 static const char * const checkout_usage[] = {
23 "git checkout [options] <branch>",
24 "git checkout [options] [<branch>] -- <file>...",
25 NULL,
28 struct checkout_opts {
29 int quiet;
30 int merge;
31 int force;
32 int writeout_stage;
33 int writeout_error;
35 const char *new_branch;
36 int new_branch_log;
37 enum branch_track track;
40 static int post_checkout_hook(struct commit *old, struct commit *new,
41 int changed)
43 return run_hook(NULL, "post-checkout",
44 sha1_to_hex(old ? old->object.sha1 : null_sha1),
45 sha1_to_hex(new ? new->object.sha1 : null_sha1),
46 changed ? "1" : "0", NULL);
47 /* "new" can be NULL when checking out from the index before
48 a commit exists. */
52 static int update_some(const unsigned char *sha1, const char *base, int baselen,
53 const char *pathname, unsigned mode, int stage, void *context)
55 int len;
56 struct cache_entry *ce;
58 if (S_ISDIR(mode))
59 return READ_TREE_RECURSIVE;
61 len = baselen + strlen(pathname);
62 ce = xcalloc(1, cache_entry_size(len));
63 hashcpy(ce->sha1, sha1);
64 memcpy(ce->name, base, baselen);
65 memcpy(ce->name + baselen, pathname, len - baselen);
66 ce->ce_flags = create_ce_flags(len, 0);
67 ce->ce_mode = create_ce_mode(mode);
68 add_cache_entry(ce, ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE);
69 return 0;
72 static int read_tree_some(struct tree *tree, const char **pathspec)
74 read_tree_recursive(tree, "", 0, 0, pathspec, update_some, NULL);
76 /* update the index with the given tree's info
77 * for all args, expanding wildcards, and exit
78 * with any non-zero return code.
80 return 0;
83 static int skip_same_name(struct cache_entry *ce, int pos)
85 while (++pos < active_nr &&
86 !strcmp(active_cache[pos]->name, ce->name))
87 ; /* skip */
88 return pos;
91 static int check_stage(int stage, struct cache_entry *ce, int pos)
93 while (pos < active_nr &&
94 !strcmp(active_cache[pos]->name, ce->name)) {
95 if (ce_stage(active_cache[pos]) == stage)
96 return 0;
97 pos++;
99 return error("path '%s' does not have %s version",
100 ce->name,
101 (stage == 2) ? "our" : "their");
104 static int check_all_stages(struct cache_entry *ce, int pos)
106 if (ce_stage(ce) != 1 ||
107 active_nr <= pos + 2 ||
108 strcmp(active_cache[pos+1]->name, ce->name) ||
109 ce_stage(active_cache[pos+1]) != 2 ||
110 strcmp(active_cache[pos+2]->name, ce->name) ||
111 ce_stage(active_cache[pos+2]) != 3)
112 return error("path '%s' does not have all three versions",
113 ce->name);
114 return 0;
117 static int checkout_stage(int stage, struct cache_entry *ce, int pos,
118 struct checkout *state)
120 while (pos < active_nr &&
121 !strcmp(active_cache[pos]->name, ce->name)) {
122 if (ce_stage(active_cache[pos]) == stage)
123 return checkout_entry(active_cache[pos], state, NULL);
124 pos++;
126 return error("path '%s' does not have %s version",
127 ce->name,
128 (stage == 2) ? "our" : "their");
131 /* NEEDSWORK: share with merge-recursive */
132 static void fill_mm(const unsigned char *sha1, mmfile_t *mm)
134 unsigned long size;
135 enum object_type type;
137 if (!hashcmp(sha1, null_sha1)) {
138 mm->ptr = xstrdup("");
139 mm->size = 0;
140 return;
143 mm->ptr = read_sha1_file(sha1, &type, &size);
144 if (!mm->ptr || type != OBJ_BLOB)
145 die("unable to read blob object %s", sha1_to_hex(sha1));
146 mm->size = size;
149 static int checkout_merged(int pos, struct checkout *state)
151 struct cache_entry *ce = active_cache[pos];
152 const char *path = ce->name;
153 mmfile_t ancestor, ours, theirs;
154 int status;
155 unsigned char sha1[20];
156 mmbuffer_t result_buf;
158 if (ce_stage(ce) != 1 ||
159 active_nr <= pos + 2 ||
160 strcmp(active_cache[pos+1]->name, path) ||
161 ce_stage(active_cache[pos+1]) != 2 ||
162 strcmp(active_cache[pos+2]->name, path) ||
163 ce_stage(active_cache[pos+2]) != 3)
164 return error("path '%s' does not have all 3 versions", path);
166 fill_mm(active_cache[pos]->sha1, &ancestor);
167 fill_mm(active_cache[pos+1]->sha1, &ours);
168 fill_mm(active_cache[pos+2]->sha1, &theirs);
170 status = ll_merge(&result_buf, path, &ancestor,
171 &ours, "ours", &theirs, "theirs", 0);
172 free(ancestor.ptr);
173 free(ours.ptr);
174 free(theirs.ptr);
175 if (status < 0 || !result_buf.ptr) {
176 free(result_buf.ptr);
177 return error("path '%s': cannot merge", path);
181 * NEEDSWORK:
182 * There is absolutely no reason to write this as a blob object
183 * and create a phony cache entry just to leak. This hack is
184 * primarily to get to the write_entry() machinery that massages
185 * the contents to work-tree format and writes out which only
186 * allows it for a cache entry. The code in write_entry() needs
187 * to be refactored to allow us to feed a <buffer, size, mode>
188 * instead of a cache entry. Such a refactoring would help
189 * merge_recursive as well (it also writes the merge result to the
190 * object database even when it may contain conflicts).
192 if (write_sha1_file(result_buf.ptr, result_buf.size,
193 blob_type, sha1))
194 die("Unable to add merge result for '%s'", path);
195 ce = make_cache_entry(create_ce_mode(active_cache[pos+1]->ce_mode),
196 sha1,
197 path, 2, 0);
198 if (!ce)
199 die("make_cache_entry failed for path '%s'", path);
200 status = checkout_entry(ce, state, NULL);
201 return status;
204 static int checkout_paths(struct tree *source_tree, const char **pathspec,
205 struct checkout_opts *opts)
207 int pos;
208 struct checkout state;
209 static char *ps_matched;
210 unsigned char rev[20];
211 int flag;
212 struct commit *head;
213 int errs = 0;
214 int stage = opts->writeout_stage;
215 int merge = opts->merge;
216 int newfd;
217 struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
219 newfd = hold_locked_index(lock_file, 1);
220 if (read_cache_preload(pathspec) < 0)
221 return error("corrupt index file");
223 if (source_tree)
224 read_tree_some(source_tree, pathspec);
226 for (pos = 0; pathspec[pos]; pos++)
228 ps_matched = xcalloc(1, pos);
230 for (pos = 0; pos < active_nr; pos++) {
231 struct cache_entry *ce = active_cache[pos];
232 match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, ps_matched);
235 if (report_path_error(ps_matched, pathspec, 0))
236 return 1;
238 /* "checkout -m path" to recreate conflicted state */
239 if (opts->merge)
240 unmerge_cache(pathspec);
242 /* Any unmerged paths? */
243 for (pos = 0; pos < active_nr; pos++) {
244 struct cache_entry *ce = active_cache[pos];
245 if (match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, NULL)) {
246 if (!ce_stage(ce))
247 continue;
248 if (opts->force) {
249 warning("path '%s' is unmerged", ce->name);
250 } else if (stage) {
251 errs |= check_stage(stage, ce, pos);
252 } else if (opts->merge) {
253 errs |= check_all_stages(ce, pos);
254 } else {
255 errs = 1;
256 error("path '%s' is unmerged", ce->name);
258 pos = skip_same_name(ce, pos) - 1;
261 if (errs)
262 return 1;
264 /* Now we are committed to check them out */
265 memset(&state, 0, sizeof(state));
266 state.force = 1;
267 state.refresh_cache = 1;
268 for (pos = 0; pos < active_nr; pos++) {
269 struct cache_entry *ce = active_cache[pos];
270 if (match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, NULL)) {
271 if (!ce_stage(ce)) {
272 errs |= checkout_entry(ce, &state, NULL);
273 continue;
275 if (stage)
276 errs |= checkout_stage(stage, ce, pos, &state);
277 else if (merge)
278 errs |= checkout_merged(pos, &state);
279 pos = skip_same_name(ce, pos) - 1;
283 if (write_cache(newfd, active_cache, active_nr) ||
284 commit_locked_index(lock_file))
285 die("unable to write new index file");
287 resolve_ref("HEAD", rev, 0, &flag);
288 head = lookup_commit_reference_gently(rev, 1);
290 errs |= post_checkout_hook(head, head, 0);
291 return errs;
294 static void show_local_changes(struct object *head)
296 struct rev_info rev;
297 /* I think we want full paths, even if we're in a subdirectory. */
298 init_revisions(&rev, NULL);
299 rev.abbrev = 0;
300 rev.diffopt.output_format |= DIFF_FORMAT_NAME_STATUS;
301 if (diff_setup_done(&rev.diffopt) < 0)
302 die("diff_setup_done failed");
303 add_pending_object(&rev, head, NULL);
304 run_diff_index(&rev, 0);
307 static void describe_detached_head(char *msg, struct commit *commit)
309 struct strbuf sb = STRBUF_INIT;
310 struct pretty_print_context ctx = {0};
311 parse_commit(commit);
312 pretty_print_commit(CMIT_FMT_ONELINE, commit, &sb, &ctx);
313 fprintf(stderr, "%s %s... %s\n", msg,
314 find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV), sb.buf);
315 strbuf_release(&sb);
318 static int reset_tree(struct tree *tree, struct checkout_opts *o, int worktree)
320 struct unpack_trees_options opts;
321 struct tree_desc tree_desc;
323 memset(&opts, 0, sizeof(opts));
324 opts.head_idx = -1;
325 opts.update = worktree;
326 opts.skip_unmerged = !worktree;
327 opts.reset = 1;
328 opts.merge = 1;
329 opts.fn = oneway_merge;
330 opts.verbose_update = !o->quiet;
331 opts.src_index = &the_index;
332 opts.dst_index = &the_index;
333 parse_tree(tree);
334 init_tree_desc(&tree_desc, tree->buffer, tree->size);
335 switch (unpack_trees(1, &tree_desc, &opts)) {
336 case -2:
337 o->writeout_error = 1;
339 * We return 0 nevertheless, as the index is all right
340 * and more importantly we have made best efforts to
341 * update paths in the work tree, and we cannot revert
342 * them.
344 case 0:
345 return 0;
346 default:
347 return 128;
351 struct branch_info {
352 const char *name; /* The short name used */
353 const char *path; /* The full name of a real branch */
354 struct commit *commit; /* The named commit */
357 static void setup_branch_path(struct branch_info *branch)
359 struct strbuf buf = STRBUF_INIT;
361 strbuf_branchname(&buf, branch->name);
362 if (strcmp(buf.buf, branch->name))
363 branch->name = xstrdup(buf.buf);
364 strbuf_splice(&buf, 0, 0, "refs/heads/", 11);
365 branch->path = strbuf_detach(&buf, NULL);
368 static int merge_working_tree(struct checkout_opts *opts,
369 struct branch_info *old, struct branch_info *new)
371 int ret;
372 struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
373 int newfd = hold_locked_index(lock_file, 1);
375 if (read_cache_preload(NULL) < 0)
376 return error("corrupt index file");
378 resolve_undo_clear();
379 if (opts->force) {
380 ret = reset_tree(new->commit->tree, opts, 1);
381 if (ret)
382 return ret;
383 } else {
384 struct tree_desc trees[2];
385 struct tree *tree;
386 struct unpack_trees_options topts;
388 memset(&topts, 0, sizeof(topts));
389 topts.head_idx = -1;
390 topts.src_index = &the_index;
391 topts.dst_index = &the_index;
393 topts.msgs.not_uptodate_file = "You have local changes to '%s'; cannot switch branches.";
395 refresh_cache(REFRESH_QUIET);
397 if (unmerged_cache()) {
398 error("you need to resolve your current index first");
399 return 1;
402 /* 2-way merge to the new branch */
403 topts.initial_checkout = is_cache_unborn();
404 topts.update = 1;
405 topts.merge = 1;
406 topts.gently = opts->merge && old->commit;
407 topts.verbose_update = !opts->quiet;
408 topts.fn = twoway_merge;
409 topts.dir = xcalloc(1, sizeof(*topts.dir));
410 topts.dir->flags |= DIR_SHOW_IGNORED;
411 topts.dir->exclude_per_dir = ".gitignore";
412 tree = parse_tree_indirect(old->commit ?
413 old->commit->object.sha1 :
414 (unsigned char *)EMPTY_TREE_SHA1_BIN);
415 init_tree_desc(&trees[0], tree->buffer, tree->size);
416 tree = parse_tree_indirect(new->commit->object.sha1);
417 init_tree_desc(&trees[1], tree->buffer, tree->size);
419 ret = unpack_trees(2, trees, &topts);
420 if (ret == -1) {
422 * Unpack couldn't do a trivial merge; either
423 * give up or do a real merge, depending on
424 * whether the merge flag was used.
426 struct tree *result;
427 struct tree *work;
428 struct merge_options o;
429 if (!opts->merge)
430 return 1;
433 * Without old->commit, the below is the same as
434 * the two-tree unpack we already tried and failed.
436 if (!old->commit)
437 return 1;
439 /* Do more real merge */
442 * We update the index fully, then write the
443 * tree from the index, then merge the new
444 * branch with the current tree, with the old
445 * branch as the base. Then we reset the index
446 * (but not the working tree) to the new
447 * branch, leaving the working tree as the
448 * merged version, but skipping unmerged
449 * entries in the index.
452 add_files_to_cache(NULL, NULL, 0);
453 init_merge_options(&o);
454 o.verbosity = 0;
455 work = write_tree_from_memory(&o);
457 ret = reset_tree(new->commit->tree, opts, 1);
458 if (ret)
459 return ret;
460 o.branch1 = new->name;
461 o.branch2 = "local";
462 merge_trees(&o, new->commit->tree, work,
463 old->commit->tree, &result);
464 ret = reset_tree(new->commit->tree, opts, 0);
465 if (ret)
466 return ret;
470 if (write_cache(newfd, active_cache, active_nr) ||
471 commit_locked_index(lock_file))
472 die("unable to write new index file");
474 if (!opts->force && !opts->quiet)
475 show_local_changes(&new->commit->object);
477 return 0;
480 static void report_tracking(struct branch_info *new)
482 struct strbuf sb = STRBUF_INIT;
483 struct branch *branch = branch_get(new->name);
485 if (!format_tracking_info(branch, &sb))
486 return;
487 fputs(sb.buf, stdout);
488 strbuf_release(&sb);
491 static void detach_advice(const char *old_path, const char *new_name)
493 const char fmt[] =
494 "Note: checking out '%s'.\n\n"
495 "You are in 'detached HEAD' state. You can look around, make experimental\n"
496 "changes and commit them, and you can discard any commits you make in this\n"
497 "state without impacting any branches by performing another checkout.\n\n"
498 "If you want to create a new branch to retain commits you create, you may\n"
499 "do so (now or later) by using -b with the checkout command again. Example:\n\n"
500 " git checkout -b new_branch_name\n\n";
502 fprintf(stderr, fmt, new_name);
505 static void update_refs_for_switch(struct checkout_opts *opts,
506 struct branch_info *old,
507 struct branch_info *new)
509 struct strbuf msg = STRBUF_INIT;
510 const char *old_desc;
511 if (opts->new_branch) {
512 create_branch(old->name, opts->new_branch, new->name, 0,
513 opts->new_branch_log, opts->track);
514 new->name = opts->new_branch;
515 setup_branch_path(new);
518 old_desc = old->name;
519 if (!old_desc && old->commit)
520 old_desc = sha1_to_hex(old->commit->object.sha1);
521 strbuf_addf(&msg, "checkout: moving from %s to %s",
522 old_desc ? old_desc : "(invalid)", new->name);
524 if (new->path) {
525 create_symref("HEAD", new->path, msg.buf);
526 if (!opts->quiet) {
527 if (old->path && !strcmp(new->path, old->path))
528 fprintf(stderr, "Already on '%s'\n",
529 new->name);
530 else
531 fprintf(stderr, "Switched to%s branch '%s'\n",
532 opts->new_branch ? " a new" : "",
533 new->name);
535 } else if (strcmp(new->name, "HEAD")) {
536 update_ref(msg.buf, "HEAD", new->commit->object.sha1, NULL,
537 REF_NODEREF, DIE_ON_ERR);
538 if (!opts->quiet) {
539 if (old->path && advice_detached_head)
540 detach_advice(old->path, new->name);
541 describe_detached_head("HEAD is now at", new->commit);
544 remove_branch_state();
545 strbuf_release(&msg);
546 if (!opts->quiet && (new->path || !strcmp(new->name, "HEAD")))
547 report_tracking(new);
550 static int switch_branches(struct checkout_opts *opts, struct branch_info *new)
552 int ret = 0;
553 struct branch_info old;
554 unsigned char rev[20];
555 int flag;
556 memset(&old, 0, sizeof(old));
557 old.path = resolve_ref("HEAD", rev, 0, &flag);
558 old.commit = lookup_commit_reference_gently(rev, 1);
559 if (!(flag & REF_ISSYMREF))
560 old.path = NULL;
562 if (old.path && !prefixcmp(old.path, "refs/heads/"))
563 old.name = old.path + strlen("refs/heads/");
565 if (!new->name) {
566 new->name = "HEAD";
567 new->commit = old.commit;
568 if (!new->commit)
569 die("You are on a branch yet to be born");
570 parse_commit(new->commit);
573 ret = merge_working_tree(opts, &old, new);
574 if (ret)
575 return ret;
578 * If we were on a detached HEAD, but have now moved to
579 * a new commit, we want to mention the old commit once more
580 * to remind the user that it might be lost.
582 if (!opts->quiet && !old.path && old.commit && new->commit != old.commit)
583 describe_detached_head("Previous HEAD position was", old.commit);
585 update_refs_for_switch(opts, &old, new);
587 ret = post_checkout_hook(old.commit, new->commit, 1);
588 return ret || opts->writeout_error;
591 static int git_checkout_config(const char *var, const char *value, void *cb)
593 return git_xmerge_config(var, value, cb);
596 static int interactive_checkout(const char *revision, const char **pathspec,
597 struct checkout_opts *opts)
599 return run_add_interactive(revision, "--patch=checkout", pathspec);
602 struct tracking_name_data {
603 const char *name;
604 char *remote;
605 int unique;
608 static int check_tracking_name(const char *refname, const unsigned char *sha1,
609 int flags, void *cb_data)
611 struct tracking_name_data *cb = cb_data;
612 const char *slash;
614 if (prefixcmp(refname, "refs/remotes/"))
615 return 0;
616 slash = strchr(refname + 13, '/');
617 if (!slash || strcmp(slash + 1, cb->name))
618 return 0;
619 if (cb->remote) {
620 cb->unique = 0;
621 return 0;
623 cb->remote = xstrdup(refname);
624 return 0;
627 static const char *unique_tracking_name(const char *name)
629 struct tracking_name_data cb_data = { name, NULL, 1 };
630 for_each_ref(check_tracking_name, &cb_data);
631 if (cb_data.unique)
632 return cb_data.remote;
633 free(cb_data.remote);
634 return NULL;
637 int cmd_checkout(int argc, const char **argv, const char *prefix)
639 struct checkout_opts opts;
640 unsigned char rev[20];
641 const char *arg;
642 struct branch_info new;
643 struct tree *source_tree = NULL;
644 char *conflict_style = NULL;
645 int patch_mode = 0;
646 int dwim_new_local_branch = 1;
647 struct option options[] = {
648 OPT__QUIET(&opts.quiet),
649 OPT_STRING('b', NULL, &opts.new_branch, "new branch", "branch"),
650 OPT_BOOLEAN('l', NULL, &opts.new_branch_log, "log for new branch"),
651 OPT_SET_INT('t', "track", &opts.track, "track",
652 BRANCH_TRACK_EXPLICIT),
653 OPT_SET_INT('2', "ours", &opts.writeout_stage, "stage",
655 OPT_SET_INT('3', "theirs", &opts.writeout_stage, "stage",
657 OPT_BOOLEAN('f', "force", &opts.force, "force"),
658 OPT_BOOLEAN('m', "merge", &opts.merge, "merge"),
659 OPT_STRING(0, "conflict", &conflict_style, "style",
660 "conflict style (merge or diff3)"),
661 OPT_BOOLEAN('p', "patch", &patch_mode, "select hunks interactively"),
662 { OPTION_BOOLEAN, 0, "guess", &dwim_new_local_branch, NULL,
663 "second guess 'git checkout no-such-branch'",
664 PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
665 OPT_END(),
667 int has_dash_dash;
669 memset(&opts, 0, sizeof(opts));
670 memset(&new, 0, sizeof(new));
672 git_config(git_checkout_config, NULL);
674 opts.track = BRANCH_TRACK_UNSPECIFIED;
676 argc = parse_options(argc, argv, prefix, options, checkout_usage,
677 PARSE_OPT_KEEP_DASHDASH);
679 if (patch_mode && (opts.track > 0 || opts.new_branch
680 || opts.new_branch_log || opts.merge || opts.force))
681 die ("--patch is incompatible with all other options");
683 /* --track without -b should DWIM */
684 if (0 < opts.track && !opts.new_branch) {
685 const char *argv0 = argv[0];
686 if (!argc || !strcmp(argv0, "--"))
687 die ("--track needs a branch name");
688 if (!prefixcmp(argv0, "refs/"))
689 argv0 += 5;
690 if (!prefixcmp(argv0, "remotes/"))
691 argv0 += 8;
692 argv0 = strchr(argv0, '/');
693 if (!argv0 || !argv0[1])
694 die ("Missing branch name; try -b");
695 opts.new_branch = argv0 + 1;
698 if (conflict_style) {
699 opts.merge = 1; /* implied */
700 git_xmerge_config("merge.conflictstyle", conflict_style, NULL);
703 if (opts.force && opts.merge)
704 die("git checkout: -f and -m are incompatible");
707 * case 1: git checkout <ref> -- [<paths>]
709 * <ref> must be a valid tree, everything after the '--' must be
710 * a path.
712 * case 2: git checkout -- [<paths>]
714 * everything after the '--' must be paths.
716 * case 3: git checkout <something> [<paths>]
718 * With no paths, if <something> is a commit, that is to
719 * switch to the branch or detach HEAD at it. As a special case,
720 * if <something> is A...B (missing A or B means HEAD but you can
721 * omit at most one side), and if there is a unique merge base
722 * between A and B, A...B names that merge base.
724 * With no paths, if <something> is _not_ a commit, no -t nor -b
725 * was given, and there is a tracking branch whose name is
726 * <something> in one and only one remote, then this is a short-hand
727 * to fork local <something> from that remote tracking branch.
729 * Otherwise <something> shall not be ambiguous.
730 * - If it's *only* a reference, treat it like case (1).
731 * - If it's only a path, treat it like case (2).
732 * - else: fail.
735 if (argc) {
736 if (!strcmp(argv[0], "--")) { /* case (2) */
737 argv++;
738 argc--;
739 goto no_reference;
742 arg = argv[0];
743 has_dash_dash = (argc > 1) && !strcmp(argv[1], "--");
745 if (!strcmp(arg, "-"))
746 arg = "@{-1}";
748 if (get_sha1_mb(arg, rev)) {
749 if (has_dash_dash) /* case (1) */
750 die("invalid reference: %s", arg);
751 if (!patch_mode &&
752 dwim_new_local_branch &&
753 opts.track == BRANCH_TRACK_UNSPECIFIED &&
754 !opts.new_branch &&
755 !check_filename(NULL, arg) &&
756 argc == 1) {
757 const char *remote = unique_tracking_name(arg);
758 if (!remote || get_sha1(remote, rev))
759 goto no_reference;
760 opts.new_branch = arg;
761 arg = remote;
762 /* DWIMmed to create local branch */
764 else
765 goto no_reference;
768 /* we can't end up being in (2) anymore, eat the argument */
769 argv++;
770 argc--;
772 new.name = arg;
773 if ((new.commit = lookup_commit_reference_gently(rev, 1))) {
774 setup_branch_path(&new);
776 if ((check_ref_format(new.path) == CHECK_REF_FORMAT_OK) &&
777 resolve_ref(new.path, rev, 1, NULL))
779 else
780 new.path = NULL;
781 parse_commit(new.commit);
782 source_tree = new.commit->tree;
783 } else
784 source_tree = parse_tree_indirect(rev);
786 if (!source_tree) /* case (1): want a tree */
787 die("reference is not a tree: %s", arg);
788 if (!has_dash_dash) {/* case (3 -> 1) */
790 * Do not complain the most common case
791 * git checkout branch
792 * even if there happen to be a file called 'branch';
793 * it would be extremely annoying.
795 if (argc)
796 verify_non_filename(NULL, arg);
798 else {
799 argv++;
800 argc--;
804 no_reference:
806 if (opts.track == BRANCH_TRACK_UNSPECIFIED)
807 opts.track = git_branch_track;
809 if (argc) {
810 const char **pathspec = get_pathspec(prefix, argv);
812 if (!pathspec)
813 die("invalid path specification");
815 if (patch_mode)
816 return interactive_checkout(new.name, pathspec, &opts);
818 /* Checkout paths */
819 if (opts.new_branch) {
820 if (argc == 1) {
821 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]);
822 } else {
823 die("git checkout: updating paths is incompatible with switching branches.");
827 if (1 < !!opts.writeout_stage + !!opts.force + !!opts.merge)
828 die("git checkout: --ours/--theirs, --force and --merge are incompatible when\nchecking out of the index.");
830 return checkout_paths(source_tree, pathspec, &opts);
833 if (patch_mode)
834 return interactive_checkout(new.name, NULL, &opts);
836 if (opts.new_branch) {
837 struct strbuf buf = STRBUF_INIT;
838 if (strbuf_check_branch_ref(&buf, opts.new_branch))
839 die("git checkout: we do not like '%s' as a branch name.",
840 opts.new_branch);
841 if (!get_sha1(buf.buf, rev))
842 die("git checkout: branch %s already exists", opts.new_branch);
843 strbuf_release(&buf);
846 if (new.name && !new.commit) {
847 die("Cannot switch branch to a non-commit.");
849 if (opts.writeout_stage)
850 die("--ours/--theirs is incompatible with switching branches.");
852 return switch_branches(&opts, &new);