]> git.ipfire.org Git - thirdparty/git.git/blame - builtin-checkout.c
fast-import: clarify documentation of "feature" command
[thirdparty/git.git] / builtin-checkout.c
CommitLineData
782c2d65
DB
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"
b9d37a54 8#include "cache-tree.h"
782c2d65
DB
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"
79a1e6b4 16#include "remote.h"
0cf8581e
JH
17#include "blob.h"
18#include "xdiff-interface.h"
19#include "ll-merge.h"
cfc5789a 20#include "resolve-undo.h"
782c2d65
DB
21
22static const char * const checkout_usage[] = {
23 "git checkout [options] <branch>",
24 "git checkout [options] [<branch>] -- <file>...",
25 NULL,
26};
27
db941099
JH
28struct checkout_opts {
29 int quiet;
30 int merge;
31 int force;
38901a48 32 int writeout_stage;
db941099
JH
33 int writeout_error;
34
35 const char *new_branch;
36 int new_branch_log;
37 enum branch_track track;
38};
39
782c2d65
DB
40static int post_checkout_hook(struct commit *old, struct commit *new,
41 int changed)
42{
ae98a008
SB
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);
2292ce47
SB
47 /* "new" can be NULL when checking out from the index before
48 a commit exists. */
ae98a008 49
782c2d65
DB
50}
51
52static int update_some(const unsigned char *sha1, const char *base, int baselen,
671f0707 53 const char *pathname, unsigned mode, int stage, void *context)
782c2d65
DB
54{
55 int len;
56 struct cache_entry *ce;
57
782c2d65
DB
58 if (S_ISDIR(mode))
59 return READ_TREE_RECURSIVE;
60
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;
70}
71
72static int read_tree_some(struct tree *tree, const char **pathspec)
73{
671f0707 74 read_tree_recursive(tree, "", 0, 0, pathspec, update_some, NULL);
782c2d65 75
782c2d65
DB
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.
79 */
80 return 0;
81}
82
8fdcf312
JH
83static int skip_same_name(struct cache_entry *ce, int pos)
84{
85 while (++pos < active_nr &&
86 !strcmp(active_cache[pos]->name, ce->name))
87 ; /* skip */
88 return pos;
89}
90
38901a48
JH
91static int check_stage(int stage, struct cache_entry *ce, int pos)
92{
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++;
98 }
99 return error("path '%s' does not have %s version",
100 ce->name,
101 (stage == 2) ? "our" : "their");
102}
103
0cf8581e
JH
104static int check_all_stages(struct cache_entry *ce, int pos)
105{
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;
115}
116
38901a48
JH
117static int checkout_stage(int stage, struct cache_entry *ce, int pos,
118 struct checkout *state)
119{
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++;
125 }
126 return error("path '%s' does not have %s version",
127 ce->name,
128 (stage == 2) ? "our" : "their");
129}
8fdcf312 130
0cf8581e
JH
131/* NEEDSWORK: share with merge-recursive */
132static void fill_mm(const unsigned char *sha1, mmfile_t *mm)
133{
134 unsigned long size;
135 enum object_type type;
136
137 if (!hashcmp(sha1, null_sha1)) {
138 mm->ptr = xstrdup("");
139 mm->size = 0;
140 return;
141 }
142
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;
147}
148
149static int checkout_merged(int pos, struct checkout *state)
150{
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;
157
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);
165
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);
169
170 status = ll_merge(&result_buf, path, &ancestor,
6d6f9acc 171 &ours, "ours", &theirs, "theirs", 0);
0cf8581e
JH
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);
178 }
179
180 /*
181 * NEEDSWORK:
182 * There is absolutely no reason to write this as a blob object
3ea3c215 183 * and create a phony cache entry just to leak. This hack is
0cf8581e
JH
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).
191 */
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);
048f2762
DP
198 if (!ce)
199 die("make_cache_entry failed for path '%s'", path);
0cf8581e
JH
200 status = checkout_entry(ce, state, NULL);
201 return status;
202}
8fdcf312 203
db941099
JH
204static int checkout_paths(struct tree *source_tree, const char **pathspec,
205 struct checkout_opts *opts)
782c2d65
DB
206{
207 int pos;
208 struct checkout state;
209 static char *ps_matched;
210 unsigned char rev[20];
211 int flag;
212 struct commit *head;
d2b3691b 213 int errs = 0;
38901a48 214 int stage = opts->writeout_stage;
0cf8581e 215 int merge = opts->merge;
75336878
DB
216 int newfd;
217 struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
218
219 newfd = hold_locked_index(lock_file, 1);
53996fe5 220 if (read_cache_preload(pathspec) < 0)
b96524f8 221 return error("corrupt index file");
75336878
DB
222
223 if (source_tree)
224 read_tree_some(source_tree, pathspec);
225
782c2d65
DB
226 for (pos = 0; pathspec[pos]; pos++)
227 ;
228 ps_matched = xcalloc(1, pos);
229
230 for (pos = 0; pos < active_nr; pos++) {
231 struct cache_entry *ce = active_cache[pos];
0b50922a 232 match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, ps_matched);
782c2d65
DB
233 }
234
235 if (report_path_error(ps_matched, pathspec, 0))
236 return 1;
237
4421a823
JH
238 /* "checkout -m path" to recreate conflicted state */
239 if (opts->merge)
240 unmerge_cache(pathspec);
241
8fdcf312
JH
242 /* Any unmerged paths? */
243 for (pos = 0; pos < active_nr; pos++) {
244 struct cache_entry *ce = active_cache[pos];
0b50922a 245 if (match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, NULL)) {
8fdcf312
JH
246 if (!ce_stage(ce))
247 continue;
db941099
JH
248 if (opts->force) {
249 warning("path '%s' is unmerged", ce->name);
38901a48
JH
250 } else if (stage) {
251 errs |= check_stage(stage, ce, pos);
0cf8581e
JH
252 } else if (opts->merge) {
253 errs |= check_all_stages(ce, pos);
db941099
JH
254 } else {
255 errs = 1;
256 error("path '%s' is unmerged", ce->name);
257 }
8fdcf312
JH
258 pos = skip_same_name(ce, pos) - 1;
259 }
260 }
261 if (errs)
262 return 1;
263
d2b3691b 264 /* Now we are committed to check them out */
782c2d65
DB
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];
0b50922a 270 if (match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, NULL)) {
8fdcf312
JH
271 if (!ce_stage(ce)) {
272 errs |= checkout_entry(ce, &state, NULL);
273 continue;
274 }
38901a48
JH
275 if (stage)
276 errs |= checkout_stage(stage, ce, pos, &state);
0cf8581e
JH
277 else if (merge)
278 errs |= checkout_merged(pos, &state);
8fdcf312 279 pos = skip_same_name(ce, pos) - 1;
782c2d65
DB
280 }
281 }
282
75336878
DB
283 if (write_cache(newfd, active_cache, active_nr) ||
284 commit_locked_index(lock_file))
285 die("unable to write new index file");
286
782c2d65
DB
287 resolve_ref("HEAD", rev, 0, &flag);
288 head = lookup_commit_reference_gently(rev, 1);
289
d2b3691b
JH
290 errs |= post_checkout_hook(head, head, 0);
291 return errs;
782c2d65
DB
292}
293
294static void show_local_changes(struct object *head)
295{
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;
e752f4bb
KC
301 if (diff_setup_done(&rev.diffopt) < 0)
302 die("diff_setup_done failed");
782c2d65
DB
303 add_pending_object(&rev, head, NULL);
304 run_diff_index(&rev, 0);
305}
306
307static void describe_detached_head(char *msg, struct commit *commit)
308{
f285a2d7 309 struct strbuf sb = STRBUF_INIT;
dd2e794a 310 struct pretty_print_context ctx = {0};
782c2d65 311 parse_commit(commit);
dd2e794a 312 pretty_print_commit(CMIT_FMT_ONELINE, commit, &sb, &ctx);
782c2d65
DB
313 fprintf(stderr, "%s %s... %s\n", msg,
314 find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV), sb.buf);
315 strbuf_release(&sb);
316}
317
6286a08d 318static int reset_tree(struct tree *tree, struct checkout_opts *o, int worktree)
782c2d65
DB
319{
320 struct unpack_trees_options opts;
321 struct tree_desc tree_desc;
bc052d7f 322
782c2d65
DB
323 memset(&opts, 0, sizeof(opts));
324 opts.head_idx = -1;
6286a08d
JH
325 opts.update = worktree;
326 opts.skip_unmerged = !worktree;
782c2d65
DB
327 opts.reset = 1;
328 opts.merge = 1;
329 opts.fn = oneway_merge;
6286a08d 330 opts.verbose_update = !o->quiet;
34110cd4
LT
331 opts.src_index = &the_index;
332 opts.dst_index = &the_index;
782c2d65
DB
333 parse_tree(tree);
334 init_tree_desc(&tree_desc, tree->buffer, tree->size);
291d823e
JH
335 switch (unpack_trees(1, &tree_desc, &opts)) {
336 case -2:
337 o->writeout_error = 1;
338 /*
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.
343 */
344 case 0:
345 return 0;
346 default:
84a5750b 347 return 128;
291d823e 348 }
782c2d65
DB
349}
350
782c2d65
DB
351struct 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 */
355};
356
357static void setup_branch_path(struct branch_info *branch)
358{
f285a2d7 359 struct strbuf buf = STRBUF_INIT;
ae5a6c36 360
a552de75
JH
361 strbuf_branchname(&buf, branch->name);
362 if (strcmp(buf.buf, branch->name))
ae5a6c36 363 branch->name = xstrdup(buf.buf);
a552de75 364 strbuf_splice(&buf, 0, 0, "refs/heads/", 11);
782c2d65
DB
365 branch->path = strbuf_detach(&buf, NULL);
366}
367
368static int merge_working_tree(struct checkout_opts *opts,
75ea38df 369 struct branch_info *old, struct branch_info *new)
782c2d65
DB
370{
371 int ret;
372 struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
373 int newfd = hold_locked_index(lock_file, 1);
b96524f8 374
53996fe5 375 if (read_cache_preload(NULL) < 0)
b96524f8 376 return error("corrupt index file");
782c2d65 377
cfc5789a 378 resolve_undo_clear();
782c2d65 379 if (opts->force) {
6286a08d 380 ret = reset_tree(new->commit->tree, opts, 1);
782c2d65
DB
381 if (ret)
382 return ret;
383 } else {
384 struct tree_desc trees[2];
385 struct tree *tree;
386 struct unpack_trees_options topts;
bc052d7f 387
782c2d65
DB
388 memset(&topts, 0, sizeof(topts));
389 topts.head_idx = -1;
34110cd4
LT
390 topts.src_index = &the_index;
391 topts.dst_index = &the_index;
782c2d65 392
8ccba008
JH
393 topts.msgs.not_uptodate_file = "You have local changes to '%s'; cannot switch branches.";
394
782c2d65
DB
395 refresh_cache(REFRESH_QUIET);
396
397 if (unmerged_cache()) {
04c9e11f
JH
398 error("you need to resolve your current index first");
399 return 1;
782c2d65 400 }
04c9e11f
JH
401
402 /* 2-way merge to the new branch */
fa7b3c2f 403 topts.initial_checkout = is_cache_unborn();
04c9e11f
JH
404 topts.update = 1;
405 topts.merge = 1;
64da3ae5 406 topts.gently = opts->merge && old->commit;
04c9e11f
JH
407 topts.verbose_update = !opts->quiet;
408 topts.fn = twoway_merge;
409 topts.dir = xcalloc(1, sizeof(*topts.dir));
7c4c97c0 410 topts.dir->flags |= DIR_SHOW_IGNORED;
04c9e11f 411 topts.dir->exclude_per_dir = ".gitignore";
cc580af8
JK
412 tree = parse_tree_indirect(old->commit ?
413 old->commit->object.sha1 :
414 (unsigned char *)EMPTY_TREE_SHA1_BIN);
04c9e11f
JH
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);
418
291d823e 419 ret = unpack_trees(2, trees, &topts);
49d833dc 420 if (ret == -1) {
782c2d65
DB
421 /*
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.
425 */
426 struct tree *result;
427 struct tree *work;
8a2fce18 428 struct merge_options o;
782c2d65
DB
429 if (!opts->merge)
430 return 1;
64da3ae5
JH
431
432 /*
433 * Without old->commit, the below is the same as
434 * the two-tree unpack we already tried and failed.
435 */
436 if (!old->commit)
437 return 1;
782c2d65
DB
438
439 /* Do more real merge */
440
441 /*
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.
450 */
451
7ae02a30 452 add_files_to_cache(NULL, NULL, 0);
8a2fce18
MV
453 init_merge_options(&o);
454 o.verbosity = 0;
455 work = write_tree_from_memory(&o);
782c2d65 456
6286a08d 457 ret = reset_tree(new->commit->tree, opts, 1);
782c2d65
DB
458 if (ret)
459 return ret;
8a2fce18
MV
460 o.branch1 = new->name;
461 o.branch2 = "local";
462 merge_trees(&o, new->commit->tree, work,
463 old->commit->tree, &result);
6286a08d 464 ret = reset_tree(new->commit->tree, opts, 0);
84a5750b
JH
465 if (ret)
466 return ret;
782c2d65
DB
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
7fe4a728 474 if (!opts->force && !opts->quiet)
782c2d65
DB
475 show_local_changes(&new->commit->object);
476
477 return 0;
478}
479
6d21bf96 480static void report_tracking(struct branch_info *new)
79a1e6b4 481{
6d21bf96 482 struct strbuf sb = STRBUF_INIT;
b56fca07 483 struct branch *branch = branch_get(new->name);
79a1e6b4 484
6d21bf96 485 if (!format_tracking_info(branch, &sb))
79a1e6b4 486 return;
6d21bf96
JH
487 fputs(sb.buf, stdout);
488 strbuf_release(&sb);
b0030db3 489}
79a1e6b4 490
13be3e31
JH
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
782c2d65
DB
505static void update_refs_for_switch(struct checkout_opts *opts,
506 struct branch_info *old,
507 struct branch_info *new)
508{
f285a2d7 509 struct strbuf msg = STRBUF_INIT;
782c2d65
DB
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);
516 }
517
782c2d65 518 old_desc = old->name;
323e00fd 519 if (!old_desc && old->commit)
782c2d65
DB
520 old_desc = sha1_to_hex(old->commit->object.sha1);
521 strbuf_addf(&msg, "checkout: moving from %s to %s",
323e00fd 522 old_desc ? old_desc : "(invalid)", new->name);
782c2d65
DB
523
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))
714fddf2 528 fprintf(stderr, "Already on '%s'\n",
782c2d65
DB
529 new->name);
530 else
714fddf2 531 fprintf(stderr, "Switched to%s branch '%s'\n",
782c2d65
DB
532 opts->new_branch ? " a new" : "",
533 new->name);
534 }
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) {
13be3e31
JH
539 if (old->path && advice_detached_head)
540 detach_advice(old->path, new->name);
782c2d65
DB
541 describe_detached_head("HEAD is now at", new->commit);
542 }
543 }
544 remove_branch_state();
545 strbuf_release(&msg);
b0030db3 546 if (!opts->quiet && (new->path || !strcmp(new->name, "HEAD")))
6d21bf96 547 report_tracking(new);
782c2d65
DB
548}
549
75ea38df 550static int switch_branches(struct checkout_opts *opts, struct branch_info *new)
782c2d65
DB
551{
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;
561
562 if (old.path && !prefixcmp(old.path, "refs/heads/"))
563 old.name = old.path + strlen("refs/heads/");
564
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);
571 }
572
75ea38df 573 ret = merge_working_tree(opts, &old, new);
782c2d65
DB
574 if (ret)
575 return ret;
576
77ebd56d
DC
577 /*
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.
581 */
582 if (!opts->quiet && !old.path && old.commit && new->commit != old.commit)
583 describe_detached_head("Previous HEAD position was", old.commit);
584
782c2d65
DB
585 update_refs_for_switch(opts, &old, new);
586
291d823e
JH
587 ret = post_checkout_hook(old.commit, new->commit, 1);
588 return ret || opts->writeout_error;
782c2d65
DB
589}
590
0cf8581e
JH
591static int git_checkout_config(const char *var, const char *value, void *cb)
592{
593 return git_xmerge_config(var, value, cb);
594}
595
4f353658
TR
596static int interactive_checkout(const char *revision, const char **pathspec,
597 struct checkout_opts *opts)
598{
599 return run_add_interactive(revision, "--patch=checkout", pathspec);
600}
601
70c9ac2f
JH
602struct tracking_name_data {
603 const char *name;
604 char *remote;
605 int unique;
606};
607
608static int check_tracking_name(const char *refname, const unsigned char *sha1,
609 int flags, void *cb_data)
610{
611 struct tracking_name_data *cb = cb_data;
612 const char *slash;
613
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;
622 }
623 cb->remote = xstrdup(refname);
624 return 0;
625}
626
627static const char *unique_tracking_name(const char *name)
628{
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;
635}
4f353658 636
782c2d65
DB
637int cmd_checkout(int argc, const char **argv, const char *prefix)
638{
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;
eac5a401 644 char *conflict_style = NULL;
4f353658 645 int patch_mode = 0;
46148dd7 646 int dwim_new_local_branch = 1;
782c2d65
DB
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"),
498a6e7e 651 OPT_SET_INT('t', "track", &opts.track, "track",
9ed36cfa 652 BRANCH_TRACK_EXPLICIT),
38901a48
JH
653 OPT_SET_INT('2', "ours", &opts.writeout_stage, "stage",
654 2),
655 OPT_SET_INT('3', "theirs", &opts.writeout_stage, "stage",
656 3),
f7aec129 657 OPT_BOOLEAN('f', "force", &opts.force, "force"),
eac5a401
JH
658 OPT_BOOLEAN('m', "merge", &opts.merge, "merge"),
659 OPT_STRING(0, "conflict", &conflict_style, "style",
660 "conflict style (merge or diff3)"),
4f353658 661 OPT_BOOLEAN('p', "patch", &patch_mode, "select hunks interactively"),
46148dd7
JH
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 },
b249b552 665 OPT_END(),
782c2d65 666 };
859fdaba 667 int has_dash_dash;
782c2d65
DB
668
669 memset(&opts, 0, sizeof(opts));
670 memset(&new, 0, sizeof(new));
671
0cf8581e 672 git_config(git_checkout_config, NULL);
782c2d65 673
9188ed89 674 opts.track = BRANCH_TRACK_UNSPECIFIED;
782c2d65 675
37782920 676 argc = parse_options(argc, argv, prefix, options, checkout_usage,
f5242ebf 677 PARSE_OPT_KEEP_DASHDASH);
859fdaba 678
4f353658
TR
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");
682
bb0ceb62 683 /* --track without -b should DWIM */
9188ed89
AR
684 if (0 < opts.track && !opts.new_branch) {
685 const char *argv0 = argv[0];
686 if (!argc || !strcmp(argv0, "--"))
bb0ceb62 687 die ("--track needs a branch name");
9188ed89
AR
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])
bb0ceb62 694 die ("Missing branch name; try -b");
9188ed89 695 opts.new_branch = argv0 + 1;
bb0ceb62
JS
696 }
697
eac5a401
JH
698 if (conflict_style) {
699 opts.merge = 1; /* implied */
700 git_xmerge_config("merge.conflictstyle", conflict_style, NULL);
701 }
702
859fdaba
PH
703 if (opts.force && opts.merge)
704 die("git checkout: -f and -m are incompatible");
705
706 /*
707 * case 1: git checkout <ref> -- [<paths>]
708 *
709 * <ref> must be a valid tree, everything after the '--' must be
710 * a path.
711 *
712 * case 2: git checkout -- [<paths>]
713 *
714 * everything after the '--' must be paths.
715 *
716 * case 3: git checkout <something> [<paths>]
717 *
718 * With no paths, if <something> is a commit, that is to
619a644d
JH
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.
859fdaba 723 *
70c9ac2f
JH
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.
728 *
859fdaba
PH
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.
733 *
734 */
782c2d65 735 if (argc) {
859fdaba
PH
736 if (!strcmp(argv[0], "--")) { /* case (2) */
737 argv++;
738 argc--;
739 goto no_reference;
740 }
741
782c2d65 742 arg = argv[0];
859fdaba
PH
743 has_dash_dash = (argc > 1) && !strcmp(argv[1], "--");
744
696acf45
TR
745 if (!strcmp(arg, "-"))
746 arg = "@{-1}";
747
619a644d 748 if (get_sha1_mb(arg, rev)) {
859fdaba
PH
749 if (has_dash_dash) /* case (1) */
750 die("invalid reference: %s", arg);
70c9ac2f 751 if (!patch_mode &&
46148dd7 752 dwim_new_local_branch &&
70c9ac2f
JH
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 */
763 }
764 else
765 goto no_reference;
859fdaba
PH
766 }
767
768 /* we can't end up being in (2) anymore, eat the argument */
769 argv++;
770 argc--;
771
3442ea4a 772 new.name = arg;
859fdaba 773 if ((new.commit = lookup_commit_reference_gently(rev, 1))) {
782c2d65 774 setup_branch_path(&new);
72a144e2
JH
775
776 if ((check_ref_format(new.path) == CHECK_REF_FORMAT_OK) &&
777 resolve_ref(new.path, rev, 1, NULL))
778 ;
782c2d65
DB
779 else
780 new.path = NULL;
781 parse_commit(new.commit);
782 source_tree = new.commit->tree;
859fdaba
PH
783 } else
784 source_tree = parse_tree_indirect(rev);
785
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) */
789 /*
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.
794 */
795 if (argc)
796 verify_non_filename(NULL, arg);
797 }
798 else {
782c2d65
DB
799 argv++;
800 argc--;
801 }
802 }
803
859fdaba 804no_reference:
70c9ac2f
JH
805
806 if (opts.track == BRANCH_TRACK_UNSPECIFIED)
807 opts.track = git_branch_track;
808
782c2d65
DB
809 if (argc) {
810 const char **pathspec = get_pathspec(prefix, argv);
301e42ed
AR
811
812 if (!pathspec)
813 die("invalid path specification");
814
4f353658
TR
815 if (patch_mode)
816 return interactive_checkout(new.name, pathspec, &opts);
817
782c2d65 818 /* Checkout paths */
0cf8581e 819 if (opts.new_branch) {
782c2d65 820 if (argc == 1) {
db941099 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]);
782c2d65 822 } else {
db941099 823 die("git checkout: updating paths is incompatible with switching branches.");
782c2d65
DB
824 }
825 }
826
0cf8581e
JH
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.");
829
db941099 830 return checkout_paths(source_tree, pathspec, &opts);
782c2d65
DB
831 }
832
4f353658
TR
833 if (patch_mode)
834 return interactive_checkout(new.name, NULL, &opts);
835
352eadc4 836 if (opts.new_branch) {
f285a2d7 837 struct strbuf buf = STRBUF_INIT;
a2fab531
JH
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);
352eadc4
DB
841 if (!get_sha1(buf.buf, rev))
842 die("git checkout: branch %s already exists", opts.new_branch);
352eadc4
DB
843 strbuf_release(&buf);
844 }
845
782c2d65
DB
846 if (new.name && !new.commit) {
847 die("Cannot switch branch to a non-commit.");
848 }
38901a48
JH
849 if (opts.writeout_stage)
850 die("--ours/--theirs is incompatible with switching branches.");
782c2d65 851
75ea38df 852 return switch_branches(&opts, &new);
782c2d65 853}