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"
21#include "submodule.h"
22
23static const char * const checkout_usage[] = {
24 "git checkout [options] <branch>",
25 "git checkout [options] [<branch>] -- <file>...",
26 NULL,
27};
28
29struct checkout_opts {
30 int quiet;
31 int merge;
32 int force;
33 int writeout_stage;
34 int writeout_error;
35
36 /* not set by parse_options */
37 int branch_exists;
38
39 const char *new_branch;
40 const char *new_branch_force;
41 const char *new_orphan_branch;
42 int new_branch_log;
43 enum branch_track track;
44 struct diff_options diff_options;
45};
46
47static int post_checkout_hook(struct commit *old, struct commit *new,
48 int changed)
49{
50 return run_hook(NULL, "post-checkout",
51 sha1_to_hex(old ? old->object.sha1 : null_sha1),
52 sha1_to_hex(new ? new->object.sha1 : null_sha1),
53 changed ? "1" : "0", NULL);
54 /* "new" can be NULL when checking out from the index before
55 a commit exists. */
56
57}
58
59static int update_some(const unsigned char *sha1, const char *base, int baselen,
60 const char *pathname, unsigned mode, int stage, void *context)
61{
62 int len;
63 struct cache_entry *ce;
64
65 if (S_ISDIR(mode))
66 return READ_TREE_RECURSIVE;
67
68 len = baselen + strlen(pathname);
69 ce = xcalloc(1, cache_entry_size(len));
70 hashcpy(ce->sha1, sha1);
71 memcpy(ce->name, base, baselen);
72 memcpy(ce->name + baselen, pathname, len - baselen);
73 ce->ce_flags = create_ce_flags(len, 0) | CE_UPDATE;
74 ce->ce_mode = create_ce_mode(mode);
75 add_cache_entry(ce, ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE);
76 return 0;
77}
78
79static int read_tree_some(struct tree *tree, const char **pathspec)
80{
81 read_tree_recursive(tree, "", 0, 0, pathspec, update_some, NULL);
82
83 /* update the index with the given tree's info
84 * for all args, expanding wildcards, and exit
85 * with any non-zero return code.
86 */
87 return 0;
88}
89
90static int skip_same_name(struct cache_entry *ce, int pos)
91{
92 while (++pos < active_nr &&
93 !strcmp(active_cache[pos]->name, ce->name))
94 ; /* skip */
95 return pos;
96}
97
98static int check_stage(int stage, struct cache_entry *ce, int pos)
99{
100 while (pos < active_nr &&
101 !strcmp(active_cache[pos]->name, ce->name)) {
102 if (ce_stage(active_cache[pos]) == stage)
103 return 0;
104 pos++;
105 }
106 return error("path '%s' does not have %s version",
107 ce->name,
108 (stage == 2) ? "our" : "their");
109}
110
111static int check_all_stages(struct cache_entry *ce, int pos)
112{
113 if (ce_stage(ce) != 1 ||
114 active_nr <= pos + 2 ||
115 strcmp(active_cache[pos+1]->name, ce->name) ||
116 ce_stage(active_cache[pos+1]) != 2 ||
117 strcmp(active_cache[pos+2]->name, ce->name) ||
118 ce_stage(active_cache[pos+2]) != 3)
119 return error("path '%s' does not have all three versions",
120 ce->name);
121 return 0;
122}
123
124static int checkout_stage(int stage, struct cache_entry *ce, int pos,
125 struct checkout *state)
126{
127 while (pos < active_nr &&
128 !strcmp(active_cache[pos]->name, ce->name)) {
129 if (ce_stage(active_cache[pos]) == stage)
130 return checkout_entry(active_cache[pos], state, NULL);
131 pos++;
132 }
133 return error("path '%s' does not have %s version",
134 ce->name,
135 (stage == 2) ? "our" : "their");
136}
137
138static int checkout_merged(int pos, struct checkout *state)
139{
140 struct cache_entry *ce = active_cache[pos];
141 const char *path = ce->name;
142 mmfile_t ancestor, ours, theirs;
143 int status;
144 unsigned char sha1[20];
145 mmbuffer_t result_buf;
146
147 if (ce_stage(ce) != 1 ||
148 active_nr <= pos + 2 ||
149 strcmp(active_cache[pos+1]->name, path) ||
150 ce_stage(active_cache[pos+1]) != 2 ||
151 strcmp(active_cache[pos+2]->name, path) ||
152 ce_stage(active_cache[pos+2]) != 3)
153 return error("path '%s' does not have all 3 versions", path);
154
155 read_mmblob(&ancestor, active_cache[pos]->sha1);
156 read_mmblob(&ours, active_cache[pos+1]->sha1);
157 read_mmblob(&theirs, active_cache[pos+2]->sha1);
158
159 /*
160 * NEEDSWORK: re-create conflicts from merges with
161 * merge.renormalize set, too
162 */
163 status = ll_merge(&result_buf, path, &ancestor, "base",
164 &ours, "ours", &theirs, "theirs", NULL);
165 free(ancestor.ptr);
166 free(ours.ptr);
167 free(theirs.ptr);
168 if (status < 0 || !result_buf.ptr) {
169 free(result_buf.ptr);
170 return error("path '%s': cannot merge", path);
171 }
172
173 /*
174 * NEEDSWORK:
175 * There is absolutely no reason to write this as a blob object
176 * and create a phony cache entry just to leak. This hack is
177 * primarily to get to the write_entry() machinery that massages
178 * the contents to work-tree format and writes out which only
179 * allows it for a cache entry. The code in write_entry() needs
180 * to be refactored to allow us to feed a <buffer, size, mode>
181 * instead of a cache entry. Such a refactoring would help
182 * merge_recursive as well (it also writes the merge result to the
183 * object database even when it may contain conflicts).
184 */
185 if (write_sha1_file(result_buf.ptr, result_buf.size,
186 blob_type, sha1))
187 die("Unable to add merge result for '%s'", path);
188 ce = make_cache_entry(create_ce_mode(active_cache[pos+1]->ce_mode),
189 sha1,
190 path, 2, 0);
191 if (!ce)
192 die("make_cache_entry failed for path '%s'", path);
193 status = checkout_entry(ce, state, NULL);
194 return status;
195}
196
197static int checkout_paths(struct tree *source_tree, const char **pathspec,
198 struct checkout_opts *opts)
199{
200 int pos;
201 struct checkout state;
202 static char *ps_matched;
203 unsigned char rev[20];
204 int flag;
205 struct commit *head;
206 int errs = 0;
207 int stage = opts->writeout_stage;
208 int merge = opts->merge;
209 int newfd;
210 struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
211
212 newfd = hold_locked_index(lock_file, 1);
213 if (read_cache_preload(pathspec) < 0)
214 return error("corrupt index file");
215
216 if (source_tree)
217 read_tree_some(source_tree, pathspec);
218
219 for (pos = 0; pathspec[pos]; pos++)
220 ;
221 ps_matched = xcalloc(1, pos);
222
223 for (pos = 0; pos < active_nr; pos++) {
224 struct cache_entry *ce = active_cache[pos];
225 if (source_tree && !(ce->ce_flags & CE_UPDATE))
226 continue;
227 match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, ps_matched);
228 }
229
230 if (report_path_error(ps_matched, pathspec, 0))
231 return 1;
232
233 /* "checkout -m path" to recreate conflicted state */
234 if (opts->merge)
235 unmerge_cache(pathspec);
236
237 /* Any unmerged paths? */
238 for (pos = 0; pos < active_nr; pos++) {
239 struct cache_entry *ce = active_cache[pos];
240 if (match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, NULL)) {
241 if (!ce_stage(ce))
242 continue;
243 if (opts->force) {
244 warning("path '%s' is unmerged", ce->name);
245 } else if (stage) {
246 errs |= check_stage(stage, ce, pos);
247 } else if (opts->merge) {
248 errs |= check_all_stages(ce, pos);
249 } else {
250 errs = 1;
251 error("path '%s' is unmerged", ce->name);
252 }
253 pos = skip_same_name(ce, pos) - 1;
254 }
255 }
256 if (errs)
257 return 1;
258
259 /* Now we are committed to check them out */
260 memset(&state, 0, sizeof(state));
261 state.force = 1;
262 state.refresh_cache = 1;
263 for (pos = 0; pos < active_nr; pos++) {
264 struct cache_entry *ce = active_cache[pos];
265 if (source_tree && !(ce->ce_flags & CE_UPDATE))
266 continue;
267 if (match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, NULL)) {
268 if (!ce_stage(ce)) {
269 errs |= checkout_entry(ce, &state, NULL);
270 continue;
271 }
272 if (stage)
273 errs |= checkout_stage(stage, ce, pos, &state);
274 else if (merge)
275 errs |= checkout_merged(pos, &state);
276 pos = skip_same_name(ce, pos) - 1;
277 }
278 }
279
280 if (write_cache(newfd, active_cache, active_nr) ||
281 commit_locked_index(lock_file))
282 die("unable to write new index file");
283
284 resolve_ref("HEAD", rev, 0, &flag);
285 head = lookup_commit_reference_gently(rev, 1);
286
287 errs |= post_checkout_hook(head, head, 0);
288 return errs;
289}
290
291static void show_local_changes(struct object *head, struct diff_options *opts)
292{
293 struct rev_info rev;
294 /* I think we want full paths, even if we're in a subdirectory. */
295 init_revisions(&rev, NULL);
296 rev.diffopt.flags = opts->flags;
297 rev.diffopt.output_format |= DIFF_FORMAT_NAME_STATUS;
298 if (diff_setup_done(&rev.diffopt) < 0)
299 die("diff_setup_done failed");
300 add_pending_object(&rev, head, NULL);
301 run_diff_index(&rev, 0);
302}
303
304static void describe_detached_head(char *msg, struct commit *commit)
305{
306 struct strbuf sb = STRBUF_INIT;
307 struct pretty_print_context ctx = {0};
308 parse_commit(commit);
309 pretty_print_commit(CMIT_FMT_ONELINE, commit, &sb, &ctx);
310 fprintf(stderr, "%s %s... %s\n", msg,
311 find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV), sb.buf);
312 strbuf_release(&sb);
313}
314
315static int reset_tree(struct tree *tree, struct checkout_opts *o, int worktree)
316{
317 struct unpack_trees_options opts;
318 struct tree_desc tree_desc;
319
320 memset(&opts, 0, sizeof(opts));
321 opts.head_idx = -1;
322 opts.update = worktree;
323 opts.skip_unmerged = !worktree;
324 opts.reset = 1;
325 opts.merge = 1;
326 opts.fn = oneway_merge;
327 opts.verbose_update = !o->quiet;
328 opts.src_index = &the_index;
329 opts.dst_index = &the_index;
330 parse_tree(tree);
331 init_tree_desc(&tree_desc, tree->buffer, tree->size);
332 switch (unpack_trees(1, &tree_desc, &opts)) {
333 case -2:
334 o->writeout_error = 1;
335 /*
336 * We return 0 nevertheless, as the index is all right
337 * and more importantly we have made best efforts to
338 * update paths in the work tree, and we cannot revert
339 * them.
340 */
341 case 0:
342 return 0;
343 default:
344 return 128;
345 }
346}
347
348struct branch_info {
349 const char *name; /* The short name used */
350 const char *path; /* The full name of a real branch */
351 struct commit *commit; /* The named commit */
352};
353
354static void setup_branch_path(struct branch_info *branch)
355{
356 struct strbuf buf = STRBUF_INIT;
357
358 strbuf_branchname(&buf, branch->name);
359 if (strcmp(buf.buf, branch->name))
360 branch->name = xstrdup(buf.buf);
361 strbuf_splice(&buf, 0, 0, "refs/heads/", 11);
362 branch->path = strbuf_detach(&buf, NULL);
363}
364
365static int merge_working_tree(struct checkout_opts *opts,
366 struct branch_info *old, struct branch_info *new)
367{
368 int ret;
369 struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
370 int newfd = hold_locked_index(lock_file, 1);
371
372 if (read_cache_preload(NULL) < 0)
373 return error("corrupt index file");
374
375 resolve_undo_clear();
376 if (opts->force) {
377 ret = reset_tree(new->commit->tree, opts, 1);
378 if (ret)
379 return ret;
380 } else {
381 struct tree_desc trees[2];
382 struct tree *tree;
383 struct unpack_trees_options topts;
384
385 memset(&topts, 0, sizeof(topts));
386 topts.head_idx = -1;
387 topts.src_index = &the_index;
388 topts.dst_index = &the_index;
389
390 setup_unpack_trees_porcelain(&topts, "checkout");
391
392 refresh_cache(REFRESH_QUIET);
393
394 if (unmerged_cache()) {
395 error("you need to resolve your current index first");
396 return 1;
397 }
398
399 /* 2-way merge to the new branch */
400 topts.initial_checkout = is_cache_unborn();
401 topts.update = 1;
402 topts.merge = 1;
403 topts.gently = opts->merge && old->commit;
404 topts.verbose_update = !opts->quiet;
405 topts.fn = twoway_merge;
406 topts.dir = xcalloc(1, sizeof(*topts.dir));
407 topts.dir->flags |= DIR_SHOW_IGNORED;
408 topts.dir->exclude_per_dir = ".gitignore";
409 tree = parse_tree_indirect(old->commit ?
410 old->commit->object.sha1 :
411 (unsigned char *)EMPTY_TREE_SHA1_BIN);
412 init_tree_desc(&trees[0], tree->buffer, tree->size);
413 tree = parse_tree_indirect(new->commit->object.sha1);
414 init_tree_desc(&trees[1], tree->buffer, tree->size);
415
416 ret = unpack_trees(2, trees, &topts);
417 if (ret == -1) {
418 /*
419 * Unpack couldn't do a trivial merge; either
420 * give up or do a real merge, depending on
421 * whether the merge flag was used.
422 */
423 struct tree *result;
424 struct tree *work;
425 struct merge_options o;
426 if (!opts->merge)
427 return 1;
428
429 /*
430 * Without old->commit, the below is the same as
431 * the two-tree unpack we already tried and failed.
432 */
433 if (!old->commit)
434 return 1;
435
436 /* Do more real merge */
437
438 /*
439 * We update the index fully, then write the
440 * tree from the index, then merge the new
441 * branch with the current tree, with the old
442 * branch as the base. Then we reset the index
443 * (but not the working tree) to the new
444 * branch, leaving the working tree as the
445 * merged version, but skipping unmerged
446 * entries in the index.
447 */
448
449 add_files_to_cache(NULL, NULL, 0);
450 /*
451 * NEEDSWORK: carrying over local changes
452 * when branches have different end-of-line
453 * normalization (or clean+smudge rules) is
454 * a pain; plumb in an option to set
455 * o.renormalize?
456 */
457 init_merge_options(&o);
458 o.verbosity = 0;
459 work = write_tree_from_memory(&o);
460
461 ret = reset_tree(new->commit->tree, opts, 1);
462 if (ret)
463 return ret;
464 o.ancestor = old->name;
465 o.branch1 = new->name;
466 o.branch2 = "local";
467 merge_trees(&o, new->commit->tree, work,
468 old->commit->tree, &result);
469 ret = reset_tree(new->commit->tree, opts, 0);
470 if (ret)
471 return ret;
472 }
473 }
474
475 if (write_cache(newfd, active_cache, active_nr) ||
476 commit_locked_index(lock_file))
477 die("unable to write new index file");
478
479 if (!opts->force && !opts->quiet)
480 show_local_changes(&new->commit->object, &opts->diff_options);
481
482 return 0;
483}
484
485static void report_tracking(struct branch_info *new)
486{
487 struct strbuf sb = STRBUF_INIT;
488 struct branch *branch = branch_get(new->name);
489
490 if (!format_tracking_info(branch, &sb))
491 return;
492 fputs(sb.buf, stdout);
493 strbuf_release(&sb);
494}
495
496static void detach_advice(const char *old_path, const char *new_name)
497{
498 const char fmt[] =
499 "Note: checking out '%s'.\n\n"
500 "You are in 'detached HEAD' state. You can look around, make experimental\n"
501 "changes and commit them, and you can discard any commits you make in this\n"
502 "state without impacting any branches by performing another checkout.\n\n"
503 "If you want to create a new branch to retain commits you create, you may\n"
504 "do so (now or later) by using -b with the checkout command again. Example:\n\n"
505 " git checkout -b new_branch_name\n\n";
506
507 fprintf(stderr, fmt, new_name);
508}
509
510static void update_refs_for_switch(struct checkout_opts *opts,
511 struct branch_info *old,
512 struct branch_info *new)
513{
514 struct strbuf msg = STRBUF_INIT;
515 const char *old_desc;
516 if (opts->new_branch) {
517 if (opts->new_orphan_branch) {
518 if (opts->new_branch_log && !log_all_ref_updates) {
519 int temp;
520 char log_file[PATH_MAX];
521 char *ref_name = mkpath("refs/heads/%s", opts->new_orphan_branch);
522
523 temp = log_all_ref_updates;
524 log_all_ref_updates = 1;
525 if (log_ref_setup(ref_name, log_file, sizeof(log_file))) {
526 fprintf(stderr, "Can not do reflog for '%s'\n",
527 opts->new_orphan_branch);
528 log_all_ref_updates = temp;
529 return;
530 }
531 log_all_ref_updates = temp;
532 }
533 }
534 else
535 create_branch(old->name, opts->new_branch, new->name,
536 opts->new_branch_force ? 1 : 0,
537 opts->new_branch_log, opts->track);
538 new->name = opts->new_branch;
539 setup_branch_path(new);
540 }
541
542 old_desc = old->name;
543 if (!old_desc && old->commit)
544 old_desc = sha1_to_hex(old->commit->object.sha1);
545 strbuf_addf(&msg, "checkout: moving from %s to %s",
546 old_desc ? old_desc : "(invalid)", new->name);
547
548 if (new->path) {
549 create_symref("HEAD", new->path, msg.buf);
550 if (!opts->quiet) {
551 if (old->path && !strcmp(new->path, old->path))
552 fprintf(stderr, "Already on '%s'\n",
553 new->name);
554 else if (opts->new_branch)
555 fprintf(stderr, "Switched to%s branch '%s'\n",
556 opts->branch_exists ? " and reset" : " a new",
557 new->name);
558 else
559 fprintf(stderr, "Switched to branch '%s'\n",
560 new->name);
561 }
562 if (old->path && old->name) {
563 char log_file[PATH_MAX], ref_file[PATH_MAX];
564
565 git_snpath(log_file, sizeof(log_file), "logs/%s", old->path);
566 git_snpath(ref_file, sizeof(ref_file), "%s", old->path);
567 if (!file_exists(ref_file) && file_exists(log_file))
568 remove_path(log_file);
569 }
570 } else if (strcmp(new->name, "HEAD")) {
571 update_ref(msg.buf, "HEAD", new->commit->object.sha1, NULL,
572 REF_NODEREF, DIE_ON_ERR);
573 if (!opts->quiet) {
574 if (old->path && advice_detached_head)
575 detach_advice(old->path, new->name);
576 describe_detached_head("HEAD is now at", new->commit);
577 }
578 }
579 remove_branch_state();
580 strbuf_release(&msg);
581 if (!opts->quiet && (new->path || !strcmp(new->name, "HEAD")))
582 report_tracking(new);
583}
584
585static int switch_branches(struct checkout_opts *opts, struct branch_info *new)
586{
587 int ret = 0;
588 struct branch_info old;
589 unsigned char rev[20];
590 int flag;
591 memset(&old, 0, sizeof(old));
592 old.path = resolve_ref("HEAD", rev, 0, &flag);
593 old.commit = lookup_commit_reference_gently(rev, 1);
594 if (!(flag & REF_ISSYMREF))
595 old.path = NULL;
596
597 if (old.path && !prefixcmp(old.path, "refs/heads/"))
598 old.name = old.path + strlen("refs/heads/");
599
600 if (!new->name) {
601 new->name = "HEAD";
602 new->commit = old.commit;
603 if (!new->commit)
604 die("You are on a branch yet to be born");
605 parse_commit(new->commit);
606 }
607
608 ret = merge_working_tree(opts, &old, new);
609 if (ret)
610 return ret;
611
612 /*
613 * If we were on a detached HEAD, but have now moved to
614 * a new commit, we want to mention the old commit once more
615 * to remind the user that it might be lost.
616 */
617 if (!opts->quiet && !old.path && old.commit && new->commit != old.commit)
618 describe_detached_head("Previous HEAD position was", old.commit);
619
620 update_refs_for_switch(opts, &old, new);
621
622 ret = post_checkout_hook(old.commit, new->commit, 1);
623 return ret || opts->writeout_error;
624}
625
626static int git_checkout_config(const char *var, const char *value, void *cb)
627{
628 if (!strcmp(var, "diff.ignoresubmodules")) {
629 struct checkout_opts *opts = cb;
630 handle_ignore_submodules_arg(&opts->diff_options, value);
631 return 0;
632 }
633
634 if (!prefixcmp(var, "submodule."))
635 return parse_submodule_config_option(var, value);
636
637 return git_xmerge_config(var, value, NULL);
638}
639
640static int interactive_checkout(const char *revision, const char **pathspec,
641 struct checkout_opts *opts)
642{
643 return run_add_interactive(revision, "--patch=checkout", pathspec);
644}
645
646struct tracking_name_data {
647 const char *name;
648 char *remote;
649 int unique;
650};
651
652static int check_tracking_name(const char *refname, const unsigned char *sha1,
653 int flags, void *cb_data)
654{
655 struct tracking_name_data *cb = cb_data;
656 const char *slash;
657
658 if (prefixcmp(refname, "refs/remotes/"))
659 return 0;
660 slash = strchr(refname + 13, '/');
661 if (!slash || strcmp(slash + 1, cb->name))
662 return 0;
663 if (cb->remote) {
664 cb->unique = 0;
665 return 0;
666 }
667 cb->remote = xstrdup(refname);
668 return 0;
669}
670
671static const char *unique_tracking_name(const char *name)
672{
673 struct tracking_name_data cb_data = { NULL, NULL, 1 };
674 cb_data.name = name;
675 for_each_ref(check_tracking_name, &cb_data);
676 if (cb_data.unique)
677 return cb_data.remote;
678 free(cb_data.remote);
679 return NULL;
680}
681
682int cmd_checkout(int argc, const char **argv, const char *prefix)
683{
684 struct checkout_opts opts;
685 unsigned char rev[20];
686 const char *arg;
687 struct branch_info new;
688 struct tree *source_tree = NULL;
689 char *conflict_style = NULL;
690 int patch_mode = 0;
691 int dwim_new_local_branch = 1;
692 struct option options[] = {
693 OPT__QUIET(&opts.quiet, "suppress progress reporting"),
694 OPT_STRING('b', NULL, &opts.new_branch, "branch",
695 "create and checkout a new branch"),
696 OPT_STRING('B', NULL, &opts.new_branch_force, "branch",
697 "create/reset and checkout a branch"),
698 OPT_BOOLEAN('l', NULL, &opts.new_branch_log, "create reflog for new branch"),
699 OPT_SET_INT('t', "track", &opts.track, "set upstream info for new branch",
700 BRANCH_TRACK_EXPLICIT),
701 OPT_STRING(0, "orphan", &opts.new_orphan_branch, "new branch", "new unparented branch"),
702 OPT_SET_INT('2', "ours", &opts.writeout_stage, "checkout our version for unmerged files",
703 2),
704 OPT_SET_INT('3', "theirs", &opts.writeout_stage, "checkout their version for unmerged files",
705 3),
706 OPT__FORCE(&opts.force, "force checkout (throw away local modifications)"),
707 OPT_BOOLEAN('m', "merge", &opts.merge, "perform a 3-way merge with the new branch"),
708 OPT_STRING(0, "conflict", &conflict_style, "style",
709 "conflict style (merge or diff3)"),
710 OPT_BOOLEAN('p', "patch", &patch_mode, "select hunks interactively"),
711 { OPTION_BOOLEAN, 0, "guess", &dwim_new_local_branch, NULL,
712 "second guess 'git checkout no-such-branch'",
713 PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
714 OPT_END(),
715 };
716 int has_dash_dash;
717
718 memset(&opts, 0, sizeof(opts));
719 memset(&new, 0, sizeof(new));
720
721 gitmodules_config();
722 git_config(git_checkout_config, &opts);
723
724 opts.track = BRANCH_TRACK_UNSPECIFIED;
725
726 argc = parse_options(argc, argv, prefix, options, checkout_usage,
727 PARSE_OPT_KEEP_DASHDASH);
728
729 /* we can assume from now on new_branch = !new_branch_force */
730 if (opts.new_branch && opts.new_branch_force)
731 die("-B cannot be used with -b");
732
733 /* copy -B over to -b, so that we can just check the latter */
734 if (opts.new_branch_force)
735 opts.new_branch = opts.new_branch_force;
736
737 if (patch_mode && (opts.track > 0 || opts.new_branch
738 || opts.new_branch_log || opts.merge || opts.force))
739 die ("--patch is incompatible with all other options");
740
741 /* --track without -b should DWIM */
742 if (0 < opts.track && !opts.new_branch) {
743 const char *argv0 = argv[0];
744 if (!argc || !strcmp(argv0, "--"))
745 die ("--track needs a branch name");
746 if (!prefixcmp(argv0, "refs/"))
747 argv0 += 5;
748 if (!prefixcmp(argv0, "remotes/"))
749 argv0 += 8;
750 argv0 = strchr(argv0, '/');
751 if (!argv0 || !argv0[1])
752 die ("Missing branch name; try -b");
753 opts.new_branch = argv0 + 1;
754 }
755
756 if (opts.new_orphan_branch) {
757 if (opts.new_branch)
758 die("--orphan and -b|-B are mutually exclusive");
759 if (opts.track > 0)
760 die("--orphan cannot be used with -t");
761 opts.new_branch = opts.new_orphan_branch;
762 }
763
764 if (conflict_style) {
765 opts.merge = 1; /* implied */
766 git_xmerge_config("merge.conflictstyle", conflict_style, NULL);
767 }
768
769 if (opts.force && opts.merge)
770 die("git checkout: -f and -m are incompatible");
771
772 /*
773 * case 1: git checkout <ref> -- [<paths>]
774 *
775 * <ref> must be a valid tree, everything after the '--' must be
776 * a path.
777 *
778 * case 2: git checkout -- [<paths>]
779 *
780 * everything after the '--' must be paths.
781 *
782 * case 3: git checkout <something> [<paths>]
783 *
784 * With no paths, if <something> is a commit, that is to
785 * switch to the branch or detach HEAD at it. As a special case,
786 * if <something> is A...B (missing A or B means HEAD but you can
787 * omit at most one side), and if there is a unique merge base
788 * between A and B, A...B names that merge base.
789 *
790 * With no paths, if <something> is _not_ a commit, no -t nor -b
791 * was given, and there is a remote-tracking branch whose name is
792 * <something> in one and only one remote, then this is a short-hand
793 * to fork local <something> from that remote-tracking branch.
794 *
795 * Otherwise <something> shall not be ambiguous.
796 * - If it's *only* a reference, treat it like case (1).
797 * - If it's only a path, treat it like case (2).
798 * - else: fail.
799 *
800 */
801 if (argc) {
802 if (!strcmp(argv[0], "--")) { /* case (2) */
803 argv++;
804 argc--;
805 goto no_reference;
806 }
807
808 arg = argv[0];
809 has_dash_dash = (argc > 1) && !strcmp(argv[1], "--");
810
811 if (!strcmp(arg, "-"))
812 arg = "@{-1}";
813
814 if (get_sha1_mb(arg, rev)) {
815 if (has_dash_dash) /* case (1) */
816 die("invalid reference: %s", arg);
817 if (!patch_mode &&
818 dwim_new_local_branch &&
819 opts.track == BRANCH_TRACK_UNSPECIFIED &&
820 !opts.new_branch &&
821 !check_filename(NULL, arg) &&
822 argc == 1) {
823 const char *remote = unique_tracking_name(arg);
824 if (!remote || get_sha1(remote, rev))
825 goto no_reference;
826 opts.new_branch = arg;
827 arg = remote;
828 /* DWIMmed to create local branch */
829 }
830 else
831 goto no_reference;
832 }
833
834 /* we can't end up being in (2) anymore, eat the argument */
835 argv++;
836 argc--;
837
838 new.name = arg;
839 if ((new.commit = lookup_commit_reference_gently(rev, 1))) {
840 setup_branch_path(&new);
841
842 if ((check_ref_format(new.path) == CHECK_REF_FORMAT_OK) &&
843 resolve_ref(new.path, rev, 1, NULL))
844 ;
845 else
846 new.path = NULL;
847 parse_commit(new.commit);
848 source_tree = new.commit->tree;
849 } else
850 source_tree = parse_tree_indirect(rev);
851
852 if (!source_tree) /* case (1): want a tree */
853 die("reference is not a tree: %s", arg);
854 if (!has_dash_dash) {/* case (3 -> 1) */
855 /*
856 * Do not complain the most common case
857 * git checkout branch
858 * even if there happen to be a file called 'branch';
859 * it would be extremely annoying.
860 */
861 if (argc)
862 verify_non_filename(NULL, arg);
863 }
864 else {
865 argv++;
866 argc--;
867 }
868 }
869
870no_reference:
871
872 if (opts.track == BRANCH_TRACK_UNSPECIFIED)
873 opts.track = git_branch_track;
874
875 if (argc) {
876 const char **pathspec = get_pathspec(prefix, argv);
877
878 if (!pathspec)
879 die("invalid path specification");
880
881 if (patch_mode)
882 return interactive_checkout(new.name, pathspec, &opts);
883
884 /* Checkout paths */
885 if (opts.new_branch) {
886 if (argc == 1) {
887 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]);
888 } else {
889 die("git checkout: updating paths is incompatible with switching branches.");
890 }
891 }
892
893 if (1 < !!opts.writeout_stage + !!opts.force + !!opts.merge)
894 die("git checkout: --ours/--theirs, --force and --merge are incompatible when\nchecking out of the index.");
895
896 return checkout_paths(source_tree, pathspec, &opts);
897 }
898
899 if (patch_mode)
900 return interactive_checkout(new.name, NULL, &opts);
901
902 if (opts.new_branch) {
903 struct strbuf buf = STRBUF_INIT;
904 if (strbuf_check_branch_ref(&buf, opts.new_branch))
905 die("git checkout: we do not like '%s' as a branch name.",
906 opts.new_branch);
907 if (!get_sha1(buf.buf, rev)) {
908 opts.branch_exists = 1;
909 if (!opts.new_branch_force)
910 die("git checkout: branch %s already exists",
911 opts.new_branch);
912 }
913 strbuf_release(&buf);
914 }
915
916 if (new.name && !new.commit) {
917 die("Cannot switch branch to a non-commit.");
918 }
919 if (opts.writeout_stage)
920 die("--ours/--theirs is incompatible with switching branches.");
921
922 return switch_branches(&opts, &new);
923}