blob: 77e1694a785f533f2953727897fee8a19fb74d4e [file] [log] [blame]
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001/*
2 * Builtin "git merge"
3 *
4 * Copyright (c) 2008 Miklos Vajna <vmiklos@frugalware.org>
5 *
6 * Based on git-merge.sh by Junio C Hamano.
7 */
8
9#include "cache.h"
Brandon Williamsb2141fc2017-06-14 11:07:36 -070010#include "config.h"
Miklos Vajna1c7b76b2008-07-07 19:24:20 +020011#include "parse-options.h"
12#include "builtin.h"
Michael Haggerty697cc8e2014-10-01 12:28:42 +020013#include "lockfile.h"
Miklos Vajna1c7b76b2008-07-07 19:24:20 +020014#include "run-command.h"
15#include "diff.h"
16#include "refs.h"
Brandon Williamsec0cb492018-05-16 15:57:48 -070017#include "refspec.h"
Miklos Vajna1c7b76b2008-07-07 19:24:20 +020018#include "commit.h"
19#include "diffcore.h"
20#include "revision.h"
21#include "unpack-trees.h"
22#include "cache-tree.h"
23#include "dir.h"
24#include "utf8.h"
25#include "log-tree.h"
26#include "color.h"
Junio C Hamanofcab40a2008-07-15 19:09:46 -070027#include "rerere.h"
Miklos Vajna87091b42008-07-30 01:16:59 +020028#include "help.h"
Miklos Vajna18668f52008-08-28 15:43:00 +020029#include "merge-recursive.h"
Junio C Hamanocfc57892009-12-25 00:30:51 -080030#include "resolve-undo.h"
Junio C Hamano93e535a2011-03-23 23:48:24 -070031#include "remote.h"
Junio C Hamano898eacd2011-10-06 23:12:09 -070032#include "fmt-merge-msg.h"
Junio C Hamanoba3c69a2011-10-05 17:23:20 -070033#include "gpg-interface.h"
Junio C Hamano75c961b2014-10-24 11:34:59 -070034#include "sequencer.h"
René Scharfe02a8cfa2016-08-05 23:01:35 +020035#include "string-list.h"
Jonathan Tan3836d882017-08-18 15:20:21 -070036#include "packfile.h"
Junio C Hamanoadcc94a2018-02-14 10:18:55 -080037#include "tag.h"
Nguyễn Thái Ngọc Duy65b5f942018-05-20 20:40:06 +020038#include "alias.h"
Miklos Vajna1c7b76b2008-07-07 19:24:20 +020039
40#define DEFAULT_TWOHEAD (1<<0)
41#define DEFAULT_OCTOPUS (1<<1)
42#define NO_FAST_FORWARD (1<<2)
43#define NO_TRIVIAL (1<<3)
44
45struct strategy {
46 const char *name;
47 unsigned attr;
48};
49
50static const char * const builtin_merge_usage[] = {
Alex Henrie9c9b4f22015-01-13 00:44:47 -070051 N_("git merge [<options>] [<commit>...]"),
Nguyễn Thái Ngọc Duy962e6292012-08-20 19:32:24 +070052 N_("git merge --abort"),
Chris Packham367ff692016-12-14 21:37:55 +130053 N_("git merge --continue"),
Miklos Vajna1c7b76b2008-07-07 19:24:20 +020054 NULL
55};
56
Junio C Hamano898eacd2011-10-06 23:12:09 -070057static int show_diffstat = 1, shortlog_len = -1, squash;
Miklos Vajnaa54841e2013-07-02 16:47:57 +020058static int option_commit = 1;
59static int option_edit = -1;
Sebastian Götteefed0022013-03-31 18:02:24 +020060static int allow_trivial = 1, have_message, verify_signatures;
Nguyễn Thái Ngọc Duyc1d70362011-11-27 17:15:33 +070061static int overwrite_ignore = 1;
Jeff King2c477892011-12-18 00:03:22 -050062static struct strbuf merge_msg = STRBUF_INIT;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +020063static struct strategy **use_strategies;
64static size_t use_strategies_nr, use_strategies_alloc;
Avery Pennarun8cc5b292009-11-25 21:23:55 -050065static const char **xopts;
66static size_t xopts_nr, xopts_alloc;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +020067static const char *branch;
Junio C Hamano0d8fc3e2011-05-04 17:42:51 -070068static char *branch_mergeoptions;
Jonathan Nieder7610fa52010-08-05 06:32:41 -050069static int option_renormalize;
Tuncer Ayaz7f87aff2008-11-15 01:14:24 +010070static int verbosity;
Junio C Hamanocb6020b2009-12-04 00:20:48 -080071static int allow_rerere_auto;
Johan Herland35d2fff2010-11-09 22:49:59 +010072static int abort_current_merge;
Chris Packham367ff692016-12-14 21:37:55 +130073static int continue_current_merge;
Junio C Hamanoe379fdf2016-03-18 13:21:09 -070074static int allow_unrelated_histories;
Jeff King99bfc662011-02-20 04:53:21 -050075static int show_progress = -1;
Felipe Contrerasa01f7f22014-04-20 19:17:33 -050076static int default_to_upstream = 1;
Łukasz Gryglicki14d01b42017-07-04 09:33:06 +000077static int signoff;
Junio C Hamanoba3c69a2011-10-05 17:23:20 -070078static const char *sign_commit;
Stefan Bellerf8b86352017-09-07 15:04:29 -070079static int verify_msg = 1;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +020080
81static struct strategy all_strategy[] = {
Miklos Vajna1c7b76b2008-07-07 19:24:20 +020082 { "recursive", DEFAULT_TWOHEAD | NO_TRIVIAL },
83 { "octopus", DEFAULT_OCTOPUS },
84 { "resolve", 0 },
Miklos Vajna1c7b76b2008-07-07 19:24:20 +020085 { "ours", NO_FAST_FORWARD | NO_TRIVIAL },
86 { "subtree", NO_FAST_FORWARD | NO_TRIVIAL },
87};
88
89static const char *pull_twohead, *pull_octopus;
90
Miklos Vajnaa54841e2013-07-02 16:47:57 +020091enum ff_type {
92 FF_NO,
93 FF_ALLOW,
94 FF_ONLY
95};
96
97static enum ff_type fast_forward = FF_ALLOW;
98
Miklos Vajna1c7b76b2008-07-07 19:24:20 +020099static int option_parse_message(const struct option *opt,
100 const char *arg, int unset)
101{
102 struct strbuf *buf = opt->value;
103
104 if (unset)
105 strbuf_setlen(buf, 0);
Michele Ballabio74f5b7f2008-07-20 14:34:47 +0200106 else if (arg) {
Junio C Hamanoce9d8232009-12-02 10:00:58 -0800107 strbuf_addf(buf, "%s%s", buf->len ? "\n\n" : "", arg);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200108 have_message = 1;
Michele Ballabio74f5b7f2008-07-20 14:34:47 +0200109 } else
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +0000110 return error(_("switch `m' requires a value"));
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200111 return 0;
112}
113
Johannes Schindelin920f22e2017-12-22 15:10:02 +0100114static int option_read_message(struct parse_opt_ctx_t *ctx,
115 const struct option *opt, int unset)
116{
117 struct strbuf *buf = opt->value;
118 const char *arg;
119
120 if (unset)
121 BUG("-F cannot be negated");
122
123 if (ctx->opt) {
124 arg = ctx->opt;
125 ctx->opt = NULL;
126 } else if (ctx->argc > 1) {
127 ctx->argc--;
128 arg = *++ctx->argv;
129 } else
130 return opterror(opt, "requires a value", 0);
131
132 if (buf->len)
133 strbuf_addch(buf, '\n');
134 if (ctx->prefix && !is_absolute_path(arg))
135 arg = prefix_filename(ctx->prefix, arg);
136 if (strbuf_read_file(buf, arg, 0) < 0)
137 return error(_("could not read file '%s'"), arg);
138 have_message = 1;
139
140 return 0;
141}
142
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200143static struct strategy *get_strategy(const char *name)
144{
145 int i;
Miklos Vajna87091b42008-07-30 01:16:59 +0200146 struct strategy *ret;
147 static struct cmdnames main_cmds, other_cmds;
Alex Riesene3211802008-08-28 19:15:33 +0200148 static int loaded;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200149
150 if (!name)
151 return NULL;
152
153 for (i = 0; i < ARRAY_SIZE(all_strategy); i++)
154 if (!strcmp(name, all_strategy[i].name))
155 return &all_strategy[i];
Miklos Vajna1719b5e2008-07-21 18:10:47 +0200156
Alex Riesene3211802008-08-28 19:15:33 +0200157 if (!loaded) {
Miklos Vajna87091b42008-07-30 01:16:59 +0200158 struct cmdnames not_strategies;
Alex Riesene3211802008-08-28 19:15:33 +0200159 loaded = 1;
Miklos Vajna87091b42008-07-30 01:16:59 +0200160
Miklos Vajna87091b42008-07-30 01:16:59 +0200161 memset(&not_strategies, 0, sizeof(struct cmdnames));
Alex Riesene3211802008-08-28 19:15:33 +0200162 load_command_list("git-merge-", &main_cmds, &other_cmds);
Miklos Vajna87091b42008-07-30 01:16:59 +0200163 for (i = 0; i < main_cmds.cnt; i++) {
164 int j, found = 0;
165 struct cmdname *ent = main_cmds.names[i];
166 for (j = 0; j < ARRAY_SIZE(all_strategy); j++)
167 if (!strncmp(ent->name, all_strategy[j].name, ent->len)
168 && !all_strategy[j].name[ent->len])
169 found = 1;
170 if (!found)
171 add_cmdname(&not_strategies, ent->name, ent->len);
Miklos Vajna87091b42008-07-30 01:16:59 +0200172 }
Avery Pennaruned874652009-11-25 21:23:54 -0500173 exclude_cmds(&main_cmds, &not_strategies);
Miklos Vajna87091b42008-07-30 01:16:59 +0200174 }
175 if (!is_in_cmdlist(&main_cmds, name) && !is_in_cmdlist(&other_cmds, name)) {
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +0000176 fprintf(stderr, _("Could not find merge strategy '%s'.\n"), name);
177 fprintf(stderr, _("Available strategies are:"));
Junio C Hamano131f9a12008-08-20 22:07:55 -0700178 for (i = 0; i < main_cmds.cnt; i++)
179 fprintf(stderr, " %s", main_cmds.names[i]->name);
180 fprintf(stderr, ".\n");
181 if (other_cmds.cnt) {
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +0000182 fprintf(stderr, _("Available custom strategies are:"));
Junio C Hamano131f9a12008-08-20 22:07:55 -0700183 for (i = 0; i < other_cmds.cnt; i++)
184 fprintf(stderr, " %s", other_cmds.names[i]->name);
185 fprintf(stderr, ".\n");
186 }
Miklos Vajna87091b42008-07-30 01:16:59 +0200187 exit(1);
188 }
189
Brandon Casey19d4b412008-10-06 18:39:10 -0500190 ret = xcalloc(1, sizeof(struct strategy));
Miklos Vajna87091b42008-07-30 01:16:59 +0200191 ret->name = xstrdup(name);
Jonathan Nieder52b48ef2010-08-15 20:11:06 -0500192 ret->attr = NO_TRIVIAL;
Miklos Vajna87091b42008-07-30 01:16:59 +0200193 return ret;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200194}
195
196static void append_strategy(struct strategy *s)
197{
198 ALLOC_GROW(use_strategies, use_strategies_nr + 1, use_strategies_alloc);
199 use_strategies[use_strategies_nr++] = s;
200}
201
202static int option_parse_strategy(const struct option *opt,
203 const char *name, int unset)
204{
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200205 if (unset)
206 return 0;
207
Miklos Vajna1719b5e2008-07-21 18:10:47 +0200208 append_strategy(get_strategy(name));
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200209 return 0;
210}
211
Avery Pennarun8cc5b292009-11-25 21:23:55 -0500212static int option_parse_x(const struct option *opt,
213 const char *arg, int unset)
214{
215 if (unset)
216 return 0;
217
218 ALLOC_GROW(xopts, xopts_nr + 1, xopts_alloc);
219 xopts[xopts_nr++] = xstrdup(arg);
220 return 0;
221}
222
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200223static int option_parse_n(const struct option *opt,
224 const char *arg, int unset)
225{
226 show_diffstat = unset;
227 return 0;
228}
229
230static struct option builtin_merge_options[] = {
231 { OPTION_CALLBACK, 'n', NULL, NULL, NULL,
Nguyễn Thái Ngọc Duy962e6292012-08-20 19:32:24 +0700232 N_("do not show a diffstat at the end of the merge"),
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200233 PARSE_OPT_NOARG, option_parse_n },
Stefan Bellerd5d09d42013-08-03 13:51:19 +0200234 OPT_BOOL(0, "stat", &show_diffstat,
Nguyễn Thái Ngọc Duy962e6292012-08-20 19:32:24 +0700235 N_("show a diffstat at the end of the merge")),
Stefan Bellerd5d09d42013-08-03 13:51:19 +0200236 OPT_BOOL(0, "summary", &show_diffstat, N_("(synonym to --stat)")),
Nguyễn Thái Ngọc Duy962e6292012-08-20 19:32:24 +0700237 { OPTION_INTEGER, 0, "log", &shortlog_len, N_("n"),
238 N_("add (at most <n>) entries from shortlog to merge commit message"),
Ramkumar Ramachandra96e94202010-09-08 23:29:54 +0530239 PARSE_OPT_OPTARG, NULL, DEFAULT_MERGE_LOG_LEN },
Stefan Bellerd5d09d42013-08-03 13:51:19 +0200240 OPT_BOOL(0, "squash", &squash,
Nguyễn Thái Ngọc Duy962e6292012-08-20 19:32:24 +0700241 N_("create a single commit instead of doing a merge")),
Stefan Bellerd5d09d42013-08-03 13:51:19 +0200242 OPT_BOOL(0, "commit", &option_commit,
Nguyễn Thái Ngọc Duy962e6292012-08-20 19:32:24 +0700243 N_("perform a commit if the merge succeeds (default)")),
Junio C Hamanof8246282012-01-10 22:44:45 -0800244 OPT_BOOL('e', "edit", &option_edit,
Nguyễn Thái Ngọc Duy962e6292012-08-20 19:32:24 +0700245 N_("edit message before committing")),
Miklos Vajnaa54841e2013-07-02 16:47:57 +0200246 OPT_SET_INT(0, "ff", &fast_forward, N_("allow fast-forward (default)"), FF_ALLOW),
Nguyễn Thái Ngọc Duy3e4a67b2018-05-20 17:42:58 +0200247 OPT_SET_INT_F(0, "ff-only", &fast_forward,
248 N_("abort if fast-forward is not possible"),
249 FF_ONLY, PARSE_OPT_NONEG),
Junio C Hamanocb6020b2009-12-04 00:20:48 -0800250 OPT_RERERE_AUTOUPDATE(&allow_rerere_auto),
Sebastian Götteefed0022013-03-31 18:02:24 +0200251 OPT_BOOL(0, "verify-signatures", &verify_signatures,
Vasco Almeidac8bb9d22016-06-17 20:21:18 +0000252 N_("verify that the named commit has a valid GPG signature")),
Nguyễn Thái Ngọc Duy962e6292012-08-20 19:32:24 +0700253 OPT_CALLBACK('s', "strategy", &use_strategies, N_("strategy"),
254 N_("merge strategy to use"), option_parse_strategy),
255 OPT_CALLBACK('X', "strategy-option", &xopts, N_("option=value"),
256 N_("option for selected merge strategy"), option_parse_x),
257 OPT_CALLBACK('m', "message", &merge_msg, N_("message"),
258 N_("merge commit message (for a non-fast-forward merge)"),
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200259 option_parse_message),
Johannes Schindelin920f22e2017-12-22 15:10:02 +0100260 { OPTION_LOWLEVEL_CALLBACK, 'F', "file", &merge_msg, N_("path"),
261 N_("read message from file"), PARSE_OPT_NONEG,
262 (parse_opt_cb *) option_read_message },
Tuncer Ayaz7f87aff2008-11-15 01:14:24 +0100263 OPT__VERBOSITY(&verbosity),
Stefan Bellerd5d09d42013-08-03 13:51:19 +0200264 OPT_BOOL(0, "abort", &abort_current_merge,
Nguyễn Thái Ngọc Duy962e6292012-08-20 19:32:24 +0700265 N_("abort the current in-progress merge")),
Chris Packham367ff692016-12-14 21:37:55 +1300266 OPT_BOOL(0, "continue", &continue_current_merge,
267 N_("continue the current in-progress merge")),
Junio C Hamanoe379fdf2016-03-18 13:21:09 -0700268 OPT_BOOL(0, "allow-unrelated-histories", &allow_unrelated_histories,
269 N_("allow merging unrelated histories")),
Nguyễn Thái Ngọc Duy962e6292012-08-20 19:32:24 +0700270 OPT_SET_INT(0, "progress", &show_progress, N_("force progress reporting"), 1),
Junio C Hamanoe703d712014-03-23 15:58:12 -0700271 { OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key-id"),
Nguyễn Thái Ngọc Duy962e6292012-08-20 19:32:24 +0700272 N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
Stefan Bellerd5d09d42013-08-03 13:51:19 +0200273 OPT_BOOL(0, "overwrite-ignore", &overwrite_ignore, N_("update ignored files (default)")),
Łukasz Gryglicki14d01b42017-07-04 09:33:06 +0000274 OPT_BOOL(0, "signoff", &signoff, N_("add Signed-off-by:")),
Stefan Bellerf8b86352017-09-07 15:04:29 -0700275 OPT_BOOL(0, "verify", &verify_msg, N_("verify commit-msg hook")),
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200276 OPT_END()
277};
278
279/* Cleans up metadata that is uninteresting after a succeeded merge. */
280static void drop_save(void)
281{
Stefan Beller102de882018-05-17 15:51:51 -0700282 unlink(git_path_merge_head(the_repository));
283 unlink(git_path_merge_msg(the_repository));
284 unlink(git_path_merge_mode(the_repository));
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200285}
286
brian m. carlson52684312017-02-21 23:47:28 +0000287static int save_state(struct object_id *stash)
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200288{
289 int len;
René Scharfed3180272014-08-19 21:09:35 +0200290 struct child_process cp = CHILD_PROCESS_INIT;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200291 struct strbuf buffer = STRBUF_INIT;
292 const char *argv[] = {"stash", "create", NULL};
Rene Scharfe150888e2017-08-30 19:49:49 +0200293 int rc = -1;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200294
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200295 cp.argv = argv;
296 cp.out = -1;
297 cp.git_cmd = 1;
298
299 if (start_command(&cp))
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +0000300 die(_("could not run stash."));
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200301 len = strbuf_read(&buffer, cp.out, 1024);
302 close(cp.out);
303
304 if (finish_command(&cp) || len < 0)
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +0000305 die(_("stash failed"));
Nguyễn Thái Ngọc Duyb4fd9402011-08-19 21:50:05 +0700306 else if (!len) /* no changes */
Rene Scharfe150888e2017-08-30 19:49:49 +0200307 goto out;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200308 strbuf_setlen(&buffer, buffer.len-1);
brian m. carlson52684312017-02-21 23:47:28 +0000309 if (get_oid(buffer.buf, stash))
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +0000310 die(_("not a valid object: %s"), buffer.buf);
Rene Scharfe150888e2017-08-30 19:49:49 +0200311 rc = 0;
312out:
313 strbuf_release(&buffer);
314 return rc;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200315}
316
brian m. carlsoncb910222018-05-02 00:25:56 +0000317static void read_empty(const struct object_id *oid, int verbose)
Clemens Buchacher172b6422010-11-14 23:07:49 +0100318{
319 int i = 0;
320 const char *args[7];
321
322 args[i++] = "read-tree";
323 if (verbose)
324 args[i++] = "-v";
325 args[i++] = "-m";
326 args[i++] = "-u";
brian m. carlsoncb910222018-05-02 00:25:56 +0000327 args[i++] = empty_tree_oid_hex();
328 args[i++] = oid_to_hex(oid);
Clemens Buchacher172b6422010-11-14 23:07:49 +0100329 args[i] = NULL;
330
331 if (run_command_v_opt(args, RUN_GIT_CMD))
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +0000332 die(_("read-tree failed"));
Clemens Buchacher172b6422010-11-14 23:07:49 +0100333}
334
brian m. carlsoncb910222018-05-02 00:25:56 +0000335static void reset_hard(const struct object_id *oid, int verbose)
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200336{
337 int i = 0;
338 const char *args[6];
339
340 args[i++] = "read-tree";
341 if (verbose)
342 args[i++] = "-v";
343 args[i++] = "--reset";
344 args[i++] = "-u";
brian m. carlsoncb910222018-05-02 00:25:56 +0000345 args[i++] = oid_to_hex(oid);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200346 args[i] = NULL;
347
348 if (run_command_v_opt(args, RUN_GIT_CMD))
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +0000349 die(_("read-tree failed"));
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200350}
351
brian m. carlson52684312017-02-21 23:47:28 +0000352static void restore_state(const struct object_id *head,
353 const struct object_id *stash)
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200354{
Brandon Caseyf285a2d2008-10-09 14:12:12 -0500355 struct strbuf sb = STRBUF_INIT;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200356 const char *args[] = { "stash", "apply", NULL, NULL };
357
brian m. carlson52684312017-02-21 23:47:28 +0000358 if (is_null_oid(stash))
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200359 return;
360
brian m. carlsoncb910222018-05-02 00:25:56 +0000361 reset_hard(head, 1);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200362
brian m. carlson52684312017-02-21 23:47:28 +0000363 args[2] = oid_to_hex(stash);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200364
365 /*
366 * It is OK to ignore error here, for example when there was
367 * nothing to restore.
368 */
369 run_command_v_opt(args, RUN_GIT_CMD);
370
371 strbuf_release(&sb);
372 refresh_cache(REFRESH_QUIET);
373}
374
375/* This is called when no merge was necessary. */
376static void finish_up_to_date(const char *msg)
377{
Tuncer Ayaz7f87aff2008-11-15 01:14:24 +0100378 if (verbosity >= 0)
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +0000379 printf("%s%s\n", squash ? _(" (nothing to squash)") : "", msg);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200380 drop_save();
381}
382
Junio C Hamano4c57bd22012-04-16 16:15:13 -0700383static void squash_message(struct commit *commit, struct commit_list *remoteheads)
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200384{
385 struct rev_info rev;
Brandon Caseyf285a2d2008-10-09 14:12:12 -0500386 struct strbuf out = STRBUF_INIT;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200387 struct commit_list *j;
Thomas Rastdd2e7942009-10-19 17:48:08 +0200388 struct pretty_print_context ctx = {0};
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200389
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +0000390 printf(_("Squash commit -- not updating HEAD\n"));
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200391
392 init_revisions(&rev, NULL);
393 rev.ignore_merges = 1;
394 rev.commit_format = CMIT_FMT_MEDIUM;
395
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200396 commit->object.flags |= UNINTERESTING;
397 add_pending_object(&rev, &commit->object, NULL);
398
399 for (j = remoteheads; j; j = j->next)
400 add_pending_object(&rev, &j->item->object, NULL);
401
402 setup_revisions(0, NULL, &rev, NULL);
403 if (prepare_revision_walk(&rev))
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +0000404 die(_("revision walk setup failed"));
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200405
Thomas Rastdd2e7942009-10-19 17:48:08 +0200406 ctx.abbrev = rev.abbrev;
407 ctx.date_mode = rev.date_mode;
Jeff King6bf13942011-05-26 18:27:49 -0400408 ctx.fmt = rev.commit_format;
Thomas Rastdd2e7942009-10-19 17:48:08 +0200409
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200410 strbuf_addstr(&out, "Squashed commit of the following:\n");
411 while ((commit = get_revision(&rev)) != NULL) {
412 strbuf_addch(&out, '\n');
413 strbuf_addf(&out, "commit %s\n",
brian m. carlsonf2fd0762015-11-10 02:22:28 +0000414 oid_to_hex(&commit->object.oid));
Jeff King6bf13942011-05-26 18:27:49 -0400415 pretty_print_commit(&ctx, commit, &out);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200416 }
Stefan Beller102de882018-05-17 15:51:51 -0700417 write_file_buf(git_path_squash_msg(the_repository), out.buf, out.len);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200418 strbuf_release(&out);
419}
420
Nguyễn Thái Ngọc Duy894642f2011-09-17 21:57:44 +1000421static void finish(struct commit *head_commit,
Junio C Hamano4c57bd22012-04-16 16:15:13 -0700422 struct commit_list *remoteheads,
brian m. carlson52684312017-02-21 23:47:28 +0000423 const struct object_id *new_head, const char *msg)
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200424{
Brandon Caseyf285a2d2008-10-09 14:12:12 -0500425 struct strbuf reflog_message = STRBUF_INIT;
brian m. carlson52684312017-02-21 23:47:28 +0000426 const struct object_id *head = &head_commit->object.oid;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200427
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200428 if (!msg)
429 strbuf_addstr(&reflog_message, getenv("GIT_REFLOG_ACTION"));
430 else {
Tuncer Ayaz7f87aff2008-11-15 01:14:24 +0100431 if (verbosity >= 0)
432 printf("%s\n", msg);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200433 strbuf_addf(&reflog_message, "%s: %s",
434 getenv("GIT_REFLOG_ACTION"), msg);
435 }
436 if (squash) {
Junio C Hamano4c57bd22012-04-16 16:15:13 -0700437 squash_message(head_commit, remoteheads);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200438 } else {
Tuncer Ayaz7f87aff2008-11-15 01:14:24 +0100439 if (verbosity >= 0 && !merge_msg.len)
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +0000440 printf(_("No merge message -- not updating HEAD\n"));
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200441 else {
442 const char *argv_gc_auto[] = { "gc", "--auto", NULL };
brian m. carlsonae077772017-10-15 22:06:51 +0000443 update_ref(reflog_message.buf, "HEAD", new_head, head,
444 0, UPDATE_REFS_DIE_ON_ERR);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200445 /*
446 * We ignore errors in 'gc --auto', since the
447 * user should see them.
448 */
Stefan Bellerd0b59862018-03-23 18:21:00 +0100449 close_all_packs(the_repository->objects);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200450 run_command_v_opt(argv_gc_auto, RUN_GIT_CMD);
451 }
452 }
453 if (new_head && show_diffstat) {
454 struct diff_options opts;
455 diff_setup(&opts);
Zbigniew Jędrzejewski-Szmek7a7159a2012-03-01 13:26:42 +0100456 opts.stat_width = -1; /* use full terminal width */
Zbigniew Jędrzejewski-Szmekdf444832012-03-01 13:26:46 +0100457 opts.stat_graph_width = -1; /* respect statGraphWidth config */
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200458 opts.output_format |=
459 DIFF_FORMAT_SUMMARY | DIFF_FORMAT_DIFFSTAT;
460 opts.detect_rename = DIFF_DETECT_RENAME;
Thomas Rast28452652012-08-03 14:16:24 +0200461 diff_setup_done(&opts);
Brandon Williams66f414f2017-05-30 10:31:03 -0700462 diff_tree_oid(head, new_head, "", &opts);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200463 diffcore_std(&opts);
464 diff_flush(&opts);
465 }
466
467 /* Run a post-merge hook */
Benoit Pierre15048f82014-03-18 11:00:53 +0100468 run_hook_le(NULL, "post-merge", squash ? "1" : "0", NULL);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200469
470 strbuf_release(&reflog_message);
471}
472
473/* Get the name for the merge commit's message. */
474static void merge_name(const char *remote, struct strbuf *msg)
475{
Junio C Hamanoae8e4c92011-11-07 13:26:22 -0800476 struct commit *remote_head;
brian m. carlson52684312017-02-21 23:47:28 +0000477 struct object_id branch_head;
Brandon Caseyf285a2d2008-10-09 14:12:12 -0500478 struct strbuf buf = STRBUF_INIT;
Junio C Hamanoc9717ee2009-02-13 23:26:12 -0800479 struct strbuf bname = STRBUF_INIT;
Nguyễn Thái Ngọc Duye2e5ac22018-05-19 07:28:30 +0200480 struct merge_remote_desc *desc;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200481 const char *ptr;
Jeff King751c5972009-08-09 06:02:24 -0400482 char *found_ref;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200483 int len, early;
484
Jeff King0e9f62d2017-03-02 03:23:01 -0500485 strbuf_branchname(&bname, remote, 0);
Junio C Hamanoa552de72009-03-21 13:17:30 -0700486 remote = bname.buf;
Junio C Hamanoc9717ee2009-02-13 23:26:12 -0800487
brian m. carlson52684312017-02-21 23:47:28 +0000488 oidclr(&branch_head);
Junio C Hamanoae8e4c92011-11-07 13:26:22 -0800489 remote_head = get_merge_parent(remote);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200490 if (!remote_head)
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +0000491 die(_("'%s' does not point to a commit"), remote);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200492
brian m. carlsoncca5fa62017-10-15 22:06:57 +0000493 if (dwim_ref(remote, strlen(remote), &branch_head, &found_ref) > 0) {
Christian Couder59556542013-11-30 21:55:40 +0100494 if (starts_with(found_ref, "refs/heads/")) {
Jeff King751c5972009-08-09 06:02:24 -0400495 strbuf_addf(msg, "%s\t\tbranch '%s' of .\n",
brian m. carlson52684312017-02-21 23:47:28 +0000496 oid_to_hex(&branch_head), remote);
Jeff King751c5972009-08-09 06:02:24 -0400497 goto cleanup;
498 }
Christian Couder59556542013-11-30 21:55:40 +0100499 if (starts_with(found_ref, "refs/tags/")) {
Junio C Hamano57b58db2011-11-04 21:31:28 -0700500 strbuf_addf(msg, "%s\t\ttag '%s' of .\n",
brian m. carlson52684312017-02-21 23:47:28 +0000501 oid_to_hex(&branch_head), remote);
Junio C Hamano57b58db2011-11-04 21:31:28 -0700502 goto cleanup;
503 }
Christian Couder59556542013-11-30 21:55:40 +0100504 if (starts_with(found_ref, "refs/remotes/")) {
Matthieu Moy13931232010-11-02 16:31:25 +0100505 strbuf_addf(msg, "%s\t\tremote-tracking branch '%s' of .\n",
brian m. carlson52684312017-02-21 23:47:28 +0000506 oid_to_hex(&branch_head), remote);
Jeff King69a8b7c2009-08-09 06:02:51 -0400507 goto cleanup;
508 }
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200509 }
510
511 /* See if remote matches <name>^^^.. or <name>~<number> */
512 for (len = 0, ptr = remote + strlen(remote);
513 remote < ptr && ptr[-1] == '^';
514 ptr--)
515 len++;
516 if (len)
517 early = 1;
518 else {
519 early = 0;
520 ptr = strrchr(remote, '~');
521 if (ptr) {
522 int seen_nonzero = 0;
523
524 len++; /* count ~ */
525 while (*++ptr && isdigit(*ptr)) {
526 seen_nonzero |= (*ptr != '0');
527 len++;
528 }
529 if (*ptr)
530 len = 0; /* not ...~<number> */
531 else if (seen_nonzero)
532 early = 1;
533 else if (len == 1)
534 early = 1; /* "name~" is "name~1"! */
535 }
536 }
537 if (len) {
538 struct strbuf truname = STRBUF_INIT;
Junio C Hamano10166582015-04-23 14:37:13 -0700539 strbuf_addf(&truname, "refs/heads/%s", remote);
Junio C Hamano9b6bf4d2008-07-30 01:12:19 -0700540 strbuf_setlen(&truname, truname.len - len);
Nguyễn Thái Ngọc Duyc6893322011-11-13 17:22:14 +0700541 if (ref_exists(truname.buf)) {
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200542 strbuf_addf(msg,
543 "%s\t\tbranch '%s'%s of .\n",
brian m. carlsonc368dde2016-06-24 23:09:22 +0000544 oid_to_hex(&remote_head->object.oid),
Junio C Hamano9b6bf4d2008-07-30 01:12:19 -0700545 truname.buf + 11,
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200546 (early ? " (early part)" : ""));
Junio C Hamanoc9717ee2009-02-13 23:26:12 -0800547 strbuf_release(&truname);
548 goto cleanup;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200549 }
Junio C Hamano10166582015-04-23 14:37:13 -0700550 strbuf_release(&truname);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200551 }
Junio C Hamano2d1495f2013-03-19 09:55:34 -0700552
Nguyễn Thái Ngọc Duye2e5ac22018-05-19 07:28:30 +0200553 desc = merge_remote_util(remote_head);
554 if (desc && desc->obj && desc->obj->type == OBJ_TAG) {
555 strbuf_addf(msg, "%s\t\t%s '%s'\n",
556 oid_to_hex(&desc->obj->oid),
557 type_name(desc->obj->type),
558 remote);
559 goto cleanup;
Junio C Hamano2d1495f2013-03-19 09:55:34 -0700560 }
561
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200562 strbuf_addf(msg, "%s\t\tcommit '%s'\n",
brian m. carlsonc368dde2016-06-24 23:09:22 +0000563 oid_to_hex(&remote_head->object.oid), remote);
Junio C Hamanoc9717ee2009-02-13 23:26:12 -0800564cleanup:
565 strbuf_release(&buf);
566 strbuf_release(&bname);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200567}
568
Junio C Hamano0d8fc3e2011-05-04 17:42:51 -0700569static void parse_branch_merge_options(char *bmo)
570{
571 const char **argv;
572 int argc;
573
574 if (!bmo)
575 return;
576 argc = split_cmdline(bmo, &argv);
577 if (argc < 0)
Junio C Hamanoc7fe5b62011-05-11 11:38:36 -0700578 die(_("Bad branch.%s.mergeoptions string: %s"), branch,
579 split_cmdline_strerror(argc));
René Scharfe2756ca42014-09-16 20:56:57 +0200580 REALLOC_ARRAY(argv, argc + 2);
René Scharfef331ab92017-07-15 22:00:45 +0200581 MOVE_ARRAY(argv + 1, argv, argc + 1);
Junio C Hamano0d8fc3e2011-05-04 17:42:51 -0700582 argc++;
583 argv[0] = "branch.*.mergeoptions";
584 parse_options(argc, argv, NULL, builtin_merge_options,
585 builtin_merge_usage, 0);
586 free(argv);
587}
588
Stephan Beyer186458b2008-07-24 01:09:35 +0200589static int git_merge_config(const char *k, const char *v, void *cb)
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200590{
Junio C Hamano898eacd2011-10-06 23:12:09 -0700591 int status;
592
Christian Couder59556542013-11-30 21:55:40 +0100593 if (branch && starts_with(k, "branch.") &&
594 starts_with(k + 7, branch) &&
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200595 !strcmp(k + 7 + strlen(branch), ".mergeoptions")) {
Junio C Hamano0d8fc3e2011-05-04 17:42:51 -0700596 free(branch_mergeoptions);
597 branch_mergeoptions = xstrdup(v);
598 return 0;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200599 }
600
601 if (!strcmp(k, "merge.diffstat") || !strcmp(k, "merge.stat"))
602 show_diffstat = git_config_bool(k, v);
Hans Jerry Illikainenca779e82017-12-10 06:53:57 +0000603 else if (!strcmp(k, "merge.verifysignatures"))
604 verify_signatures = git_config_bool(k, v);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200605 else if (!strcmp(k, "pull.twohead"))
606 return git_config_string(&pull_twohead, k, v);
607 else if (!strcmp(k, "pull.octopus"))
608 return git_config_string(&pull_octopus, k, v);
Jonathan Nieder7610fa52010-08-05 06:32:41 -0500609 else if (!strcmp(k, "merge.renormalize"))
610 option_renormalize = git_config_bool(k, v);
Junio C Hamano898eacd2011-10-06 23:12:09 -0700611 else if (!strcmp(k, "merge.ff")) {
Martin Ågren89576612017-08-07 20:20:49 +0200612 int boolval = git_parse_maybe_bool(v);
Junio C Hamanof23e8de2011-05-06 12:27:05 -0700613 if (0 <= boolval) {
Miklos Vajnaa54841e2013-07-02 16:47:57 +0200614 fast_forward = boolval ? FF_ALLOW : FF_NO;
Junio C Hamanof23e8de2011-05-06 12:27:05 -0700615 } else if (v && !strcmp(v, "only")) {
Miklos Vajnaa54841e2013-07-02 16:47:57 +0200616 fast_forward = FF_ONLY;
Junio C Hamanof23e8de2011-05-06 12:27:05 -0700617 } /* do not barf on values from future versions of git */
618 return 0;
Junio C Hamano93e535a2011-03-23 23:48:24 -0700619 } else if (!strcmp(k, "merge.defaulttoupstream")) {
620 default_to_upstream = git_config_bool(k, v);
621 return 0;
Nicolas Vigierd95bfb12013-11-05 00:14:41 +0100622 } else if (!strcmp(k, "commit.gpgsign")) {
623 sign_commit = git_config_bool(k, v) ? "" : NULL;
624 return 0;
Ramkumar Ramachandra96e94202010-09-08 23:29:54 +0530625 }
Junio C Hamanoba3c69a2011-10-05 17:23:20 -0700626
Junio C Hamano898eacd2011-10-06 23:12:09 -0700627 status = fmt_merge_msg_config(k, v, cb);
628 if (status)
629 return status;
Junio C Hamanoba3c69a2011-10-05 17:23:20 -0700630 status = git_gpg_config(k, v, NULL);
631 if (status)
632 return status;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200633 return git_diff_ui_config(k, v, cb);
634}
635
brian m. carlson52684312017-02-21 23:47:28 +0000636static int read_tree_trivial(struct object_id *common, struct object_id *head,
637 struct object_id *one)
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200638{
639 int i, nr_trees = 0;
640 struct tree *trees[MAX_UNPACK_TREES];
641 struct tree_desc t[MAX_UNPACK_TREES];
642 struct unpack_trees_options opts;
643
644 memset(&opts, 0, sizeof(opts));
645 opts.head_idx = 2;
646 opts.src_index = &the_index;
647 opts.dst_index = &the_index;
648 opts.update = 1;
649 opts.verbose_update = 1;
650 opts.trivial_merges_only = 1;
651 opts.merge = 1;
brian m. carlsona9dbc172017-05-06 22:10:37 +0000652 trees[nr_trees] = parse_tree_indirect(common);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200653 if (!trees[nr_trees++])
654 return -1;
brian m. carlsona9dbc172017-05-06 22:10:37 +0000655 trees[nr_trees] = parse_tree_indirect(head);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200656 if (!trees[nr_trees++])
657 return -1;
brian m. carlsona9dbc172017-05-06 22:10:37 +0000658 trees[nr_trees] = parse_tree_indirect(one);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200659 if (!trees[nr_trees++])
660 return -1;
661 opts.fn = threeway_merge;
662 cache_tree_free(&active_cache_tree);
663 for (i = 0; i < nr_trees; i++) {
664 parse_tree(trees[i]);
665 init_tree_desc(t+i, trees[i]->buffer, trees[i]->size);
666 }
667 if (unpack_trees(nr_trees, t, &opts))
668 return -1;
669 return 0;
670}
671
brian m. carlson52684312017-02-21 23:47:28 +0000672static void write_tree_trivial(struct object_id *oid)
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200673{
brian m. carlsonfc5cb992018-03-12 02:27:23 +0000674 if (write_cache_as_tree(oid, 0, NULL))
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +0000675 die(_("git write-tree failed to write a tree"));
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200676}
677
Christian Couder3f9083c2010-03-31 21:22:06 +0200678static int try_merge_strategy(const char *strategy, struct commit_list *common,
Junio C Hamano4c57bd22012-04-16 16:15:13 -0700679 struct commit_list *remoteheads,
Junio C Hamanob4391652015-03-25 22:00:48 -0700680 struct commit *head)
Christian Couder3f9083c2010-03-31 21:22:06 +0200681{
Martin Ågrenb2275862018-05-09 22:55:38 +0200682 struct lock_file lock = LOCK_INIT;
Junio C Hamanob4391652015-03-25 22:00:48 -0700683 const char *head_arg = "HEAD";
Miklos Vajna668f26f2008-10-03 15:02:31 +0200684
Junio C Hamanob3e83cc2016-12-07 10:33:54 -0800685 hold_locked_index(&lock, LOCK_DIE_ON_ERROR);
Miklos Vajna668f26f2008-10-03 15:02:31 +0200686 refresh_cache(REFRESH_QUIET);
Martin Ågren61000812018-03-01 21:40:20 +0100687 if (write_locked_index(&the_index, &lock,
688 COMMIT_LOCK | SKIP_IF_UNCHANGED))
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +0000689 return error(_("Unable to write index."));
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200690
Miklos Vajna18668f52008-08-28 15:43:00 +0200691 if (!strcmp(strategy, "recursive") || !strcmp(strategy, "subtree")) {
Christian Couder3f9083c2010-03-31 21:22:06 +0200692 int clean, x;
Miklos Vajna18668f52008-08-28 15:43:00 +0200693 struct commit *result;
Miklos Vajna18668f52008-08-28 15:43:00 +0200694 struct commit_list *reversed = NULL;
695 struct merge_options o;
Christian Couder3f9083c2010-03-31 21:22:06 +0200696 struct commit_list *j;
Miklos Vajna18668f52008-08-28 15:43:00 +0200697
698 if (remoteheads->next) {
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +0000699 error(_("Not handling anything other than two heads merge."));
Miklos Vajna18668f52008-08-28 15:43:00 +0200700 return 2;
701 }
702
703 init_merge_options(&o);
704 if (!strcmp(strategy, "subtree"))
Junio C Hamano85e51b72008-06-30 22:18:57 -0700705 o.subtree_shift = "";
Avery Pennarun8cc5b292009-11-25 21:23:55 -0500706
Jonathan Nieder7610fa52010-08-05 06:32:41 -0500707 o.renormalize = option_renormalize;
Jeff King99bfc662011-02-20 04:53:21 -0500708 o.show_rename_progress =
709 show_progress == -1 ? isatty(2) : show_progress;
Jonathan Nieder7610fa52010-08-05 06:32:41 -0500710
Jonathan Nieder635a7bb2010-08-26 00:47:58 -0500711 for (x = 0; x < xopts_nr; x++)
712 if (parse_merge_opt(&o, xopts[x]))
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +0000713 die(_("Unknown option for merge-recursive: -X%s"), xopts[x]);
Miklos Vajna18668f52008-08-28 15:43:00 +0200714
715 o.branch1 = head_arg;
Junio C Hamanoae8e4c92011-11-07 13:26:22 -0800716 o.branch2 = merge_remote_util(remoteheads->item)->name;
Miklos Vajna18668f52008-08-28 15:43:00 +0200717
718 for (j = common; j; j = j->next)
719 commit_list_insert(j->item, &reversed);
720
Junio C Hamanob3e83cc2016-12-07 10:33:54 -0800721 hold_locked_index(&lock, LOCK_DIE_ON_ERROR);
Nguyễn Thái Ngọc Duy894642f2011-09-17 21:57:44 +1000722 clean = merge_recursive(&o, head,
Miklos Vajna18668f52008-08-28 15:43:00 +0200723 remoteheads->item, reversed, &result);
Johannes Schindelinf241ff02016-07-26 18:06:02 +0200724 if (clean < 0)
725 exit(128);
Martin Ågren61000812018-03-01 21:40:20 +0100726 if (write_locked_index(&the_index, &lock,
727 COMMIT_LOCK | SKIP_IF_UNCHANGED))
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +0000728 die (_("unable to write %s"), get_index_file());
Miklos Vajna18668f52008-08-28 15:43:00 +0200729 return clean ? 0 : 1;
730 } else {
Jonathan Nieder67ac1e12010-12-10 18:51:44 -0600731 return try_merge_command(strategy, xopts_nr, xopts,
732 common, head_arg, remoteheads);
Miklos Vajna18668f52008-08-28 15:43:00 +0200733 }
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200734}
735
736static void count_diff_files(struct diff_queue_struct *q,
737 struct diff_options *opt, void *data)
738{
739 int *count = data;
740
741 (*count) += q->nr;
742}
743
744static int count_unmerged_entries(void)
745{
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200746 int i, ret = 0;
747
Junio C Hamanobe6ff812009-12-17 22:23:54 -0800748 for (i = 0; i < active_nr; i++)
749 if (ce_stage(active_cache[i]))
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200750 ret++;
751
752 return ret;
753}
754
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200755static void add_strategies(const char *string, unsigned attr)
756{
René Scharfe02a8cfa2016-08-05 23:01:35 +0200757 int i;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200758
René Scharfe02a8cfa2016-08-05 23:01:35 +0200759 if (string) {
760 struct string_list list = STRING_LIST_INIT_DUP;
761 struct string_list_item *item;
762 string_list_split(&list, string, ' ', -1);
763 for_each_string_list_item(item, &list)
764 append_strategy(get_strategy(item->string));
765 string_list_clear(&list, 0);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200766 return;
767 }
768 for (i = 0; i < ARRAY_SIZE(all_strategy); i++)
769 if (all_strategy[i].attr & attr)
770 append_strategy(&all_strategy[i]);
771
772}
773
Jay Soffian66f4b982011-10-08 14:39:52 -0400774static void read_merge_msg(struct strbuf *msg)
Jay Soffian65969d42011-02-14 20:07:50 -0500775{
Stefan Beller102de882018-05-17 15:51:51 -0700776 const char *filename = git_path_merge_msg(the_repository);
Jay Soffian66f4b982011-10-08 14:39:52 -0400777 strbuf_reset(msg);
Jonathan Nieder418c9b12011-11-16 02:03:36 -0600778 if (strbuf_read_file(msg, filename, 0) < 0)
779 die_errno(_("Could not read from '%s'"), filename);
Jay Soffian65969d42011-02-14 20:07:50 -0500780}
781
Junio C Hamano4c57bd22012-04-16 16:15:13 -0700782static void write_merge_state(struct commit_list *);
783static void abort_commit(struct commit_list *remoteheads, const char *err_msg)
Jay Soffian65969d42011-02-14 20:07:50 -0500784{
Jay Soffian66f4b982011-10-08 14:39:52 -0400785 if (err_msg)
786 error("%s", err_msg);
787 fprintf(stderr,
788 _("Not committing merge; use 'git commit' to complete the merge.\n"));
Junio C Hamano4c57bd22012-04-16 16:15:13 -0700789 write_merge_state(remoteheads);
Jay Soffian66f4b982011-10-08 14:39:52 -0400790 exit(1);
791}
792
Thomas Rastf26af3f2012-01-30 21:25:30 +0100793static const char merge_editor_comment[] =
794N_("Please enter a commit message to explain why this merge is necessary,\n"
795 "especially if it merges an updated upstream into a topic branch.\n"
796 "\n"
Junio C Hamanoeff80a92013-01-16 20:18:48 +0100797 "Lines starting with '%c' will be ignored, and an empty message aborts\n"
Thomas Rastf26af3f2012-01-30 21:25:30 +0100798 "the commit.\n");
799
Michael J Gruber9d89b352017-08-23 14:10:45 +0200800static void write_merge_heads(struct commit_list *);
Junio C Hamano4c57bd22012-04-16 16:15:13 -0700801static void prepare_to_commit(struct commit_list *remoteheads)
Jay Soffian66f4b982011-10-08 14:39:52 -0400802{
803 struct strbuf msg = STRBUF_INIT;
804 strbuf_addbuf(&msg, &merge_msg);
805 strbuf_addch(&msg, '\n');
Michael J Gruber62dc42b2017-08-23 14:10:43 +0200806 if (squash)
807 BUG("the control must not reach here under --squash");
Thomas Rastf26af3f2012-01-30 21:25:30 +0100808 if (0 < option_edit)
Junio C Hamanoeff80a92013-01-16 20:18:48 +0100809 strbuf_commented_addf(&msg, _(merge_editor_comment), comment_line_char);
Łukasz Gryglicki14d01b42017-07-04 09:33:06 +0000810 if (signoff)
811 append_signoff(&msg, ignore_non_trailer(msg.buf, msg.len), 0);
Michael J Gruber9d89b352017-08-23 14:10:45 +0200812 write_merge_heads(remoteheads);
Stefan Beller102de882018-05-17 15:51:51 -0700813 write_file_buf(git_path_merge_msg(the_repository), msg.buf, msg.len);
Benoit Pierre0a3beb02014-03-18 11:00:54 +0100814 if (run_commit_hook(0 < option_edit, get_index_file(), "prepare-commit-msg",
Stefan Beller102de882018-05-17 15:51:51 -0700815 git_path_merge_msg(the_repository), "merge", NULL))
Antoine Pelisse3e4141d2013-01-02 19:42:50 +0100816 abort_commit(remoteheads, NULL);
Junio C Hamanof8246282012-01-10 22:44:45 -0800817 if (0 < option_edit) {
Stefan Beller102de882018-05-17 15:51:51 -0700818 if (launch_editor(git_path_merge_msg(the_repository), NULL, NULL))
Junio C Hamano4c57bd22012-04-16 16:15:13 -0700819 abort_commit(remoteheads, NULL);
Jay Soffian66f4b982011-10-08 14:39:52 -0400820 }
Stefan Bellerf8b86352017-09-07 15:04:29 -0700821
822 if (verify_msg && run_commit_hook(0 < option_edit, get_index_file(),
823 "commit-msg",
Stefan Beller102de882018-05-17 15:51:51 -0700824 git_path_merge_msg(the_repository), NULL))
Stefan Bellerf8b86352017-09-07 15:04:29 -0700825 abort_commit(remoteheads, NULL);
826
Jay Soffian66f4b982011-10-08 14:39:52 -0400827 read_merge_msg(&msg);
Tobias Klauser63af4a82015-10-16 17:16:42 +0200828 strbuf_stripspace(&msg, 0 < option_edit);
Jay Soffian66f4b982011-10-08 14:39:52 -0400829 if (!msg.len)
Junio C Hamano4c57bd22012-04-16 16:15:13 -0700830 abort_commit(remoteheads, _("Empty commit message."));
Jay Soffian66f4b982011-10-08 14:39:52 -0400831 strbuf_release(&merge_msg);
832 strbuf_addbuf(&merge_msg, &msg);
833 strbuf_release(&msg);
Jay Soffian65969d42011-02-14 20:07:50 -0500834}
835
Junio C Hamano4c57bd22012-04-16 16:15:13 -0700836static int merge_trivial(struct commit *head, struct commit_list *remoteheads)
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200837{
brian m. carlson52684312017-02-21 23:47:28 +0000838 struct object_id result_tree, result_commit;
René Scharfe910a09a2014-07-10 11:41:40 +0200839 struct commit_list *parents, **pptr = &parents;
Martin Ågrenb2275862018-05-09 22:55:38 +0200840 struct lock_file lock = LOCK_INIT;
Elijah Newren40d71942016-04-09 23:13:40 -0700841
Junio C Hamanob3e83cc2016-12-07 10:33:54 -0800842 hold_locked_index(&lock, LOCK_DIE_ON_ERROR);
Elijah Newren40d71942016-04-09 23:13:40 -0700843 refresh_cache(REFRESH_QUIET);
Martin Ågren61000812018-03-01 21:40:20 +0100844 if (write_locked_index(&the_index, &lock,
845 COMMIT_LOCK | SKIP_IF_UNCHANGED))
Elijah Newren40d71942016-04-09 23:13:40 -0700846 return error(_("Unable to write index."));
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200847
brian m. carlson52684312017-02-21 23:47:28 +0000848 write_tree_trivial(&result_tree);
Ævar Arnfjörð Bjarmason157efde2011-02-22 23:42:02 +0000849 printf(_("Wonderful.\n"));
René Scharfe910a09a2014-07-10 11:41:40 +0200850 pptr = commit_list_append(head, pptr);
851 pptr = commit_list_append(remoteheads->item, pptr);
Junio C Hamano4c57bd22012-04-16 16:15:13 -0700852 prepare_to_commit(remoteheads);
Patryk Obara5078f342018-01-28 01:13:16 +0100853 if (commit_tree(merge_msg.buf, merge_msg.len, &result_tree, parents,
854 &result_commit, NULL, sign_commit))
Nguyễn Thái Ngọc Duy6b3c4c02011-12-15 20:47:21 +0700855 die(_("failed to write commit object"));
brian m. carlson52684312017-02-21 23:47:28 +0000856 finish(head, remoteheads, &result_commit, "In-index merge");
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200857 drop_save();
858 return 0;
859}
860
Nguyễn Thái Ngọc Duy894642f2011-09-17 21:57:44 +1000861static int finish_automerge(struct commit *head,
Junio C Hamanoe78cbf82012-04-17 12:22:26 -0700862 int head_subsumed,
Nguyễn Thái Ngọc Duy894642f2011-09-17 21:57:44 +1000863 struct commit_list *common,
Junio C Hamano4c57bd22012-04-16 16:15:13 -0700864 struct commit_list *remoteheads,
brian m. carlson52684312017-02-21 23:47:28 +0000865 struct object_id *result_tree,
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200866 const char *wt_strategy)
867{
Junio C Hamanoe78cbf82012-04-17 12:22:26 -0700868 struct commit_list *parents = NULL;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200869 struct strbuf buf = STRBUF_INIT;
brian m. carlson52684312017-02-21 23:47:28 +0000870 struct object_id result_commit;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200871
872 free_commit_list(common);
Junio C Hamanoe78cbf82012-04-17 12:22:26 -0700873 parents = remoteheads;
Miklos Vajnaa54841e2013-07-02 16:47:57 +0200874 if (!head_subsumed || fast_forward == FF_NO)
Nguyễn Thái Ngọc Duy894642f2011-09-17 21:57:44 +1000875 commit_list_insert(head, &parents);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200876 strbuf_addch(&merge_msg, '\n');
Junio C Hamano4c57bd22012-04-16 16:15:13 -0700877 prepare_to_commit(remoteheads);
Patryk Obara5078f342018-01-28 01:13:16 +0100878 if (commit_tree(merge_msg.buf, merge_msg.len, result_tree, parents,
879 &result_commit, NULL, sign_commit))
Nguyễn Thái Ngọc Duy6b3c4c02011-12-15 20:47:21 +0700880 die(_("failed to write commit object"));
Junio C Hamanof23101b2011-05-25 12:43:59 -0700881 strbuf_addf(&buf, "Merge made by the '%s' strategy.", wt_strategy);
brian m. carlson52684312017-02-21 23:47:28 +0000882 finish(head, remoteheads, &result_commit, buf.buf);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200883 strbuf_release(&buf);
884 drop_save();
885 return 0;
886}
887
Junio C Hamano08e3ce52014-10-24 11:27:22 -0700888static int suggest_conflicts(void)
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200889{
Jonathan Nieder418c9b12011-11-16 02:03:36 -0600890 const char *filename;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200891 FILE *fp;
Junio C Hamano75c961b2014-10-24 11:34:59 -0700892 struct strbuf msgbuf = STRBUF_INIT;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200893
Stefan Beller102de882018-05-17 15:51:51 -0700894 filename = git_path_merge_msg(the_repository);
Nguyễn Thái Ngọc Duy23a9e072017-05-03 17:16:46 +0700895 fp = xfopen(filename, "a");
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200896
Junio C Hamano75c961b2014-10-24 11:34:59 -0700897 append_conflicts_hint(&msgbuf);
898 fputs(msgbuf.buf, fp);
René Scharfe8d025b72014-12-24 01:18:38 +0100899 strbuf_release(&msgbuf);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200900 fclose(fp);
Junio C Hamanocb6020b2009-12-04 00:20:48 -0800901 rerere(allow_rerere_auto);
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +0000902 printf(_("Automatic merge failed; "
903 "fix conflicts and then commit the result.\n"));
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200904 return 1;
905}
906
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200907static int evaluate_result(void)
908{
909 int cnt = 0;
910 struct rev_info rev;
911
Miklos Vajna1c7b76b2008-07-07 19:24:20 +0200912 /* Check how many files differ. */
913 init_revisions(&rev, "");
914 setup_revisions(0, NULL, &rev, NULL);
915 rev.diffopt.output_format |=
916 DIFF_FORMAT_CALLBACK;
917 rev.diffopt.format_callback = count_diff_files;
918 rev.diffopt.format_callback_data = &cnt;
919 run_diff_files(&rev, 0);
920
921 /*
922 * Check how many unmerged entries are
923 * there.
924 */
925 cnt += count_unmerged_entries();
926
927 return cnt;
928}
929
Junio C Hamano93e535a2011-03-23 23:48:24 -0700930/*
Michael Schubertd6ac1d22013-07-03 11:12:34 +0200931 * Pretend as if the user told us to merge with the remote-tracking
Junio C Hamano93e535a2011-03-23 23:48:24 -0700932 * branch we have for the upstream of the current branch
933 */
934static int setup_with_upstream(const char ***argv)
935{
936 struct branch *branch = branch_get(NULL);
937 int i;
938 const char **args;
939
940 if (!branch)
Ævar Arnfjörð Bjarmasonc7f426d2011-04-10 19:34:04 +0000941 die(_("No current branch."));
Jeff King9e3751d2015-05-21 00:45:13 -0400942 if (!branch->remote_name)
Ævar Arnfjörð Bjarmasonc7f426d2011-04-10 19:34:04 +0000943 die(_("No remote for the current branch."));
Junio C Hamano93e535a2011-03-23 23:48:24 -0700944 if (!branch->merge_nr)
Ævar Arnfjörð Bjarmasonc7f426d2011-04-10 19:34:04 +0000945 die(_("No default upstream defined for the current branch."));
Junio C Hamano93e535a2011-03-23 23:48:24 -0700946
Jeff King50a6c8e2016-02-22 17:44:35 -0500947 args = xcalloc(st_add(branch->merge_nr, 1), sizeof(char *));
Junio C Hamano93e535a2011-03-23 23:48:24 -0700948 for (i = 0; i < branch->merge_nr; i++) {
949 if (!branch->merge[i]->dst)
Michael Schubertd6ac1d22013-07-03 11:12:34 +0200950 die(_("No remote-tracking branch for %s from %s"),
Junio C Hamano93e535a2011-03-23 23:48:24 -0700951 branch->merge[i]->src, branch->remote_name);
952 args[i] = branch->merge[i]->dst;
953 }
954 args[i] = NULL;
955 *argv = args;
956 return i;
957}
958
Michael J Gruber8e6a6bb2017-08-23 14:10:44 +0200959static void write_merge_heads(struct commit_list *remoteheads)
Jay Soffian66f4b982011-10-08 14:39:52 -0400960{
Jay Soffian66f4b982011-10-08 14:39:52 -0400961 struct commit_list *j;
962 struct strbuf buf = STRBUF_INIT;
963
Junio C Hamano274a5c02011-11-07 14:45:10 -0800964 for (j = remoteheads; j; j = j->next) {
brian m. carlsonf2fd0762015-11-10 02:22:28 +0000965 struct object_id *oid;
Junio C Hamano274a5c02011-11-07 14:45:10 -0800966 struct commit *c = j->item;
Nguyễn Thái Ngọc Duye2e5ac22018-05-19 07:28:30 +0200967 struct merge_remote_desc *desc;
968
969 desc = merge_remote_util(c);
970 if (desc && desc->obj) {
971 oid = &desc->obj->oid;
Junio C Hamano274a5c02011-11-07 14:45:10 -0800972 } else {
brian m. carlsonf2fd0762015-11-10 02:22:28 +0000973 oid = &c->object.oid;
Junio C Hamano274a5c02011-11-07 14:45:10 -0800974 }
brian m. carlsonf2fd0762015-11-10 02:22:28 +0000975 strbuf_addf(&buf, "%s\n", oid_to_hex(oid));
Junio C Hamano274a5c02011-11-07 14:45:10 -0800976 }
Stefan Beller102de882018-05-17 15:51:51 -0700977 write_file_buf(git_path_merge_head(the_repository), buf.buf, buf.len);
Jonathan Nieder418c9b12011-11-16 02:03:36 -0600978
Jay Soffian66f4b982011-10-08 14:39:52 -0400979 strbuf_reset(&buf);
Miklos Vajnaa54841e2013-07-02 16:47:57 +0200980 if (fast_forward == FF_NO)
René Scharfea22ae752016-09-15 20:31:00 +0200981 strbuf_addstr(&buf, "no-ff");
Stefan Beller102de882018-05-17 15:51:51 -0700982 write_file_buf(git_path_merge_mode(the_repository), buf.buf, buf.len);
Rene Scharfe814c4b32017-08-30 19:49:50 +0200983 strbuf_release(&buf);
Jay Soffian66f4b982011-10-08 14:39:52 -0400984}
985
Michael J Gruber8e6a6bb2017-08-23 14:10:44 +0200986static void write_merge_state(struct commit_list *remoteheads)
987{
988 write_merge_heads(remoteheads);
989 strbuf_addch(&merge_msg, '\n');
Stefan Beller102de882018-05-17 15:51:51 -0700990 write_file_buf(git_path_merge_msg(the_repository), merge_msg.buf,
991 merge_msg.len);
Michael J Gruber8e6a6bb2017-08-23 14:10:44 +0200992}
993
Junio C Hamanof8246282012-01-10 22:44:45 -0800994static int default_edit_option(void)
995{
996 static const char name[] = "GIT_MERGE_AUTOEDIT";
997 const char *e = getenv(name);
998 struct stat st_stdin, st_stdout;
999
1000 if (have_message)
1001 /* an explicit -m msg without --[no-]edit */
1002 return 0;
1003
1004 if (e) {
Martin Ågren89576612017-08-07 20:20:49 +02001005 int v = git_parse_maybe_bool(e);
Junio C Hamanof8246282012-01-10 22:44:45 -08001006 if (v < 0)
Vasco Almeidabef48302016-06-17 20:21:17 +00001007 die(_("Bad value '%s' in environment '%s'"), e, name);
Junio C Hamanof8246282012-01-10 22:44:45 -08001008 return v;
1009 }
1010
1011 /* Use editor if stdin and stdout are the same and is a tty */
1012 return (!fstat(0, &st_stdin) &&
1013 !fstat(1, &st_stdout) &&
Junio C Hamanod46f4762012-02-23 11:24:44 -08001014 isatty(0) && isatty(1) &&
Junio C Hamanof8246282012-01-10 22:44:45 -08001015 st_stdin.st_dev == st_stdout.st_dev &&
1016 st_stdin.st_ino == st_stdout.st_ino &&
1017 st_stdin.st_mode == st_stdout.st_mode);
1018}
1019
Junio C Hamano34349db2015-04-25 12:00:14 -07001020static struct commit_list *reduce_parents(struct commit *head_commit,
1021 int *head_subsumed,
1022 struct commit_list *remoteheads)
Junio C Hamanob5d887f2012-04-17 11:31:10 -07001023{
René Scharfee510ab82015-10-24 18:21:31 +02001024 struct commit_list *parents, **remotes;
Junio C Hamanob5d887f2012-04-17 11:31:10 -07001025
Junio C Hamano0b10b8a2015-04-25 10:25:43 -07001026 /*
1027 * Is the current HEAD reachable from another commit being
1028 * merged? If so we do not want to record it as a parent of
1029 * the resulting merge, unless --no-ff is given. We will flip
1030 * this variable to 0 when we find HEAD among the independent
1031 * tips being merged.
1032 */
1033 *head_subsumed = 1;
Junio C Hamanoe78cbf82012-04-17 12:22:26 -07001034
Junio C Hamano0b10b8a2015-04-25 10:25:43 -07001035 /* Find what parents to record by checking independent ones. */
Junio C Hamanoe78cbf82012-04-17 12:22:26 -07001036 parents = reduce_heads(remoteheads);
Martin Ågren4da72642017-11-07 21:39:45 +01001037 free_commit_list(remoteheads);
Junio C Hamanoe78cbf82012-04-17 12:22:26 -07001038
René Scharfee510ab82015-10-24 18:21:31 +02001039 remoteheads = NULL;
1040 remotes = &remoteheads;
1041 while (parents) {
1042 struct commit *commit = pop_commit(&parents);
Junio C Hamanoe78cbf82012-04-17 12:22:26 -07001043 if (commit == head_commit)
1044 *head_subsumed = 0;
1045 else
1046 remotes = &commit_list_insert(commit, remotes)->next;
1047 }
Junio C Hamanob5d887f2012-04-17 11:31:10 -07001048 return remoteheads;
1049}
Junio C Hamanof8246282012-01-10 22:44:45 -08001050
Junio C Hamano52fecab2015-04-25 18:29:44 -07001051static void prepare_merge_message(struct strbuf *merge_names, struct strbuf *merge_msg)
1052{
1053 struct fmt_merge_msg_opts opts;
1054
1055 memset(&opts, 0, sizeof(opts));
1056 opts.add_title = !have_message;
1057 opts.shortlog_len = shortlog_len;
1058 opts.credit_people = (0 < option_edit);
1059
1060 fmt_merge_msg(merge_names, merge_msg, &opts);
1061 if (merge_msg->len)
1062 strbuf_setlen(merge_msg, merge_msg->len - 1);
1063}
1064
Junio C Hamano74e8bc52015-04-25 18:47:21 -07001065static void handle_fetch_head(struct commit_list **remotes, struct strbuf *merge_names)
1066{
1067 const char *filename;
1068 int fd, pos, npos;
1069 struct strbuf fetch_head_file = STRBUF_INIT;
brian m. carlsonab47df22018-07-16 01:28:03 +00001070 const unsigned hexsz = the_hash_algo->hexsz;
Junio C Hamano74e8bc52015-04-25 18:47:21 -07001071
1072 if (!merge_names)
1073 merge_names = &fetch_head_file;
1074
Stefan Beller102de882018-05-17 15:51:51 -07001075 filename = git_path_fetch_head(the_repository);
Junio C Hamano74e8bc52015-04-25 18:47:21 -07001076 fd = open(filename, O_RDONLY);
1077 if (fd < 0)
1078 die_errno(_("could not open '%s' for reading"), filename);
1079
1080 if (strbuf_read(merge_names, fd, 0) < 0)
1081 die_errno(_("could not read '%s'"), filename);
1082 if (close(fd) < 0)
1083 die_errno(_("could not close '%s'"), filename);
1084
1085 for (pos = 0; pos < merge_names->len; pos = npos) {
brian m. carlson52684312017-02-21 23:47:28 +00001086 struct object_id oid;
Junio C Hamano74e8bc52015-04-25 18:47:21 -07001087 char *ptr;
1088 struct commit *commit;
1089
1090 ptr = strchr(merge_names->buf + pos, '\n');
1091 if (ptr)
1092 npos = ptr - merge_names->buf + 1;
1093 else
1094 npos = merge_names->len;
1095
brian m. carlsonab47df22018-07-16 01:28:03 +00001096 if (npos - pos < hexsz + 2 ||
brian m. carlson52684312017-02-21 23:47:28 +00001097 get_oid_hex(merge_names->buf + pos, &oid))
Junio C Hamano74e8bc52015-04-25 18:47:21 -07001098 commit = NULL; /* bad */
brian m. carlsonab47df22018-07-16 01:28:03 +00001099 else if (memcmp(merge_names->buf + pos + hexsz, "\t\t", 2))
Junio C Hamano74e8bc52015-04-25 18:47:21 -07001100 continue; /* not-for-merge */
1101 else {
brian m. carlsonab47df22018-07-16 01:28:03 +00001102 char saved = merge_names->buf[pos + hexsz];
1103 merge_names->buf[pos + hexsz] = '\0';
Junio C Hamano74e8bc52015-04-25 18:47:21 -07001104 commit = get_merge_parent(merge_names->buf + pos);
brian m. carlsonab47df22018-07-16 01:28:03 +00001105 merge_names->buf[pos + hexsz] = saved;
Junio C Hamano74e8bc52015-04-25 18:47:21 -07001106 }
1107 if (!commit) {
1108 if (ptr)
1109 *ptr = '\0';
Vasco Almeidabef48302016-06-17 20:21:17 +00001110 die(_("not something we can merge in %s: %s"),
Junio C Hamano74e8bc52015-04-25 18:47:21 -07001111 filename, merge_names->buf + pos);
1112 }
1113 remotes = &commit_list_insert(commit, remotes)->next;
1114 }
1115
1116 if (merge_names == &fetch_head_file)
1117 strbuf_release(&fetch_head_file);
1118}
1119
Junio C Hamano34349db2015-04-25 12:00:14 -07001120static struct commit_list *collect_parents(struct commit *head_commit,
1121 int *head_subsumed,
Junio C Hamano1cf32f42015-04-25 18:34:22 -07001122 int argc, const char **argv,
1123 struct strbuf *merge_msg)
Junio C Hamano34349db2015-04-25 12:00:14 -07001124{
1125 int i;
1126 struct commit_list *remoteheads = NULL;
1127 struct commit_list **remotes = &remoteheads;
Junio C Hamano77038012015-04-25 18:39:43 -07001128 struct strbuf merge_names = STRBUF_INIT, *autogen = NULL;
1129
1130 if (merge_msg && (!have_message || shortlog_len))
1131 autogen = &merge_names;
Junio C Hamano34349db2015-04-25 12:00:14 -07001132
1133 if (head_commit)
1134 remotes = &commit_list_insert(head_commit, remotes)->next;
Junio C Hamano74e8bc52015-04-25 18:47:21 -07001135
1136 if (argc == 1 && !strcmp(argv[0], "FETCH_HEAD")) {
1137 handle_fetch_head(remotes, autogen);
1138 remoteheads = reduce_parents(head_commit, head_subsumed, remoteheads);
1139 } else {
1140 for (i = 0; i < argc; i++) {
1141 struct commit *commit = get_merge_parent(argv[i]);
1142 if (!commit)
1143 help_unknown_ref(argv[i], "merge",
Vasco Almeidabef48302016-06-17 20:21:17 +00001144 _("not something we can merge"));
Junio C Hamano74e8bc52015-04-25 18:47:21 -07001145 remotes = &commit_list_insert(commit, remotes)->next;
1146 }
1147 remoteheads = reduce_parents(head_commit, head_subsumed, remoteheads);
1148 if (autogen) {
1149 struct commit_list *p;
1150 for (p = remoteheads; p; p = p->next)
1151 merge_name(merge_remote_util(p->item)->name, autogen);
1152 }
Junio C Hamano34349db2015-04-25 12:00:14 -07001153 }
1154
Junio C Hamano77038012015-04-25 18:39:43 -07001155 if (autogen) {
Junio C Hamano77038012015-04-25 18:39:43 -07001156 prepare_merge_message(autogen, merge_msg);
1157 strbuf_release(autogen);
Junio C Hamano1cf32f42015-04-25 18:34:22 -07001158 }
1159
1160 return remoteheads;
Junio C Hamano34349db2015-04-25 12:00:14 -07001161}
1162
Junio C Hamanoadcc94a2018-02-14 10:18:55 -08001163static int merging_a_throwaway_tag(struct commit *commit)
1164{
1165 char *tag_ref;
1166 struct object_id oid;
1167 int is_throwaway_tag = 0;
1168
1169 /* Are we merging a tag? */
1170 if (!merge_remote_util(commit) ||
1171 !merge_remote_util(commit)->obj ||
1172 merge_remote_util(commit)->obj->type != OBJ_TAG)
1173 return is_throwaway_tag;
1174
1175 /*
1176 * Now we know we are merging a tag object. Are we downstream
1177 * and following the tags from upstream? If so, we must have
1178 * the tag object pointed at by "refs/tags/$T" where $T is the
1179 * tagname recorded in the tag object. We want to allow such
1180 * a "just to catch up" merge to fast-forward.
1181 *
1182 * Otherwise, we are playing an integrator's role, making a
1183 * merge with a throw-away tag from a contributor with
1184 * something like "git pull $contributor $signed_tag".
1185 * We want to forbid such a merge from fast-forwarding
1186 * by default; otherwise we would not keep the signature
1187 * anywhere.
1188 */
1189 tag_ref = xstrfmt("refs/tags/%s",
1190 ((struct tag *)merge_remote_util(commit)->obj)->tag);
1191 if (!read_ref(tag_ref, &oid) &&
1192 !oidcmp(&oid, &merge_remote_util(commit)->obj->oid))
1193 is_throwaway_tag = 0;
1194 else
1195 is_throwaway_tag = 1;
1196 free(tag_ref);
1197 return is_throwaway_tag;
1198}
1199
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001200int cmd_merge(int argc, const char **argv, const char *prefix)
1201{
brian m. carlson52684312017-02-21 23:47:28 +00001202 struct object_id result_tree, stash, head_oid;
Nguyễn Thái Ngọc Duy894642f2011-09-17 21:57:44 +10001203 struct commit *head_commit;
Brandon Caseyf285a2d2008-10-09 14:12:12 -05001204 struct strbuf buf = STRBUF_INIT;
Michael Haggerty17377b62016-04-07 15:03:06 -04001205 int i, ret = 0, head_subsumed;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001206 int best_cnt = -1, merge_was_ok = 0, automerge_was_ok = 0;
1207 struct commit_list *common = NULL;
1208 const char *best_strategy = NULL, *wt_strategy = NULL;
Junio C Hamanob5d887f2012-04-17 11:31:10 -07001209 struct commit_list *remoteheads, *p;
Nguyễn Thái Ngọc Duy96ec7b12011-12-13 21:17:48 +07001210 void *branch_to_free;
Chris Packham367ff692016-12-14 21:37:55 +13001211 int orig_argc = argc;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001212
Nguyễn Thái Ngọc Duyda53eec2010-10-22 01:49:45 -05001213 if (argc == 2 && !strcmp(argv[1], "-h"))
1214 usage_with_options(builtin_merge_usage, builtin_merge_options);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001215
1216 /*
1217 * Check if we are _not_ on a detached HEAD, i.e. if there is a
1218 * current branch.
1219 */
brian m. carlson0f2dc722017-10-15 22:06:55 +00001220 branch = branch_to_free = resolve_refdup("HEAD", 0, &head_oid, NULL);
René Scharfede3ce212017-08-10 18:47:55 +02001221 if (branch)
1222 skip_prefix(branch, "refs/heads/", &branch);
Derrick Stolee7adf5262018-05-01 12:47:23 +00001223
1224 init_diff_ui_defaults();
1225 git_config(git_merge_config, NULL);
1226
brian m. carlson52684312017-02-21 23:47:28 +00001227 if (!branch || is_null_oid(&head_oid))
Nguyễn Thái Ngọc Duy894642f2011-09-17 21:57:44 +10001228 head_commit = NULL;
Nguyễn Thái Ngọc Duybaf18fc2011-09-17 21:57:45 +10001229 else
brian m. carlsonbc832662017-05-06 22:10:10 +00001230 head_commit = lookup_commit_or_die(&head_oid, "HEAD");
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001231
Junio C Hamano0d8fc3e2011-05-04 17:42:51 -07001232 if (branch_mergeoptions)
1233 parse_branch_merge_options(branch_mergeoptions);
Stephen Boyd37782922009-05-23 11:53:12 -07001234 argc = parse_options(argc, argv, prefix, builtin_merge_options,
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001235 builtin_merge_usage, 0);
Junio C Hamano898eacd2011-10-06 23:12:09 -07001236 if (shortlog_len < 0)
1237 shortlog_len = (merge_log_config > 0) ? merge_log_config : 0;
Johan Herland2a22c1b2010-11-09 22:49:58 +01001238
Jeff King99bfc662011-02-20 04:53:21 -05001239 if (verbosity < 0 && show_progress == -1)
1240 show_progress = 0;
1241
Johan Herland35d2fff2010-11-09 22:49:59 +01001242 if (abort_current_merge) {
1243 int nargc = 2;
1244 const char *nargv[] = {"reset", "--merge", NULL};
1245
Chris Packham042e2902016-12-14 21:37:57 +13001246 if (orig_argc != 2)
Jeff Kingc7d227d2016-12-15 12:43:46 -05001247 usage_msg_opt(_("--abort expects no arguments"),
Chris Packham042e2902016-12-14 21:37:57 +13001248 builtin_merge_usage, builtin_merge_options);
1249
Stefan Beller102de882018-05-17 15:51:51 -07001250 if (!file_exists(git_path_merge_head(the_repository)))
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +00001251 die(_("There is no merge to abort (MERGE_HEAD missing)."));
Johan Herland35d2fff2010-11-09 22:49:59 +01001252
1253 /* Invoke 'git reset --merge' */
Nguyễn Thái Ngọc Duyd5a35c12011-11-13 17:22:15 +07001254 ret = cmd_reset(nargc, nargv, prefix);
1255 goto done;
Johan Herland35d2fff2010-11-09 22:49:59 +01001256 }
1257
Chris Packham367ff692016-12-14 21:37:55 +13001258 if (continue_current_merge) {
1259 int nargc = 1;
1260 const char *nargv[] = {"commit", NULL};
1261
1262 if (orig_argc != 2)
Jeff Kingc7d227d2016-12-15 12:43:46 -05001263 usage_msg_opt(_("--continue expects no arguments"),
Chris Packham367ff692016-12-14 21:37:55 +13001264 builtin_merge_usage, builtin_merge_options);
1265
Stefan Beller102de882018-05-17 15:51:51 -07001266 if (!file_exists(git_path_merge_head(the_repository)))
Chris Packham367ff692016-12-14 21:37:55 +13001267 die(_("There is no merge in progress (MERGE_HEAD missing)."));
1268
1269 /* Invoke 'git commit' */
1270 ret = cmd_commit(nargc, nargv, prefix);
1271 goto done;
1272 }
1273
Johan Herland2a22c1b2010-11-09 22:49:58 +01001274 if (read_cache_unmerged())
1275 die_resolve_conflict("merge");
1276
Stefan Beller102de882018-05-17 15:51:51 -07001277 if (file_exists(git_path_merge_head(the_repository))) {
Johan Herland2a22c1b2010-11-09 22:49:58 +01001278 /*
1279 * There is no unmerged entry, don't advise 'git
1280 * add/rm <file>', just 'git commit'.
1281 */
1282 if (advice_resolve_conflict)
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +00001283 die(_("You have not concluded your merge (MERGE_HEAD exists).\n"
Alex Henriead5fe372014-08-30 13:56:01 -06001284 "Please, commit your changes before you merge."));
Johan Herland2a22c1b2010-11-09 22:49:58 +01001285 else
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +00001286 die(_("You have not concluded your merge (MERGE_HEAD exists)."));
Johan Herland2a22c1b2010-11-09 22:49:58 +01001287 }
Stefan Beller102de882018-05-17 15:51:51 -07001288 if (file_exists(git_path_cherry_pick_head(the_repository))) {
Jay Soffiand7e5c0c2011-02-19 23:12:27 -05001289 if (advice_resolve_conflict)
Ævar Arnfjörð Bjarmasonf68f1802011-04-10 19:34:05 +00001290 die(_("You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
Alex Henriead5fe372014-08-30 13:56:01 -06001291 "Please, commit your changes before you merge."));
Jay Soffiand7e5c0c2011-02-19 23:12:27 -05001292 else
Ævar Arnfjörð Bjarmasonf68f1802011-04-10 19:34:05 +00001293 die(_("You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."));
Jay Soffiand7e5c0c2011-02-19 23:12:27 -05001294 }
Johan Herland2a22c1b2010-11-09 22:49:58 +01001295 resolve_undo_clear();
1296
Tuncer Ayaz7f87aff2008-11-15 01:14:24 +01001297 if (verbosity < 0)
1298 show_diffstat = 0;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001299
1300 if (squash) {
Miklos Vajnaa54841e2013-07-02 16:47:57 +02001301 if (fast_forward == FF_NO)
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +00001302 die(_("You cannot combine --squash with --no-ff."));
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001303 option_commit = 0;
1304 }
1305
Junio C Hamano00c7e7e2015-04-23 13:01:44 -07001306 if (!argc) {
1307 if (default_to_upstream)
1308 argc = setup_with_upstream(&argv);
1309 else
1310 die(_("No commit specified and merge.defaultToUpstream not set."));
1311 } else if (argc == 1 && !strcmp(argv[0], "-")) {
1312 argv[0] = "@{-1}";
Junio C Hamano4e8115f2011-04-07 15:57:57 -07001313 }
Junio C Hamano00c7e7e2015-04-23 13:01:44 -07001314
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001315 if (!argc)
1316 usage_with_options(builtin_merge_usage,
1317 builtin_merge_options);
1318
Junio C Hamano1faac1c2015-04-23 13:46:44 -07001319 if (!head_commit) {
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001320 /*
1321 * If the merged head is a valid one there is no reason
1322 * to forbid "git merge" into a branch yet to be born.
1323 * We do the same for "git pull".
1324 */
brian m. carlson52684312017-02-21 23:47:28 +00001325 struct object_id *remote_head_oid;
Paolo Bonzini4be636f2008-08-21 14:14:18 +02001326 if (squash)
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +00001327 die(_("Squash commit into empty head not supported yet"));
Miklos Vajnaa54841e2013-07-02 16:47:57 +02001328 if (fast_forward == FF_NO)
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +00001329 die(_("Non-fast-forward commit does not make sense into "
1330 "an empty head"));
Junio C Hamano1cf32f42015-04-25 18:34:22 -07001331 remoteheads = collect_parents(head_commit, &head_subsumed,
1332 argc, argv, NULL);
Junio C Hamanob84e65d2016-03-21 12:01:43 -07001333 if (!remoteheads)
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +00001334 die(_("%s - not something we can merge"), argv[0]);
Junio C Hamanoeaa4e592015-04-23 13:56:34 -07001335 if (remoteheads->next)
1336 die(_("Can merge only exactly one commit into empty head"));
brian m. carlson52684312017-02-21 23:47:28 +00001337 remote_head_oid = &remoteheads->item->object.oid;
brian m. carlsoncb910222018-05-02 00:25:56 +00001338 read_empty(remote_head_oid, 0);
brian m. carlsonae077772017-10-15 22:06:51 +00001339 update_ref("initial pull", "HEAD", remote_head_oid, NULL, 0,
1340 UPDATE_REFS_DIE_ON_ERR);
Nguyễn Thái Ngọc Duyd5a35c12011-11-13 17:22:15 +07001341 goto done;
Junio C Hamano1faac1c2015-04-23 13:46:44 -07001342 }
1343
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001344 /*
Junio C Hamanob4391652015-03-25 22:00:48 -07001345 * All the rest are the commits being merged; prepare
1346 * the standard merge summary message to be appended
1347 * to the given message.
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001348 */
Junio C Hamanob4391652015-03-25 22:00:48 -07001349 remoteheads = collect_parents(head_commit, &head_subsumed,
1350 argc, argv, &merge_msg);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001351
Nguyễn Thái Ngọc Duy894642f2011-09-17 21:57:44 +10001352 if (!head_commit || !argc)
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001353 usage_with_options(builtin_merge_usage,
1354 builtin_merge_options);
1355
Sebastian Götteefed0022013-03-31 18:02:24 +02001356 if (verify_signatures) {
1357 for (p = remoteheads; p; p = p->next) {
1358 struct commit *commit = p->item;
brian m. carlsondc015052017-03-26 16:01:24 +00001359 char hex[GIT_MAX_HEXSZ + 1];
Sebastian Götteefed0022013-03-31 18:02:24 +02001360 struct signature_check signature_check;
1361 memset(&signature_check, 0, sizeof(signature_check));
1362
1363 check_commit_signature(commit, &signature_check);
1364
brian m. carlsonaab95832018-03-12 02:27:30 +00001365 find_unique_abbrev_r(hex, &commit->object.oid, DEFAULT_ABBREV);
Sebastian Götteefed0022013-03-31 18:02:24 +02001366 switch (signature_check.result) {
1367 case 'G':
1368 break;
Sebastian Götteeb307ae2013-03-31 18:02:46 +02001369 case 'U':
1370 die(_("Commit %s has an untrusted GPG signature, "
1371 "allegedly by %s."), hex, signature_check.signer);
Sebastian Götteefed0022013-03-31 18:02:24 +02001372 case 'B':
1373 die(_("Commit %s has a bad GPG signature "
1374 "allegedly by %s."), hex, signature_check.signer);
1375 default: /* 'N' */
1376 die(_("Commit %s does not have a GPG signature."), hex);
1377 }
1378 if (verbosity >= 0 && signature_check.result == 'G')
1379 printf(_("Commit %s has a good GPG signature by %s\n"),
1380 hex, signature_check.signer);
1381
Michael J Gruber01e57b52014-06-23 09:05:47 +02001382 signature_check_clear(&signature_check);
Sebastian Götteefed0022013-03-31 18:02:24 +02001383 }
1384 }
1385
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001386 strbuf_addstr(&buf, "merge");
Junio C Hamanob5d887f2012-04-17 11:31:10 -07001387 for (p = remoteheads; p; p = p->next)
1388 strbuf_addf(&buf, " %s", merge_remote_util(p->item)->name);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001389 setenv("GIT_REFLOG_ACTION", buf.buf, 0);
1390 strbuf_reset(&buf);
1391
Junio C Hamanob5d887f2012-04-17 11:31:10 -07001392 for (p = remoteheads; p; p = p->next) {
1393 struct commit *commit = p->item;
Junio C Hamanoae8e4c92011-11-07 13:26:22 -08001394 strbuf_addf(&buf, "GITHEAD_%s",
brian m. carlsonc368dde2016-06-24 23:09:22 +00001395 oid_to_hex(&commit->object.oid));
Junio C Hamanob5d887f2012-04-17 11:31:10 -07001396 setenv(buf.buf, merge_remote_util(commit)->name, 1);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001397 strbuf_reset(&buf);
Junio C Hamanoadcc94a2018-02-14 10:18:55 -08001398 if (fast_forward != FF_ONLY && merging_a_throwaway_tag(commit))
Miklos Vajnaa54841e2013-07-02 16:47:57 +02001399 fast_forward = FF_NO;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001400 }
1401
Junio C Hamanof8246282012-01-10 22:44:45 -08001402 if (option_edit < 0)
1403 option_edit = default_edit_option();
1404
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001405 if (!use_strategies) {
Junio C Hamanoe78cbf82012-04-17 12:22:26 -07001406 if (!remoteheads)
1407 ; /* already up-to-date */
1408 else if (!remoteheads->next)
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001409 add_strategies(pull_twohead, DEFAULT_TWOHEAD);
1410 else
1411 add_strategies(pull_octopus, DEFAULT_OCTOPUS);
1412 }
1413
1414 for (i = 0; i < use_strategies_nr; i++) {
1415 if (use_strategies[i]->attr & NO_FAST_FORWARD)
Miklos Vajnaa54841e2013-07-02 16:47:57 +02001416 fast_forward = FF_NO;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001417 if (use_strategies[i]->attr & NO_TRIVIAL)
1418 allow_trivial = 0;
1419 }
1420
Junio C Hamanoe78cbf82012-04-17 12:22:26 -07001421 if (!remoteheads)
1422 ; /* already up-to-date */
1423 else if (!remoteheads->next)
Junio C Hamano2ce406c2014-10-30 12:20:44 -07001424 common = get_merge_bases(head_commit, remoteheads->item);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001425 else {
1426 struct commit_list *list = remoteheads;
Nguyễn Thái Ngọc Duy894642f2011-09-17 21:57:44 +10001427 commit_list_insert(head_commit, &list);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001428 common = get_octopus_merge_bases(list);
1429 free(list);
1430 }
1431
brian m. carlsonae077772017-10-15 22:06:51 +00001432 update_ref("updating ORIG_HEAD", "ORIG_HEAD",
1433 &head_commit->object.oid, NULL, 0, UPDATE_REFS_DIE_ON_ERR);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001434
Junio C Hamanoe379fdf2016-03-18 13:21:09 -07001435 if (remoteheads && !common) {
1436 /* No common ancestors found. */
1437 if (!allow_unrelated_histories)
1438 die(_("refusing to merge unrelated histories"));
1439 /* otherwise, we need a real merge. */
1440 } else if (!remoteheads ||
Junio C Hamanoe78cbf82012-04-17 12:22:26 -07001441 (!remoteheads->next && !common->next &&
1442 common->item == remoteheads->item)) {
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001443 /*
1444 * If head can reach all the merge then we are up to date.
1445 * but first the most common case of merging one remote.
1446 */
Martin Ågren7560f542017-08-23 19:49:35 +02001447 finish_up_to_date(_("Already up to date."));
Nguyễn Thái Ngọc Duyd5a35c12011-11-13 17:22:15 +07001448 goto done;
Miklos Vajnaa54841e2013-07-02 16:47:57 +02001449 } else if (fast_forward != FF_NO && !remoteheads->next &&
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001450 !common->next &&
brian m. carlsonc368dde2016-06-24 23:09:22 +00001451 !oidcmp(&common->item->object.oid, &head_commit->object.oid)) {
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001452 /* Again the most common case of merging one remote. */
Brandon Caseyf285a2d2008-10-09 14:12:12 -05001453 struct strbuf msg = STRBUF_INIT;
Junio C Hamanoae8e4c92011-11-07 13:26:22 -08001454 struct commit *commit;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001455
Jeff Kingd59f7652015-09-24 17:08:03 -04001456 if (verbosity >= 0) {
Jeff Kingef2ed502016-10-20 02:19:19 -04001457 printf(_("Updating %s..%s\n"),
brian m. carlsonaab95832018-03-12 02:27:30 +00001458 find_unique_abbrev(&head_commit->object.oid,
Jeff Kingef2ed502016-10-20 02:19:19 -04001459 DEFAULT_ABBREV),
brian m. carlsonaab95832018-03-12 02:27:30 +00001460 find_unique_abbrev(&remoteheads->item->object.oid,
Jeff Kingef2ed502016-10-20 02:19:19 -04001461 DEFAULT_ABBREV));
Jeff Kingd59f7652015-09-24 17:08:03 -04001462 }
Felipe Contrerasa75d7b52009-10-24 11:31:32 +03001463 strbuf_addstr(&msg, "Fast-forward");
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001464 if (have_message)
1465 strbuf_addstr(&msg,
1466 " (no commit created; -m option ignored)");
Junio C Hamanoae8e4c92011-11-07 13:26:22 -08001467 commit = remoteheads->item;
Junio C Hamanob7f7c072011-12-09 13:37:14 -08001468 if (!commit) {
Nguyễn Thái Ngọc Duyd5a35c12011-11-13 17:22:15 +07001469 ret = 1;
1470 goto done;
1471 }
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001472
brian m. carlsonf06e90d2017-05-06 22:10:33 +00001473 if (checkout_fast_forward(&head_commit->object.oid,
1474 &commit->object.oid,
Nguyễn Thái Ngọc Duydb699a82012-10-26 22:53:49 +07001475 overwrite_ignore)) {
Nguyễn Thái Ngọc Duyd5a35c12011-11-13 17:22:15 +07001476 ret = 1;
1477 goto done;
1478 }
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001479
brian m. carlson52684312017-02-21 23:47:28 +00001480 finish(head_commit, remoteheads, &commit->object.oid, msg.buf);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001481 drop_save();
Nguyễn Thái Ngọc Duyd5a35c12011-11-13 17:22:15 +07001482 goto done;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001483 } else if (!remoteheads->next && common->next)
1484 ;
1485 /*
Felipe Contrerasa75d7b52009-10-24 11:31:32 +03001486 * We are not doing octopus and not fast-forward. Need
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001487 * a real merge.
1488 */
1489 else if (!remoteheads->next && !common->next && option_commit) {
1490 /*
Felipe Contrerasa75d7b52009-10-24 11:31:32 +03001491 * We are not doing octopus, not fast-forward, and have
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001492 * only one common.
1493 */
1494 refresh_cache(REFRESH_QUIET);
Miklos Vajnaa54841e2013-07-02 16:47:57 +02001495 if (allow_trivial && fast_forward != FF_ONLY) {
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001496 /* See if it is really trivial. */
Jeff Kingf9bc5732012-05-24 19:28:40 -04001497 git_committer_info(IDENT_STRICT);
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +00001498 printf(_("Trying really trivial in-index merge...\n"));
brian m. carlson52684312017-02-21 23:47:28 +00001499 if (!read_tree_trivial(&common->item->object.oid,
1500 &head_commit->object.oid,
1501 &remoteheads->item->object.oid)) {
Junio C Hamano4c57bd22012-04-16 16:15:13 -07001502 ret = merge_trivial(head_commit, remoteheads);
Nguyễn Thái Ngọc Duyd5a35c12011-11-13 17:22:15 +07001503 goto done;
1504 }
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +00001505 printf(_("Nope.\n"));
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001506 }
1507 } else {
1508 /*
1509 * An octopus. If we can reach all the remote we are up
1510 * to date.
1511 */
1512 int up_to_date = 1;
1513 struct commit_list *j;
1514
1515 for (j = remoteheads; j; j = j->next) {
1516 struct commit_list *common_one;
1517
1518 /*
1519 * Here we *have* to calculate the individual
1520 * merge_bases again, otherwise "git merge HEAD^
1521 * HEAD^^" would be missed.
1522 */
Junio C Hamano2ce406c2014-10-30 12:20:44 -07001523 common_one = get_merge_bases(head_commit, j->item);
brian m. carlsonc368dde2016-06-24 23:09:22 +00001524 if (oidcmp(&common_one->item->object.oid, &j->item->object.oid)) {
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001525 up_to_date = 0;
1526 break;
1527 }
1528 }
1529 if (up_to_date) {
Martin Ågren7560f542017-08-23 19:49:35 +02001530 finish_up_to_date(_("Already up to date. Yeeah!"));
Nguyễn Thái Ngọc Duyd5a35c12011-11-13 17:22:15 +07001531 goto done;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001532 }
1533 }
1534
Miklos Vajnaa54841e2013-07-02 16:47:57 +02001535 if (fast_forward == FF_ONLY)
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +00001536 die(_("Not possible to fast-forward, aborting."));
Björn Gustavsson13474832009-10-29 23:08:31 +01001537
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001538 /* We are going to make a new commit. */
Jeff Kingf9bc5732012-05-24 19:28:40 -04001539 git_committer_info(IDENT_STRICT);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001540
1541 /*
1542 * At this point, we need a real merge. No matter what strategy
1543 * we use, it would operate on the index, possibly affecting the
1544 * working tree, and when resolved cleanly, have the desired
1545 * tree in the index -- this means that the index must be in
1546 * sync with the head commit. The strategies are responsible
1547 * to ensure this.
1548 */
Nguyễn Thái Ngọc Duyb4fd9402011-08-19 21:50:05 +07001549 if (use_strategies_nr == 1 ||
1550 /*
1551 * Stash away the local changes so that we can try more than one.
1552 */
brian m. carlson52684312017-02-21 23:47:28 +00001553 save_state(&stash))
1554 oidclr(&stash);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001555
1556 for (i = 0; i < use_strategies_nr; i++) {
1557 int ret;
1558 if (i) {
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +00001559 printf(_("Rewinding the tree to pristine...\n"));
brian m. carlson52684312017-02-21 23:47:28 +00001560 restore_state(&head_commit->object.oid, &stash);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001561 }
1562 if (use_strategies_nr != 1)
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +00001563 printf(_("Trying merge strategy %s...\n"),
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001564 use_strategies[i]->name);
1565 /*
1566 * Remember which strategy left the state in the working
1567 * tree.
1568 */
1569 wt_strategy = use_strategies[i]->name;
1570
1571 ret = try_merge_strategy(use_strategies[i]->name,
Junio C Hamano4c57bd22012-04-16 16:15:13 -07001572 common, remoteheads,
Junio C Hamanob4391652015-03-25 22:00:48 -07001573 head_commit);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001574 if (!option_commit && !ret) {
1575 merge_was_ok = 1;
1576 /*
1577 * This is necessary here just to avoid writing
1578 * the tree, but later we will *not* exit with
1579 * status code 1 because merge_was_ok is set.
1580 */
1581 ret = 1;
1582 }
1583
1584 if (ret) {
1585 /*
1586 * The backend exits with 1 when conflicts are
1587 * left to be resolved, with 2 when it does not
1588 * handle the given merge at all.
1589 */
1590 if (ret == 1) {
1591 int cnt = evaluate_result();
1592
1593 if (best_cnt <= 0 || cnt <= best_cnt) {
1594 best_strategy = use_strategies[i]->name;
1595 best_cnt = cnt;
1596 }
1597 }
1598 if (merge_was_ok)
1599 break;
1600 else
1601 continue;
1602 }
1603
1604 /* Automerge succeeded. */
brian m. carlson52684312017-02-21 23:47:28 +00001605 write_tree_trivial(&result_tree);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001606 automerge_was_ok = 1;
1607 break;
1608 }
1609
1610 /*
1611 * If we have a resulting tree, that means the strategy module
1612 * auto resolved the merge cleanly.
1613 */
Nguyễn Thái Ngọc Duyd5a35c12011-11-13 17:22:15 +07001614 if (automerge_was_ok) {
Junio C Hamanoe78cbf82012-04-17 12:22:26 -07001615 ret = finish_automerge(head_commit, head_subsumed,
1616 common, remoteheads,
brian m. carlson52684312017-02-21 23:47:28 +00001617 &result_tree, wt_strategy);
Nguyễn Thái Ngọc Duyd5a35c12011-11-13 17:22:15 +07001618 goto done;
1619 }
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001620
1621 /*
1622 * Pick the result from the best strategy and have the user fix
1623 * it up.
1624 */
1625 if (!best_strategy) {
brian m. carlson52684312017-02-21 23:47:28 +00001626 restore_state(&head_commit->object.oid, &stash);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001627 if (use_strategies_nr > 1)
1628 fprintf(stderr,
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +00001629 _("No merge strategy handled the merge.\n"));
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001630 else
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +00001631 fprintf(stderr, _("Merge with strategy %s failed.\n"),
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001632 use_strategies[0]->name);
Nguyễn Thái Ngọc Duyd5a35c12011-11-13 17:22:15 +07001633 ret = 2;
1634 goto done;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001635 } else if (best_strategy == wt_strategy)
1636 ; /* We already have its result in the working tree. */
1637 else {
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +00001638 printf(_("Rewinding the tree to pristine...\n"));
brian m. carlson52684312017-02-21 23:47:28 +00001639 restore_state(&head_commit->object.oid, &stash);
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +00001640 printf(_("Using the %s to prepare resolving by hand.\n"),
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001641 best_strategy);
Junio C Hamano4c57bd22012-04-16 16:15:13 -07001642 try_merge_strategy(best_strategy, common, remoteheads,
Junio C Hamanob4391652015-03-25 22:00:48 -07001643 head_commit);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001644 }
1645
1646 if (squash)
Junio C Hamano4c57bd22012-04-16 16:15:13 -07001647 finish(head_commit, remoteheads, NULL, NULL);
Jay Soffian66f4b982011-10-08 14:39:52 -04001648 else
Junio C Hamano4c57bd22012-04-16 16:15:13 -07001649 write_merge_state(remoteheads);
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001650
Nguyễn Thái Ngọc Duyd5a35c12011-11-13 17:22:15 +07001651 if (merge_was_ok)
Ævar Arnfjörð Bjarmasonbacec472011-02-22 23:41:59 +00001652 fprintf(stderr, _("Automatic merge went well; "
1653 "stopped before committing as requested\n"));
Nguyễn Thái Ngọc Duyd5a35c12011-11-13 17:22:15 +07001654 else
Junio C Hamano08e3ce52014-10-24 11:27:22 -07001655 ret = suggest_conflicts();
Nguyễn Thái Ngọc Duyd5a35c12011-11-13 17:22:15 +07001656
1657done:
Nguyễn Thái Ngọc Duy96ec7b12011-12-13 21:17:48 +07001658 free(branch_to_free);
Nguyễn Thái Ngọc Duyd5a35c12011-11-13 17:22:15 +07001659 return ret;
Miklos Vajna1c7b76b2008-07-07 19:24:20 +02001660}