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);
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 match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, ps_matched);
226 }
227
228 if (report_path_error(ps_matched, pathspec, 0))
229 return 1;
230
231 /* "checkout -m path" to recreate conflicted state */
232 if (opts->merge)
233 unmerge_cache(pathspec);
234
235 /* Any unmerged paths? */
236 for (pos = 0; pos < active_nr; pos++) {
237 struct cache_entry *ce = active_cache[pos];
238 if (match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, NULL)) {
239 if (!ce_stage(ce))
240 continue;
241 if (opts->force) {
242 warning("path '%s' is unmerged", ce->name);
243 } else if (stage) {
244 errs |= check_stage(stage, ce, pos);
245 } else if (opts->merge) {
246 errs |= check_all_stages(ce, pos);
247 } else {
248 errs = 1;
249 error("path '%s' is unmerged", ce->name);
250 }
251 pos = skip_same_name(ce, pos) - 1;
252 }
253 }
254 if (errs)
255 return 1;
256
257 /* Now we are committed to check them out */
258 memset(&state, 0, sizeof(state));
259 state.force = 1;
260 state.refresh_cache = 1;
261 for (pos = 0; pos < active_nr; pos++) {
262 struct cache_entry *ce = active_cache[pos];
263 if (match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, NULL)) {
264 if (!ce_stage(ce)) {
265 errs |= checkout_entry(ce, &state, NULL);
266 continue;
267 }
268 if (stage)
269 errs |= checkout_stage(stage, ce, pos, &state);
270 else if (merge)
271 errs |= checkout_merged(pos, &state);
272 pos = skip_same_name(ce, pos) - 1;
273 }
274 }
275
276 if (write_cache(newfd, active_cache, active_nr) ||
277 commit_locked_index(lock_file))
278 die("unable to write new index file");
279
280 resolve_ref("HEAD", rev, 0, &flag);
281 head = lookup_commit_reference_gently(rev, 1);
282
283 errs |= post_checkout_hook(head, head, 0);
284 return errs;
285}
286
287static void show_local_changes(struct object *head, struct diff_options *opts)
288{
289 struct rev_info rev;
290 /* I think we want full paths, even if we're in a subdirectory. */
291 init_revisions(&rev, NULL);
292 rev.diffopt.flags = opts->flags;
293 rev.diffopt.output_format |= DIFF_FORMAT_NAME_STATUS;
294 if (diff_setup_done(&rev.diffopt) < 0)
295 die("diff_setup_done failed");
296 add_pending_object(&rev, head, NULL);
297 run_diff_index(&rev, 0);
298}
299
300static void describe_detached_head(char *msg, struct commit *commit)
301{
302 struct strbuf sb = STRBUF_INIT;
303 parse_commit(commit);
304 pp_commit_easy(CMIT_FMT_ONELINE, commit, &sb);
305 fprintf(stderr, "%s %s... %s\n", msg,
306 find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV), sb.buf);
307 strbuf_release(&sb);
308}
309
310static int reset_tree(struct tree *tree, struct checkout_opts *o, int worktree)
311{
312 struct unpack_trees_options opts;
313 struct tree_desc tree_desc;
314
315 memset(&opts, 0, sizeof(opts));
316 opts.head_idx = -1;
317 opts.update = worktree;
318 opts.skip_unmerged = !worktree;
319 opts.reset = 1;
320 opts.merge = 1;
321 opts.fn = oneway_merge;
322 opts.verbose_update = !o->quiet;
323 opts.src_index = &the_index;
324 opts.dst_index = &the_index;
325 parse_tree(tree);
326 init_tree_desc(&tree_desc, tree->buffer, tree->size);
327 switch (unpack_trees(1, &tree_desc, &opts)) {
328 case -2:
329 o->writeout_error = 1;
330 /*
331 * We return 0 nevertheless, as the index is all right
332 * and more importantly we have made best efforts to
333 * update paths in the work tree, and we cannot revert
334 * them.
335 */
336 case 0:
337 return 0;
338 default:
339 return 128;
340 }
341}
342
343struct branch_info {
344 const char *name; /* The short name used */
345 const char *path; /* The full name of a real branch */
346 struct commit *commit; /* The named commit */
347};
348
349static void setup_branch_path(struct branch_info *branch)
350{
351 struct strbuf buf = STRBUF_INIT;
352
353 strbuf_branchname(&buf, branch->name);
354 if (strcmp(buf.buf, branch->name))
355 branch->name = xstrdup(buf.buf);
356 strbuf_splice(&buf, 0, 0, "refs/heads/", 11);
357 branch->path = strbuf_detach(&buf, NULL);
358}
359
360static int merge_working_tree(struct checkout_opts *opts,
361 struct branch_info *old, struct branch_info *new)
362{
363 int ret;
364 struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
365 int newfd = hold_locked_index(lock_file, 1);
366
367 if (read_cache_preload(NULL) < 0)
368 return error("corrupt index file");
369
370 resolve_undo_clear();
371 if (opts->force) {
372 ret = reset_tree(new->commit->tree, opts, 1);
373 if (ret)
374 return ret;
375 } else {
376 struct tree_desc trees[2];
377 struct tree *tree;
378 struct unpack_trees_options topts;
379
380 memset(&topts, 0, sizeof(topts));
381 topts.head_idx = -1;
382 topts.src_index = &the_index;
383 topts.dst_index = &the_index;
384
385 setup_unpack_trees_porcelain(&topts, "checkout");
386
387 refresh_cache(REFRESH_QUIET);
388
389 if (unmerged_cache()) {
390 error("you need to resolve your current index first");
391 return 1;
392 }
393
394 /* 2-way merge to the new branch */
395 topts.initial_checkout = is_cache_unborn();
396 topts.update = 1;
397 topts.merge = 1;
398 topts.gently = opts->merge && old->commit;
399 topts.verbose_update = !opts->quiet;
400 topts.fn = twoway_merge;
401 topts.dir = xcalloc(1, sizeof(*topts.dir));
402 topts.dir->flags |= DIR_SHOW_IGNORED;
403 topts.dir->exclude_per_dir = ".gitignore";
404 tree = parse_tree_indirect(old->commit ?
405 old->commit->object.sha1 :
406 (unsigned char *)EMPTY_TREE_SHA1_BIN);
407 init_tree_desc(&trees[0], tree->buffer, tree->size);
408 tree = parse_tree_indirect(new->commit->object.sha1);
409 init_tree_desc(&trees[1], tree->buffer, tree->size);
410
411 ret = unpack_trees(2, trees, &topts);
412 if (ret == -1) {
413 /*
414 * Unpack couldn't do a trivial merge; either
415 * give up or do a real merge, depending on
416 * whether the merge flag was used.
417 */
418 struct tree *result;
419 struct tree *work;
420 struct merge_options o;
421 if (!opts->merge)
422 return 1;
423
424 /*
425 * Without old->commit, the below is the same as
426 * the two-tree unpack we already tried and failed.
427 */
428 if (!old->commit)
429 return 1;
430
431 /* Do more real merge */
432
433 /*
434 * We update the index fully, then write the
435 * tree from the index, then merge the new
436 * branch with the current tree, with the old
437 * branch as the base. Then we reset the index
438 * (but not the working tree) to the new
439 * branch, leaving the working tree as the
440 * merged version, but skipping unmerged
441 * entries in the index.
442 */
443
444 add_files_to_cache(NULL, NULL, 0);
445 /*
446 * NEEDSWORK: carrying over local changes
447 * when branches have different end-of-line
448 * normalization (or clean+smudge rules) is
449 * a pain; plumb in an option to set
450 * o.renormalize?
451 */
452 init_merge_options(&o);
453 o.verbosity = 0;
454 work = write_tree_from_memory(&o);
455
456 ret = reset_tree(new->commit->tree, opts, 1);
457 if (ret)
458 return ret;
459 o.ancestor = old->name;
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;
467 }
468 }
469
470 if (write_cache(newfd, active_cache, active_nr) ||
471 commit_locked_index(lock_file))
472 die("unable to write new index file");
473
474 if (!opts->force && !opts->quiet)
475 show_local_changes(&new->commit->object, &opts->diff_options);
476
477 return 0;
478}
479
480static void report_tracking(struct branch_info *new)
481{
482 struct strbuf sb = STRBUF_INIT;
483 struct branch *branch = branch_get(new->name);
484
485 if (!format_tracking_info(branch, &sb))
486 return;
487 fputs(sb.buf, stdout);
488 strbuf_release(&sb);
489}
490
491static void detach_advice(const char *old_path, const char *new_name)
492{
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";
501
502 fprintf(stderr, fmt, new_name);
503}
504
505static void update_refs_for_switch(struct checkout_opts *opts,
506 struct branch_info *old,
507 struct branch_info *new)
508{
509 struct strbuf msg = STRBUF_INIT;
510 const char *old_desc;
511 if (opts->new_branch) {
512 if (opts->new_orphan_branch) {
513 if (opts->new_branch_log && !log_all_ref_updates) {
514 int temp;
515 char log_file[PATH_MAX];
516 char *ref_name = mkpath("refs/heads/%s", opts->new_orphan_branch);
517
518 temp = log_all_ref_updates;
519 log_all_ref_updates = 1;
520 if (log_ref_setup(ref_name, log_file, sizeof(log_file))) {
521 fprintf(stderr, "Can not do reflog for '%s'\n",
522 opts->new_orphan_branch);
523 log_all_ref_updates = temp;
524 return;
525 }
526 log_all_ref_updates = temp;
527 }
528 }
529 else
530 create_branch(old->name, opts->new_branch, new->name,
531 opts->new_branch_force ? 1 : 0,
532 opts->new_branch_log, opts->track);
533 new->name = opts->new_branch;
534 setup_branch_path(new);
535 }
536
537 old_desc = old->name;
538 if (!old_desc && old->commit)
539 old_desc = sha1_to_hex(old->commit->object.sha1);
540 strbuf_addf(&msg, "checkout: moving from %s to %s",
541 old_desc ? old_desc : "(invalid)", new->name);
542
543 if (new->path) {
544 create_symref("HEAD", new->path, msg.buf);
545 if (!opts->quiet) {
546 if (old->path && !strcmp(new->path, old->path))
547 fprintf(stderr, "Already on '%s'\n",
548 new->name);
549 else if (opts->new_branch)
550 fprintf(stderr, "Switched to%s branch '%s'\n",
551 opts->branch_exists ? " and reset" : " a new",
552 new->name);
553 else
554 fprintf(stderr, "Switched to branch '%s'\n",
555 new->name);
556 }
557 if (old->path && old->name) {
558 char log_file[PATH_MAX], ref_file[PATH_MAX];
559
560 git_snpath(log_file, sizeof(log_file), "logs/%s", old->path);
561 git_snpath(ref_file, sizeof(ref_file), "%s", old->path);
562 if (!file_exists(ref_file) && file_exists(log_file))
563 remove_path(log_file);
564 }
565 } else if (strcmp(new->name, "HEAD")) {
566 update_ref(msg.buf, "HEAD", new->commit->object.sha1, NULL,
567 REF_NODEREF, DIE_ON_ERR);
568 if (!opts->quiet) {
569 if (old->path && advice_detached_head)
570 detach_advice(old->path, new->name);
571 describe_detached_head("HEAD is now at", new->commit);
572 }
573 }
574 remove_branch_state();
575 strbuf_release(&msg);
576 if (!opts->quiet && (new->path || !strcmp(new->name, "HEAD")))
577 report_tracking(new);
578}
579
580static int switch_branches(struct checkout_opts *opts, struct branch_info *new)
581{
582 int ret = 0;
583 struct branch_info old;
584 unsigned char rev[20];
585 int flag;
586 memset(&old, 0, sizeof(old));
587 old.path = resolve_ref("HEAD", rev, 0, &flag);
588 old.commit = lookup_commit_reference_gently(rev, 1);
589 if (!(flag & REF_ISSYMREF))
590 old.path = NULL;
591
592 if (old.path && !prefixcmp(old.path, "refs/heads/"))
593 old.name = old.path + strlen("refs/heads/");
594
595 if (!new->name) {
596 new->name = "HEAD";
597 new->commit = old.commit;
598 if (!new->commit)
599 die("You are on a branch yet to be born");
600 parse_commit(new->commit);
601 }
602
603 ret = merge_working_tree(opts, &old, new);
604 if (ret)
605 return ret;
606
607 /*
608 * If we were on a detached HEAD, but have now moved to
609 * a new commit, we want to mention the old commit once more
610 * to remind the user that it might be lost.
611 */
612 if (!opts->quiet && !old.path && old.commit && new->commit != old.commit)
613 describe_detached_head("Previous HEAD position was", old.commit);
614
615 update_refs_for_switch(opts, &old, new);
616
617 ret = post_checkout_hook(old.commit, new->commit, 1);
618 return ret || opts->writeout_error;
619}
620
621static int git_checkout_config(const char *var, const char *value, void *cb)
622{
623 if (!strcmp(var, "diff.ignoresubmodules")) {
624 struct checkout_opts *opts = cb;
625 handle_ignore_submodules_arg(&opts->diff_options, value);
626 return 0;
627 }
628
629 if (!prefixcmp(var, "submodule."))
630 return parse_submodule_config_option(var, value);
631
632 return git_xmerge_config(var, value, NULL);
633}
634
635static int interactive_checkout(const char *revision, const char **pathspec,
636 struct checkout_opts *opts)
637{
638 return run_add_interactive(revision, "--patch=checkout", pathspec);
639}
640
641struct tracking_name_data {
642 const char *name;
643 char *remote;
644 int unique;
645};
646
647static int check_tracking_name(const char *refname, const unsigned char *sha1,
648 int flags, void *cb_data)
649{
650 struct tracking_name_data *cb = cb_data;
651 const char *slash;
652
653 if (prefixcmp(refname, "refs/remotes/"))
654 return 0;
655 slash = strchr(refname + 13, '/');
656 if (!slash || strcmp(slash + 1, cb->name))
657 return 0;
658 if (cb->remote) {
659 cb->unique = 0;
660 return 0;
661 }
662 cb->remote = xstrdup(refname);
663 return 0;
664}
665
666static const char *unique_tracking_name(const char *name)
667{
668 struct tracking_name_data cb_data = { NULL, NULL, 1 };
669 cb_data.name = name;
670 for_each_ref(check_tracking_name, &cb_data);
671 if (cb_data.unique)
672 return cb_data.remote;
673 free(cb_data.remote);
674 return NULL;
675}
676
677int cmd_checkout(int argc, const char **argv, const char *prefix)
678{
679 struct checkout_opts opts;
680 unsigned char rev[20];
681 const char *arg;
682 struct branch_info new;
683 struct tree *source_tree = NULL;
684 char *conflict_style = NULL;
685 int patch_mode = 0;
686 int dwim_new_local_branch = 1;
687 struct option options[] = {
688 OPT__QUIET(&opts.quiet, "suppress progress reporting"),
689 OPT_STRING('b', NULL, &opts.new_branch, "branch",
690 "create and checkout a new branch"),
691 OPT_STRING('B', NULL, &opts.new_branch_force, "branch",
692 "create/reset and checkout a branch"),
693 OPT_BOOLEAN('l', NULL, &opts.new_branch_log, "create reflog for new branch"),
694 OPT_SET_INT('t', "track", &opts.track, "set upstream info for new branch",
695 BRANCH_TRACK_EXPLICIT),
696 OPT_STRING(0, "orphan", &opts.new_orphan_branch, "new branch", "new unparented branch"),
697 OPT_SET_INT('2', "ours", &opts.writeout_stage, "checkout our version for unmerged files",
698 2),
699 OPT_SET_INT('3', "theirs", &opts.writeout_stage, "checkout their version for unmerged files",
700 3),
701 OPT__FORCE(&opts.force, "force checkout (throw away local modifications)"),
702 OPT_BOOLEAN('m', "merge", &opts.merge, "perform a 3-way merge with the new branch"),
703 OPT_STRING(0, "conflict", &conflict_style, "style",
704 "conflict style (merge or diff3)"),
705 OPT_BOOLEAN('p', "patch", &patch_mode, "select hunks interactively"),
706 { OPTION_BOOLEAN, 0, "guess", &dwim_new_local_branch, NULL,
707 "second guess 'git checkout no-such-branch'",
708 PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
709 OPT_END(),
710 };
711 int has_dash_dash;
712
713 memset(&opts, 0, sizeof(opts));
714 memset(&new, 0, sizeof(new));
715
716 gitmodules_config();
717 git_config(git_checkout_config, &opts);
718
719 opts.track = BRANCH_TRACK_UNSPECIFIED;
720
721 argc = parse_options(argc, argv, prefix, options, checkout_usage,
722 PARSE_OPT_KEEP_DASHDASH);
723
724 /* we can assume from now on new_branch = !new_branch_force */
725 if (opts.new_branch && opts.new_branch_force)
726 die("-B cannot be used with -b");
727
728 /* copy -B over to -b, so that we can just check the latter */
729 if (opts.new_branch_force)
730 opts.new_branch = opts.new_branch_force;
731
732 if (patch_mode && (opts.track > 0 || opts.new_branch
733 || opts.new_branch_log || opts.merge || opts.force))
734 die ("--patch is incompatible with all other options");
735
736 /* --track without -b should DWIM */
737 if (0 < opts.track && !opts.new_branch) {
738 const char *argv0 = argv[0];
739 if (!argc || !strcmp(argv0, "--"))
740 die ("--track needs a branch name");
741 if (!prefixcmp(argv0, "refs/"))
742 argv0 += 5;
743 if (!prefixcmp(argv0, "remotes/"))
744 argv0 += 8;
745 argv0 = strchr(argv0, '/');
746 if (!argv0 || !argv0[1])
747 die ("Missing branch name; try -b");
748 opts.new_branch = argv0 + 1;
749 }
750
751 if (opts.new_orphan_branch) {
752 if (opts.new_branch)
753 die("--orphan and -b|-B are mutually exclusive");
754 if (opts.track > 0)
755 die("--orphan cannot be used with -t");
756 opts.new_branch = opts.new_orphan_branch;
757 }
758
759 if (conflict_style) {
760 opts.merge = 1; /* implied */
761 git_xmerge_config("merge.conflictstyle", conflict_style, NULL);
762 }
763
764 if (opts.force && opts.merge)
765 die("git checkout: -f and -m are incompatible");
766
767 /*
768 * case 1: git checkout <ref> -- [<paths>]
769 *
770 * <ref> must be a valid tree, everything after the '--' must be
771 * a path.
772 *
773 * case 2: git checkout -- [<paths>]
774 *
775 * everything after the '--' must be paths.
776 *
777 * case 3: git checkout <something> [<paths>]
778 *
779 * With no paths, if <something> is a commit, that is to
780 * switch to the branch or detach HEAD at it. As a special case,
781 * if <something> is A...B (missing A or B means HEAD but you can
782 * omit at most one side), and if there is a unique merge base
783 * between A and B, A...B names that merge base.
784 *
785 * With no paths, if <something> is _not_ a commit, no -t nor -b
786 * was given, and there is a remote-tracking branch whose name is
787 * <something> in one and only one remote, then this is a short-hand
788 * to fork local <something> from that remote-tracking branch.
789 *
790 * Otherwise <something> shall not be ambiguous.
791 * - If it's *only* a reference, treat it like case (1).
792 * - If it's only a path, treat it like case (2).
793 * - else: fail.
794 *
795 */
796 if (argc) {
797 if (!strcmp(argv[0], "--")) { /* case (2) */
798 argv++;
799 argc--;
800 goto no_reference;
801 }
802
803 arg = argv[0];
804 has_dash_dash = (argc > 1) && !strcmp(argv[1], "--");
805
806 if (!strcmp(arg, "-"))
807 arg = "@{-1}";
808
809 if (get_sha1_mb(arg, rev)) {
810 if (has_dash_dash) /* case (1) */
811 die("invalid reference: %s", arg);
812 if (!patch_mode &&
813 dwim_new_local_branch &&
814 opts.track == BRANCH_TRACK_UNSPECIFIED &&
815 !opts.new_branch &&
816 !check_filename(NULL, arg) &&
817 argc == 1) {
818 const char *remote = unique_tracking_name(arg);
819 if (!remote || get_sha1(remote, rev))
820 goto no_reference;
821 opts.new_branch = arg;
822 arg = remote;
823 /* DWIMmed to create local branch */
824 }
825 else
826 goto no_reference;
827 }
828
829 /* we can't end up being in (2) anymore, eat the argument */
830 argv++;
831 argc--;
832
833 new.name = arg;
834 if ((new.commit = lookup_commit_reference_gently(rev, 1))) {
835 setup_branch_path(&new);
836
837 if ((check_ref_format(new.path) == CHECK_REF_FORMAT_OK) &&
838 resolve_ref(new.path, rev, 1, NULL))
839 ;
840 else
841 new.path = NULL;
842 parse_commit(new.commit);
843 source_tree = new.commit->tree;
844 } else
845 source_tree = parse_tree_indirect(rev);
846
847 if (!source_tree) /* case (1): want a tree */
848 die("reference is not a tree: %s", arg);
849 if (!has_dash_dash) {/* case (3 -> 1) */
850 /*
851 * Do not complain the most common case
852 * git checkout branch
853 * even if there happen to be a file called 'branch';
854 * it would be extremely annoying.
855 */
856 if (argc)
857 verify_non_filename(NULL, arg);
858 }
859 else {
860 argv++;
861 argc--;
862 }
863 }
864
865no_reference:
866
867 if (opts.track == BRANCH_TRACK_UNSPECIFIED)
868 opts.track = git_branch_track;
869
870 if (argc) {
871 const char **pathspec = get_pathspec(prefix, argv);
872
873 if (!pathspec)
874 die("invalid path specification");
875
876 if (patch_mode)
877 return interactive_checkout(new.name, pathspec, &opts);
878
879 /* Checkout paths */
880 if (opts.new_branch) {
881 if (argc == 1) {
882 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]);
883 } else {
884 die("git checkout: updating paths is incompatible with switching branches.");
885 }
886 }
887
888 if (1 < !!opts.writeout_stage + !!opts.force + !!opts.merge)
889 die("git checkout: --ours/--theirs, --force and --merge are incompatible when\nchecking out of the index.");
890
891 return checkout_paths(source_tree, pathspec, &opts);
892 }
893
894 if (patch_mode)
895 return interactive_checkout(new.name, NULL, &opts);
896
897 if (opts.new_branch) {
898 struct strbuf buf = STRBUF_INIT;
899 if (strbuf_check_branch_ref(&buf, opts.new_branch))
900 die("git checkout: we do not like '%s' as a branch name.",
901 opts.new_branch);
902 if (!get_sha1(buf.buf, rev)) {
903 opts.branch_exists = 1;
904 if (!opts.new_branch_force)
905 die("git checkout: branch %s already exists",
906 opts.new_branch);
907 }
908 strbuf_release(&buf);
909 }
910
911 if (new.name && !new.commit) {
912 die("Cannot switch branch to a non-commit.");
913 }
914 if (opts.writeout_stage)
915 die("--ours/--theirs is incompatible with switching branches.");
916
917 return switch_branches(&opts, &new);
918}