@matheusbsbs / matheus-bagliano / commits / 1c7b76be7d
Fork 0

Build in merge

Mentored-by: Johannes Schindelin <Johannes.Schindelin@gmx.de> Signed-off-by: Miklos Vajna <vmiklos@frugalware.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Miklos Vajna committed Jul 7, 2008 at 19:24 UTC 1c7b76be7d620bbaf2e6b8417f04012326bbb9df
6 files changed +1157 -2
Makefile
+1 -1
@@ -240,7 +240,6 @@ SCRIPT_SH += git-lost-found.sh
240 SCRIPT_SH += git-merge-octopus.sh
241 SCRIPT_SH += git-merge-one-file.sh
242 SCRIPT_SH += git-merge-resolve.sh
243 -SCRIPT_SH += git-merge.sh
243 SCRIPT_SH += git-merge-stupid.sh
244 SCRIPT_SH += git-mergetool.sh
245 SCRIPT_SH += git-parse-remote.sh
@@ -515,6 +514,7 @@ BUILTIN_OBJS += builtin-ls-remote.o
514 BUILTIN_OBJS += builtin-ls-tree.o
515 BUILTIN_OBJS += builtin-mailinfo.o
516 BUILTIN_OBJS += builtin-mailsplit.o
517 +BUILTIN_OBJS += builtin-merge.o
518 BUILTIN_OBJS += builtin-merge-base.o
519 BUILTIN_OBJS += builtin-merge-file.o
520 BUILTIN_OBJS += builtin-merge-ours.o
builtin-merge.c new
+1153
@@ -0,0 +1,1153 @@
1 +/*
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"
10 +#include "parse-options.h"
11 +#include "builtin.h"
12 +#include "run-command.h"
13 +#include "diff.h"
14 +#include "refs.h"
15 +#include "commit.h"
16 +#include "diffcore.h"
17 +#include "revision.h"
18 +#include "unpack-trees.h"
19 +#include "cache-tree.h"
20 +#include "dir.h"
21 +#include "utf8.h"
22 +#include "log-tree.h"
23 +#include "color.h"
24 +
25 +#define DEFAULT_TWOHEAD (1<<0)
26 +#define DEFAULT_OCTOPUS (1<<1)
27 +#define NO_FAST_FORWARD (1<<2)
28 +#define NO_TRIVIAL (1<<3)
29 +
30 +struct strategy {
31 + const char *name;
32 + unsigned attr;
33 +};
34 +
35 +static const char * const builtin_merge_usage[] = {
36 + "git-merge [options] <remote>...",
37 + "git-merge [options] <msg> HEAD <remote>",
38 + NULL
39 +};
40 +
41 +static int show_diffstat = 1, option_log, squash;
42 +static int option_commit = 1, allow_fast_forward = 1;
43 +static int allow_trivial = 1, have_message;
44 +static struct strbuf merge_msg;
45 +static struct commit_list *remoteheads;
46 +static unsigned char head[20], stash[20];
47 +static struct strategy **use_strategies;
48 +static size_t use_strategies_nr, use_strategies_alloc;
49 +static const char *branch;
50 +
51 +static struct strategy all_strategy[] = {
52 + { "recur", NO_TRIVIAL },
53 + { "recursive", DEFAULT_TWOHEAD | NO_TRIVIAL },
54 + { "octopus", DEFAULT_OCTOPUS },
55 + { "resolve", 0 },
56 + { "stupid", 0 },
57 + { "ours", NO_FAST_FORWARD | NO_TRIVIAL },
58 + { "subtree", NO_FAST_FORWARD | NO_TRIVIAL },
59 +};
60 +
61 +static const char *pull_twohead, *pull_octopus;
62 +
63 +static int option_parse_message(const struct option *opt,
64 + const char *arg, int unset)
65 +{
66 + struct strbuf *buf = opt->value;
67 +
68 + if (unset)
69 + strbuf_setlen(buf, 0);
70 + else {
71 + strbuf_addf(buf, "%s\n\n", arg);
72 + have_message = 1;
73 + }
74 + return 0;
75 +}
76 +
77 +static struct strategy *get_strategy(const char *name)
78 +{
79 + int i;
80 +
81 + if (!name)
82 + return NULL;
83 +
84 + for (i = 0; i < ARRAY_SIZE(all_strategy); i++)
85 + if (!strcmp(name, all_strategy[i].name))
86 + return &all_strategy[i];
87 + return NULL;
88 +}
89 +
90 +static void append_strategy(struct strategy *s)
91 +{
92 + ALLOC_GROW(use_strategies, use_strategies_nr + 1, use_strategies_alloc);
93 + use_strategies[use_strategies_nr++] = s;
94 +}
95 +
96 +static int option_parse_strategy(const struct option *opt,
97 + const char *name, int unset)
98 +{
99 + int i;
100 + struct strategy *s;
101 +
102 + if (unset)
103 + return 0;
104 +
105 + s = get_strategy(name);
106 +
107 + if (s)
108 + append_strategy(s);
109 + else {
110 + struct strbuf err;
111 + strbuf_init(&err, 0);
112 + for (i = 0; i < ARRAY_SIZE(all_strategy); i++)
113 + strbuf_addf(&err, " %s", all_strategy[i].name);
114 + fprintf(stderr, "Could not find merge strategy '%s'.\n", name);
115 + fprintf(stderr, "Available strategies are:%s.\n", err.buf);
116 + exit(1);
117 + }
118 + return 0;
119 +}
120 +
121 +static int option_parse_n(const struct option *opt,
122 + const char *arg, int unset)
123 +{
124 + show_diffstat = unset;
125 + return 0;
126 +}
127 +
128 +static struct option builtin_merge_options[] = {
129 + { OPTION_CALLBACK, 'n', NULL, NULL, NULL,
130 + "do not show a diffstat at the end of the merge",
131 + PARSE_OPT_NOARG, option_parse_n },
132 + OPT_BOOLEAN(0, "stat", &show_diffstat,
133 + "show a diffstat at the end of the merge"),
134 + OPT_BOOLEAN(0, "summary", &show_diffstat, "(synonym to --stat)"),
135 + OPT_BOOLEAN(0, "log", &option_log,
136 + "add list of one-line log to merge commit message"),
137 + OPT_BOOLEAN(0, "squash", &squash,
138 + "create a single commit instead of doing a merge"),
139 + OPT_BOOLEAN(0, "commit", &option_commit,
140 + "perform a commit if the merge succeeds (default)"),
141 + OPT_BOOLEAN(0, "ff", &allow_fast_forward,
142 + "allow fast forward (default)"),
143 + OPT_CALLBACK('s', "strategy", &use_strategies, "strategy",
144 + "merge strategy to use", option_parse_strategy),
145 + OPT_CALLBACK('m', "message", &merge_msg, "message",
146 + "message to be used for the merge commit (if any)",
147 + option_parse_message),
148 + OPT_END()
149 +};
150 +
151 +/* Cleans up metadata that is uninteresting after a succeeded merge. */
152 +static void drop_save(void)
153 +{
154 + unlink(git_path("MERGE_HEAD"));
155 + unlink(git_path("MERGE_MSG"));
156 +}
157 +
158 +static void save_state(void)
159 +{
160 + int len;
161 + struct child_process cp;
162 + struct strbuf buffer = STRBUF_INIT;
163 + const char *argv[] = {"stash", "create", NULL};
164 +
165 + memset(&cp, 0, sizeof(cp));
166 + cp.argv = argv;
167 + cp.out = -1;
168 + cp.git_cmd = 1;
169 +
170 + if (start_command(&cp))
171 + die("could not run stash.");
172 + len = strbuf_read(&buffer, cp.out, 1024);
173 + close(cp.out);
174 +
175 + if (finish_command(&cp) || len < 0)
176 + die("stash failed");
177 + else if (!len)
178 + return;
179 + strbuf_setlen(&buffer, buffer.len-1);
180 + if (get_sha1(buffer.buf, stash))
181 + die("not a valid object: %s", buffer.buf);
182 +}
183 +
184 +static void reset_hard(unsigned const char *sha1, int verbose)
185 +{
186 + int i = 0;
187 + const char *args[6];
188 +
189 + args[i++] = "read-tree";
190 + if (verbose)
191 + args[i++] = "-v";
192 + args[i++] = "--reset";
193 + args[i++] = "-u";
194 + args[i++] = sha1_to_hex(sha1);
195 + args[i] = NULL;
196 +
197 + if (run_command_v_opt(args, RUN_GIT_CMD))
198 + die("read-tree failed");
199 +}
200 +
201 +static void restore_state(void)
202 +{
203 + struct strbuf sb;
204 + const char *args[] = { "stash", "apply", NULL, NULL };
205 +
206 + if (is_null_sha1(stash))
207 + return;
208 +
209 + reset_hard(head, 1);
210 +
211 + strbuf_init(&sb, 0);
212 + args[2] = sha1_to_hex(stash);
213 +
214 + /*
215 + * It is OK to ignore error here, for example when there was
216 + * nothing to restore.
217 + */
218 + run_command_v_opt(args, RUN_GIT_CMD);
219 +
220 + strbuf_release(&sb);
221 + refresh_cache(REFRESH_QUIET);
222 +}
223 +
224 +/* This is called when no merge was necessary. */
225 +static void finish_up_to_date(const char *msg)
226 +{
227 + printf("%s%s\n", squash ? " (nothing to squash)" : "", msg);
228 + drop_save();
229 +}
230 +
231 +static void squash_message(void)
232 +{
233 + struct rev_info rev;
234 + struct commit *commit;
235 + struct strbuf out;
236 + struct commit_list *j;
237 + int fd;
238 +
239 + printf("Squash commit -- not updating HEAD\n");
240 + fd = open(git_path("SQUASH_MSG"), O_WRONLY | O_CREAT, 0666);
241 + if (fd < 0)
242 + die("Could not write to %s", git_path("SQUASH_MSG"));
243 +
244 + init_revisions(&rev, NULL);
245 + rev.ignore_merges = 1;
246 + rev.commit_format = CMIT_FMT_MEDIUM;
247 +
248 + commit = lookup_commit(head);
249 + commit->object.flags |= UNINTERESTING;
250 + add_pending_object(&rev, &commit->object, NULL);
251 +
252 + for (j = remoteheads; j; j = j->next)
253 + add_pending_object(&rev, &j->item->object, NULL);
254 +
255 + setup_revisions(0, NULL, &rev, NULL);
256 + if (prepare_revision_walk(&rev))
257 + die("revision walk setup failed");
258 +
259 + strbuf_init(&out, 0);
260 + strbuf_addstr(&out, "Squashed commit of the following:\n");
261 + while ((commit = get_revision(&rev)) != NULL) {
262 + strbuf_addch(&out, '\n');
263 + strbuf_addf(&out, "commit %s\n",
264 + sha1_to_hex(commit->object.sha1));
265 + pretty_print_commit(rev.commit_format, commit, &out, rev.abbrev,
266 + NULL, NULL, rev.date_mode, 0);
267 + }
268 + write(fd, out.buf, out.len);
269 + close(fd);
270 + strbuf_release(&out);
271 +}
272 +
273 +static int run_hook(const char *name)
274 +{
275 + struct child_process hook;
276 + const char *argv[3], *env[2];
277 + char index[PATH_MAX];
278 +
279 + argv[0] = git_path("hooks/%s", name);
280 + if (access(argv[0], X_OK) < 0)
281 + return 0;
282 +
283 + snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", get_index_file());
284 + env[0] = index;
285 + env[1] = NULL;
286 +
287 + if (squash)
288 + argv[1] = "1";
289 + else
290 + argv[1] = "0";
291 + argv[2] = NULL;
292 +
293 + memset(&hook, 0, sizeof(hook));
294 + hook.argv = argv;
295 + hook.no_stdin = 1;
296 + hook.stdout_to_stderr = 1;
297 + hook.env = env;
298 +
299 + return run_command(&hook);
300 +}
301 +
302 +static void finish(const unsigned char *new_head, const char *msg)
303 +{
304 + struct strbuf reflog_message;
305 +
306 + strbuf_init(&reflog_message, 0);
307 + if (!msg)
308 + strbuf_addstr(&reflog_message, getenv("GIT_REFLOG_ACTION"));
309 + else {
310 + printf("%s\n", msg);
311 + strbuf_addf(&reflog_message, "%s: %s",
312 + getenv("GIT_REFLOG_ACTION"), msg);
313 + }
314 + if (squash) {
315 + squash_message();
316 + } else {
317 + if (!merge_msg.len)
318 + printf("No merge message -- not updating HEAD\n");
319 + else {
320 + const char *argv_gc_auto[] = { "gc", "--auto", NULL };
321 + update_ref(reflog_message.buf, "HEAD",
322 + new_head, head, 0,
323 + DIE_ON_ERR);
324 + /*
325 + * We ignore errors in 'gc --auto', since the
326 + * user should see them.
327 + */
328 + run_command_v_opt(argv_gc_auto, RUN_GIT_CMD);
329 + }
330 + }
331 + if (new_head && show_diffstat) {
332 + struct diff_options opts;
333 + diff_setup(&opts);
334 + opts.output_format |=
335 + DIFF_FORMAT_SUMMARY | DIFF_FORMAT_DIFFSTAT;
336 + opts.detect_rename = DIFF_DETECT_RENAME;
337 + if (diff_use_color_default > 0)
338 + DIFF_OPT_SET(&opts, COLOR_DIFF);
339 + if (diff_setup_done(&opts) < 0)
340 + die("diff_setup_done failed");
341 + diff_tree_sha1(head, new_head, "", &opts);
342 + diffcore_std(&opts);
343 + diff_flush(&opts);
344 + }
345 +
346 + /* Run a post-merge hook */
347 + run_hook("post-merge");
348 +
349 + strbuf_release(&reflog_message);
350 +}
351 +
352 +/* Get the name for the merge commit's message. */
353 +static void merge_name(const char *remote, struct strbuf *msg)
354 +{
355 + struct object *remote_head;
356 + unsigned char branch_head[20], buf_sha[20];
357 + struct strbuf buf;
358 + const char *ptr;
359 + int len, early;
360 +
361 + memset(branch_head, 0, sizeof(branch_head));
362 + remote_head = peel_to_type(remote, 0, NULL, OBJ_COMMIT);
363 + if (!remote_head)
364 + die("'%s' does not point to a commit", remote);
365 +
366 + strbuf_init(&buf, 0);
367 + strbuf_addstr(&buf, "refs/heads/");
368 + strbuf_addstr(&buf, remote);
369 + resolve_ref(buf.buf, branch_head, 0, 0);
370 +
371 + if (!hashcmp(remote_head->sha1, branch_head)) {
372 + strbuf_addf(msg, "%s\t\tbranch '%s' of .\n",
373 + sha1_to_hex(branch_head), remote);
374 + return;
375 + }
376 +
377 + /* See if remote matches <name>^^^.. or <name>~<number> */
378 + for (len = 0, ptr = remote + strlen(remote);
379 + remote < ptr && ptr[-1] == '^';
380 + ptr--)
381 + len++;
382 + if (len)
383 + early = 1;
384 + else {
385 + early = 0;
386 + ptr = strrchr(remote, '~');
387 + if (ptr) {
388 + int seen_nonzero = 0;
389 +
390 + len++; /* count ~ */
391 + while (*++ptr && isdigit(*ptr)) {
392 + seen_nonzero |= (*ptr != '0');
393 + len++;
394 + }
395 + if (*ptr)
396 + len = 0; /* not ...~<number> */
397 + else if (seen_nonzero)
398 + early = 1;
399 + else if (len == 1)
400 + early = 1; /* "name~" is "name~1"! */
401 + }
402 + }
403 + if (len) {
404 + struct strbuf truname = STRBUF_INIT;
405 + strbuf_addstr(&truname, "refs/heads/");
406 + strbuf_addstr(&truname, remote);
407 + strbuf_setlen(&truname, len+11);
408 + if (resolve_ref(truname.buf, buf_sha, 0, 0)) {
409 + strbuf_addf(msg,
410 + "%s\t\tbranch '%s'%s of .\n",
411 + sha1_to_hex(remote_head->sha1),
412 + truname.buf,
413 + (early ? " (early part)" : ""));
414 + return;
415 + }
416 + }
417 +
418 + if (!strcmp(remote, "FETCH_HEAD") &&
419 + !access(git_path("FETCH_HEAD"), R_OK)) {
420 + FILE *fp;
421 + struct strbuf line;
422 + char *ptr;
423 +
424 + strbuf_init(&line, 0);
425 + fp = fopen(git_path("FETCH_HEAD"), "r");
426 + if (!fp)
427 + die("could not open %s for reading: %s",
428 + git_path("FETCH_HEAD"), strerror(errno));
429 + strbuf_getline(&line, fp, '\n');
430 + fclose(fp);
431 + ptr = strstr(line.buf, "\tnot-for-merge\t");
432 + if (ptr)
433 + strbuf_remove(&line, ptr-line.buf+1, 13);
434 + strbuf_addbuf(msg, &line);
435 + strbuf_release(&line);
436 + return;
437 + }
438 + strbuf_addf(msg, "%s\t\tcommit '%s'\n",
439 + sha1_to_hex(remote_head->sha1), remote);
440 +}
441 +
442 +int git_merge_config(const char *k, const char *v, void *cb)
443 +{
444 + if (branch && !prefixcmp(k, "branch.") &&
445 + !prefixcmp(k + 7, branch) &&
446 + !strcmp(k + 7 + strlen(branch), ".mergeoptions")) {
447 + const char **argv;
448 + int argc;
449 + char *buf;
450 +
451 + buf = xstrdup(v);
452 + argc = split_cmdline(buf, &argv);
453 + argv = xrealloc(argv, sizeof(*argv) * (argc + 2));
454 + memmove(argv + 1, argv, sizeof(*argv) * (argc + 1));
455 + argc++;
456 + parse_options(argc, argv, builtin_merge_options,
457 + builtin_merge_usage, 0);
458 + free(buf);
459 + }
460 +
461 + if (!strcmp(k, "merge.diffstat") || !strcmp(k, "merge.stat"))
462 + show_diffstat = git_config_bool(k, v);
463 + else if (!strcmp(k, "pull.twohead"))
464 + return git_config_string(&pull_twohead, k, v);
465 + else if (!strcmp(k, "pull.octopus"))
466 + return git_config_string(&pull_octopus, k, v);
467 + return git_diff_ui_config(k, v, cb);
468 +}
469 +
470 +static int read_tree_trivial(unsigned char *common, unsigned char *head,
471 + unsigned char *one)
472 +{
473 + int i, nr_trees = 0;
474 + struct tree *trees[MAX_UNPACK_TREES];
475 + struct tree_desc t[MAX_UNPACK_TREES];
476 + struct unpack_trees_options opts;
477 +
478 + memset(&opts, 0, sizeof(opts));
479 + opts.head_idx = 2;
480 + opts.src_index = &the_index;
481 + opts.dst_index = &the_index;
482 + opts.update = 1;
483 + opts.verbose_update = 1;
484 + opts.trivial_merges_only = 1;
485 + opts.merge = 1;
486 + trees[nr_trees] = parse_tree_indirect(common);
487 + if (!trees[nr_trees++])
488 + return -1;
489 + trees[nr_trees] = parse_tree_indirect(head);
490 + if (!trees[nr_trees++])
491 + return -1;
492 + trees[nr_trees] = parse_tree_indirect(one);
493 + if (!trees[nr_trees++])
494 + return -1;
495 + opts.fn = threeway_merge;
496 + cache_tree_free(&active_cache_tree);
497 + for (i = 0; i < nr_trees; i++) {
498 + parse_tree(trees[i]);
499 + init_tree_desc(t+i, trees[i]->buffer, trees[i]->size);
500 + }
501 + if (unpack_trees(nr_trees, t, &opts))
502 + return -1;
503 + return 0;
504 +}
505 +
506 +static void write_tree_trivial(unsigned char *sha1)
507 +{
508 + if (write_cache_as_tree(sha1, 0, NULL))
509 + die("git write-tree failed to write a tree");
510 +}
511 +
512 +static int try_merge_strategy(const char *strategy, struct commit_list *common,
513 + const char *head_arg)
514 +{
515 + const char **args;
516 + int i = 0, ret;
517 + struct commit_list *j;
518 + struct strbuf buf;
519 +
520 + args = xmalloc((4 + commit_list_count(common) +
521 + commit_list_count(remoteheads)) * sizeof(char *));
522 + strbuf_init(&buf, 0);
523 + strbuf_addf(&buf, "merge-%s", strategy);
524 + args[i++] = buf.buf;
525 + for (j = common; j; j = j->next)
526 + args[i++] = xstrdup(sha1_to_hex(j->item->object.sha1));
527 + args[i++] = "--";
528 + args[i++] = head_arg;
529 + for (j = remoteheads; j; j = j->next)
530 + args[i++] = xstrdup(sha1_to_hex(j->item->object.sha1));
531 + args[i] = NULL;
532 + ret = run_command_v_opt(args, RUN_GIT_CMD);
533 + strbuf_release(&buf);
534 + i = 1;
535 + for (j = common; j; j = j->next)
536 + free((void *)args[i++]);
537 + i += 2;
538 + for (j = remoteheads; j; j = j->next)
539 + free((void *)args[i++]);
540 + free(args);
541 + return -ret;
542 +}
543 +
544 +static void count_diff_files(struct diff_queue_struct *q,
545 + struct diff_options *opt, void *data)
546 +{
547 + int *count = data;
548 +
549 + (*count) += q->nr;
550 +}
551 +
552 +static int count_unmerged_entries(void)
553 +{
554 + const struct index_state *state = &the_index;
555 + int i, ret = 0;
556 +
557 + for (i = 0; i < state->cache_nr; i++)
558 + if (ce_stage(state->cache[i]))
559 + ret++;
560 +
561 + return ret;
562 +}
563 +
564 +static int checkout_fast_forward(unsigned char *head, unsigned char *remote)
565 +{
566 + struct tree *trees[MAX_UNPACK_TREES];
567 + struct unpack_trees_options opts;
568 + struct tree_desc t[MAX_UNPACK_TREES];
569 + int i, fd, nr_trees = 0;
570 + struct dir_struct dir;
571 + struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
572 +
573 + if (read_cache_unmerged())
574 + die("you need to resolve your current index first");
575 +
576 + fd = hold_locked_index(lock_file, 1);
577 +
578 + memset(&trees, 0, sizeof(trees));
579 + memset(&opts, 0, sizeof(opts));
580 + memset(&t, 0, sizeof(t));
581 + dir.show_ignored = 1;
582 + dir.exclude_per_dir = ".gitignore";
583 + opts.dir = &dir;
584 +
585 + opts.head_idx = 1;
586 + opts.src_index = &the_index;
587 + opts.dst_index = &the_index;
588 + opts.update = 1;
589 + opts.verbose_update = 1;
590 + opts.merge = 1;
591 + opts.fn = twoway_merge;
592 +
593 + trees[nr_trees] = parse_tree_indirect(head);
594 + if (!trees[nr_trees++])
595 + return -1;
596 + trees[nr_trees] = parse_tree_indirect(remote);
597 + if (!trees[nr_trees++])
598 + return -1;
599 + for (i = 0; i < nr_trees; i++) {
600 + parse_tree(trees[i]);
601 + init_tree_desc(t+i, trees[i]->buffer, trees[i]->size);
602 + }
603 + if (unpack_trees(nr_trees, t, &opts))
604 + return -1;
605 + if (write_cache(fd, active_cache, active_nr) ||
606 + commit_locked_index(lock_file))
607 + die("unable to write new index file");
608 + return 0;
609 +}
610 +
611 +static void split_merge_strategies(const char *string, struct strategy **list,
612 + int *nr, int *alloc)
613 +{
614 + char *p, *q, *buf;
615 +
616 + if (!string)
617 + return;
618 +
619 + buf = xstrdup(string);
620 + q = buf;
621 + for (;;) {
622 + p = strchr(q, ' ');
623 + if (!p) {
624 + ALLOC_GROW(*list, *nr + 1, *alloc);
625 + (*list)[(*nr)++].name = xstrdup(q);
626 + free(buf);
627 + return;
628 + } else {
629 + *p = '\0';
630 + ALLOC_GROW(*list, *nr + 1, *alloc);
631 + (*list)[(*nr)++].name = xstrdup(q);
632 + q = ++p;
633 + }
634 + }
635 +}
636 +
637 +static void add_strategies(const char *string, unsigned attr)
638 +{
639 + struct strategy *list = NULL;
640 + int list_alloc = 0, list_nr = 0, i;
641 +
642 + memset(&list, 0, sizeof(list));
643 + split_merge_strategies(string, &list, &list_nr, &list_alloc);
644 + if (list != NULL) {
645 + for (i = 0; i < list_nr; i++) {
646 + struct strategy *s;
647 +
648 + s = get_strategy(list[i].name);
649 + if (s)
650 + append_strategy(s);
651 + }
652 + return;
653 + }
654 + for (i = 0; i < ARRAY_SIZE(all_strategy); i++)
655 + if (all_strategy[i].attr & attr)
656 + append_strategy(&all_strategy[i]);
657 +
658 +}
659 +
660 +static int merge_trivial(void)
661 +{
662 + unsigned char result_tree[20], result_commit[20];
663 + struct commit_list parent;
664 +
665 + write_tree_trivial(result_tree);
666 + printf("Wonderful.\n");
667 + parent.item = remoteheads->item;
668 + parent.next = NULL;
669 + commit_tree(merge_msg.buf, result_tree, &parent, result_commit);
670 + finish(result_commit, "In-index merge");
671 + drop_save();
672 + return 0;
673 +}
674 +
675 +static int finish_automerge(struct commit_list *common,
676 + unsigned char *result_tree,
677 + const char *wt_strategy)
678 +{
679 + struct commit_list *parents = NULL, *j;
680 + struct strbuf buf = STRBUF_INIT;
681 + unsigned char result_commit[20];
682 +
683 + free_commit_list(common);
684 + if (allow_fast_forward) {
685 + parents = remoteheads;
686 + commit_list_insert(lookup_commit(head), &parents);
687 + parents = reduce_heads(parents);
688 + } else {
689 + struct commit_list **pptr = &parents;
690 +
691 + pptr = &commit_list_insert(lookup_commit(head),
692 + pptr)->next;
693 + for (j = remoteheads; j; j = j->next)
694 + pptr = &commit_list_insert(j->item, pptr)->next;
695 + }
696 + free_commit_list(remoteheads);
697 + strbuf_addch(&merge_msg, '\n');
698 + commit_tree(merge_msg.buf, result_tree, parents, result_commit);
699 + strbuf_addf(&buf, "Merge made by %s.", wt_strategy);
700 + finish(result_commit, buf.buf);
701 + strbuf_release(&buf);
702 + drop_save();
703 + return 0;
704 +}
705 +
706 +static int suggest_conflicts(void)
707 +{
708 + FILE *fp;
709 + int pos;
710 +
711 + fp = fopen(git_path("MERGE_MSG"), "a");
712 + if (!fp)
713 + die("Could open %s for writing", git_path("MERGE_MSG"));
714 + fprintf(fp, "\nConflicts:\n");
715 + for (pos = 0; pos < active_nr; pos++) {
716 + struct cache_entry *ce = active_cache[pos];
717 +
718 + if (ce_stage(ce)) {
719 + fprintf(fp, "\t%s\n", ce->name);
720 + while (pos + 1 < active_nr &&
721 + !strcmp(ce->name,
722 + active_cache[pos + 1]->name))
723 + pos++;
724 + }
725 + }
726 + fclose(fp);
727 + rerere();
728 + printf("Automatic merge failed; "
729 + "fix conflicts and then commit the result.\n");
730 + return 1;
731 +}
732 +
733 +static struct commit *is_old_style_invocation(int argc, const char **argv)
734 +{
735 + struct commit *second_token = NULL;
736 + if (argc > 1) {
737 + unsigned char second_sha1[20];
738 +
739 + if (get_sha1(argv[1], second_sha1))
740 + return NULL;
741 + second_token = lookup_commit_reference_gently(second_sha1, 0);
742 + if (!second_token)
743 + die("'%s' is not a commit", argv[1]);
744 + if (hashcmp(second_token->object.sha1, head))
745 + return NULL;
746 + }
747 + return second_token;
748 +}
749 +
750 +static int evaluate_result(void)
751 +{
752 + int cnt = 0;
753 + struct rev_info rev;
754 +
755 + if (read_cache() < 0)
756 + die("failed to read the cache");
757 +
758 + /* Check how many files differ. */
759 + init_revisions(&rev, "");
760 + setup_revisions(0, NULL, &rev, NULL);
761 + rev.diffopt.output_format |=
762 + DIFF_FORMAT_CALLBACK;
763 + rev.diffopt.format_callback = count_diff_files;
764 + rev.diffopt.format_callback_data = &cnt;
765 + run_diff_files(&rev, 0);
766 +
767 + /*
768 + * Check how many unmerged entries are
769 + * there.
770 + */
771 + cnt += count_unmerged_entries();
772 +
773 + return cnt;
774 +}
775 +
776 +int cmd_merge(int argc, const char **argv, const char *prefix)
777 +{
778 + unsigned char result_tree[20];
779 + struct strbuf buf;
780 + const char *head_arg;
781 + int flag, head_invalid = 0, i;
782 + int best_cnt = -1, merge_was_ok = 0, automerge_was_ok = 0;
783 + struct commit_list *common = NULL;
784 + const char *best_strategy = NULL, *wt_strategy = NULL;
785 + struct commit_list **remotes = &remoteheads;
786 +
787 + setup_work_tree();
788 + if (unmerged_cache())
789 + die("You are in the middle of a conflicted merge.");
790 +
791 + /*
792 + * Check if we are _not_ on a detached HEAD, i.e. if there is a
793 + * current branch.
794 + */
795 + branch = resolve_ref("HEAD", head, 0, &flag);
796 + if (branch && !prefixcmp(branch, "refs/heads/"))
797 + branch += 11;
798 + if (is_null_sha1(head))
799 + head_invalid = 1;
800 +
801 + git_config(git_merge_config, NULL);
802 +
803 + /* for color.ui */
804 + if (diff_use_color_default == -1)
805 + diff_use_color_default = git_use_color_default;
806 +
807 + argc = parse_options(argc, argv, builtin_merge_options,
808 + builtin_merge_usage, 0);
809 +
810 + if (squash) {
811 + if (!allow_fast_forward)
812 + die("You cannot combine --squash with --no-ff.");
813 + option_commit = 0;
814 + }
815 +
816 + if (!argc)
817 + usage_with_options(builtin_merge_usage,
818 + builtin_merge_options);
819 +
820 + /*
821 + * This could be traditional "merge <msg> HEAD <commit>..." and
822 + * the way we can tell it is to see if the second token is HEAD,
823 + * but some people might have misused the interface and used a
824 + * committish that is the same as HEAD there instead.
825 + * Traditional format never would have "-m" so it is an
826 + * additional safety measure to check for it.
827 + */
828 + strbuf_init(&buf, 0);
829 +
830 + if (!have_message && is_old_style_invocation(argc, argv)) {
831 + strbuf_addstr(&merge_msg, argv[0]);
832 + head_arg = argv[1];
833 + argv += 2;
834 + argc -= 2;
835 + } else if (head_invalid) {
836 + struct object *remote_head;
837 + /*
838 + * If the merged head is a valid one there is no reason
839 + * to forbid "git merge" into a branch yet to be born.
840 + * We do the same for "git pull".
841 + */
842 + if (argc != 1)
843 + die("Can merge only exactly one commit into "
844 + "empty head");
845 + remote_head = peel_to_type(argv[0], 0, NULL, OBJ_COMMIT);
846 + if (!remote_head)
847 + die("%s - not something we can merge", argv[0]);
848 + update_ref("initial pull", "HEAD", remote_head->sha1, NULL, 0,
849 + DIE_ON_ERR);
850 + reset_hard(remote_head->sha1, 0);
851 + return 0;
852 + } else {
853 + struct strbuf msg;
854 +
855 + /* We are invoked directly as the first-class UI. */
856 + head_arg = "HEAD";
857 +
858 + /*
859 + * All the rest are the commits being merged;
860 + * prepare the standard merge summary message to
861 + * be appended to the given message. If remote
862 + * is invalid we will die later in the common
863 + * codepath so we discard the error in this
864 + * loop.
865 + */
866 + strbuf_init(&msg, 0);
867 + for (i = 0; i < argc; i++)
868 + merge_name(argv[i], &msg);
869 + fmt_merge_msg(option_log, &msg, &merge_msg);
870 + if (merge_msg.len)
871 + strbuf_setlen(&merge_msg, merge_msg.len-1);
872 + }
873 +
874 + if (head_invalid || !argc)
875 + usage_with_options(builtin_merge_usage,
876 + builtin_merge_options);
877 +
878 + strbuf_addstr(&buf, "merge");
879 + for (i = 0; i < argc; i++)
880 + strbuf_addf(&buf, " %s", argv[i]);
881 + setenv("GIT_REFLOG_ACTION", buf.buf, 0);
882 + strbuf_reset(&buf);
883 +
884 + for (i = 0; i < argc; i++) {
885 + struct object *o;
886 +
887 + o = peel_to_type(argv[i], 0, NULL, OBJ_COMMIT);
888 + if (!o)
889 + die("%s - not something we can merge", argv[i]);
890 + remotes = &commit_list_insert(lookup_commit(o->sha1),
891 + remotes)->next;
892 +
893 + strbuf_addf(&buf, "GITHEAD_%s", sha1_to_hex(o->sha1));
894 + setenv(buf.buf, argv[i], 1);
895 + strbuf_reset(&buf);
896 + }
897 +
898 + if (!use_strategies) {
899 + if (!remoteheads->next)
900 + add_strategies(pull_twohead, DEFAULT_TWOHEAD);
901 + else
902 + add_strategies(pull_octopus, DEFAULT_OCTOPUS);
903 + }
904 +
905 + for (i = 0; i < use_strategies_nr; i++) {
906 + if (use_strategies[i]->attr & NO_FAST_FORWARD)
907 + allow_fast_forward = 0;
908 + if (use_strategies[i]->attr & NO_TRIVIAL)
909 + allow_trivial = 0;
910 + }
911 +
912 + if (!remoteheads->next)
913 + common = get_merge_bases(lookup_commit(head),
914 + remoteheads->item, 1);
915 + else {
916 + struct commit_list *list = remoteheads;
917 + commit_list_insert(lookup_commit(head), &list);
918 + common = get_octopus_merge_bases(list);
919 + free(list);
920 + }
921 +
922 + update_ref("updating ORIG_HEAD", "ORIG_HEAD", head, NULL, 0,
923 + DIE_ON_ERR);
924 +
925 + if (!common)
926 + ; /* No common ancestors found. We need a real merge. */
927 + else if (!remoteheads->next && !common->next &&
928 + common->item == remoteheads->item) {
929 + /*
930 + * If head can reach all the merge then we are up to date.
931 + * but first the most common case of merging one remote.
932 + */
933 + finish_up_to_date("Already up-to-date.");
934 + return 0;
935 + } else if (allow_fast_forward && !remoteheads->next &&
936 + !common->next &&
937 + !hashcmp(common->item->object.sha1, head)) {
938 + /* Again the most common case of merging one remote. */
939 + struct strbuf msg;
940 + struct object *o;
941 + char hex[41];
942 +
943 + strcpy(hex, find_unique_abbrev(head, DEFAULT_ABBREV));
944 +
945 + printf("Updating %s..%s\n",
946 + hex,
947 + find_unique_abbrev(remoteheads->item->object.sha1,
948 + DEFAULT_ABBREV));
949 + refresh_cache(REFRESH_QUIET);
950 + strbuf_init(&msg, 0);
951 + strbuf_addstr(&msg, "Fast forward");
952 + if (have_message)
953 + strbuf_addstr(&msg,
954 + " (no commit created; -m option ignored)");
955 + o = peel_to_type(sha1_to_hex(remoteheads->item->object.sha1),
956 + 0, NULL, OBJ_COMMIT);
957 + if (!o)
958 + return 1;
959 +
960 + if (checkout_fast_forward(head, remoteheads->item->object.sha1))
961 + return 1;
962 +
963 + finish(o->sha1, msg.buf);
964 + drop_save();
965 + return 0;
966 + } else if (!remoteheads->next && common->next)
967 + ;
968 + /*
969 + * We are not doing octopus and not fast forward. Need
970 + * a real merge.
971 + */
972 + else if (!remoteheads->next && !common->next && option_commit) {
973 + /*
974 + * We are not doing octopus, not fast forward, and have
975 + * only one common.
976 + */
977 + refresh_cache(REFRESH_QUIET);
978 + if (allow_trivial) {
979 + /* See if it is really trivial. */
980 + git_committer_info(IDENT_ERROR_ON_NO_NAME);
981 + printf("Trying really trivial in-index merge...\n");
982 + if (!read_tree_trivial(common->item->object.sha1,
983 + head, remoteheads->item->object.sha1))
984 + return merge_trivial();
985 + printf("Nope.\n");
986 + }
987 + } else {
988 + /*
989 + * An octopus. If we can reach all the remote we are up
990 + * to date.
991 + */
992 + int up_to_date = 1;
993 + struct commit_list *j;
994 +
995 + for (j = remoteheads; j; j = j->next) {
996 + struct commit_list *common_one;
997 +
998 + /*
999 + * Here we *have* to calculate the individual
1000 + * merge_bases again, otherwise "git merge HEAD^
1001 + * HEAD^^" would be missed.
1002 + */
1003 + common_one = get_merge_bases(lookup_commit(head),
1004 + j->item, 1);
1005 + if (hashcmp(common_one->item->object.sha1,
1006 + j->item->object.sha1)) {
1007 + up_to_date = 0;
1008 + break;
1009 + }
1010 + }
1011 + if (up_to_date) {
1012 + finish_up_to_date("Already up-to-date. Yeeah!");
1013 + return 0;
1014 + }
1015 + }
1016 +
1017 + /* We are going to make a new commit. */
1018 + git_committer_info(IDENT_ERROR_ON_NO_NAME);
1019 +
1020 + /*
1021 + * At this point, we need a real merge. No matter what strategy
1022 + * we use, it would operate on the index, possibly affecting the
1023 + * working tree, and when resolved cleanly, have the desired
1024 + * tree in the index -- this means that the index must be in
1025 + * sync with the head commit. The strategies are responsible
1026 + * to ensure this.
1027 + */
1028 + if (use_strategies_nr != 1) {
1029 + /*
1030 + * Stash away the local changes so that we can try more
1031 + * than one.
1032 + */
1033 + save_state();
1034 + } else {
1035 + memcpy(stash, null_sha1, 20);
1036 + }
1037 +
1038 + for (i = 0; i < use_strategies_nr; i++) {
1039 + int ret;
1040 + if (i) {
1041 + printf("Rewinding the tree to pristine...\n");
1042 + restore_state();
1043 + }
1044 + if (use_strategies_nr != 1)
1045 + printf("Trying merge strategy %s...\n",
1046 + use_strategies[i]->name);
1047 + /*
1048 + * Remember which strategy left the state in the working
1049 + * tree.
1050 + */
1051 + wt_strategy = use_strategies[i]->name;
1052 +
1053 + ret = try_merge_strategy(use_strategies[i]->name,
1054 + common, head_arg);
1055 + if (!option_commit && !ret) {
1056 + merge_was_ok = 1;
1057 + /*
1058 + * This is necessary here just to avoid writing
1059 + * the tree, but later we will *not* exit with
1060 + * status code 1 because merge_was_ok is set.
1061 + */
1062 + ret = 1;
1063 + }
1064 +
1065 + if (ret) {
1066 + /*
1067 + * The backend exits with 1 when conflicts are
1068 + * left to be resolved, with 2 when it does not
1069 + * handle the given merge at all.
1070 + */
1071 + if (ret == 1) {
1072 + int cnt = evaluate_result();
1073 +
1074 + if (best_cnt <= 0 || cnt <= best_cnt) {
1075 + best_strategy = use_strategies[i]->name;
1076 + best_cnt = cnt;
1077 + }
1078 + }
1079 + if (merge_was_ok)
1080 + break;
1081 + else
1082 + continue;
1083 + }
1084 +
1085 + /* Automerge succeeded. */
1086 + write_tree_trivial(result_tree);
1087 + automerge_was_ok = 1;
1088 + break;
1089 + }
1090 +
1091 + /*
1092 + * If we have a resulting tree, that means the strategy module
1093 + * auto resolved the merge cleanly.
1094 + */
1095 + if (automerge_was_ok)
1096 + return finish_automerge(common, result_tree, wt_strategy);
1097 +
1098 + /*
1099 + * Pick the result from the best strategy and have the user fix
1100 + * it up.
1101 + */
1102 + if (!best_strategy) {
1103 + restore_state();
1104 + if (use_strategies_nr > 1)
1105 + fprintf(stderr,
1106 + "No merge strategy handled the merge.\n");
1107 + else
1108 + fprintf(stderr, "Merge with strategy %s failed.\n",
1109 + use_strategies[0]->name);
1110 + return 2;
1111 + } else if (best_strategy == wt_strategy)
1112 + ; /* We already have its result in the working tree. */
1113 + else {
1114 + printf("Rewinding the tree to pristine...\n");
1115 + restore_state();
1116 + printf("Using the %s to prepare resolving by hand.\n",
1117 + best_strategy);
1118 + try_merge_strategy(best_strategy, common, head_arg);
1119 + }
1120 +
1121 + if (squash)
1122 + finish(NULL, NULL);
1123 + else {
1124 + int fd;
1125 + struct commit_list *j;
1126 +
1127 + for (j = remoteheads; j; j = j->next)
1128 + strbuf_addf(&buf, "%s\n",
1129 + sha1_to_hex(j->item->object.sha1));
1130 + fd = open(git_path("MERGE_HEAD"), O_WRONLY | O_CREAT, 0666);
1131 + if (fd < 0)
1132 + die("Could open %s for writing",
1133 + git_path("MERGE_HEAD"));
1134 + if (write_in_full(fd, buf.buf, buf.len) != buf.len)
1135 + die("Could not write to %s", git_path("MERGE_HEAD"));
1136 + close(fd);
1137 + strbuf_addch(&merge_msg, '\n');
1138 + fd = open(git_path("MERGE_MSG"), O_WRONLY | O_CREAT, 0666);
1139 + if (fd < 0)
1140 + die("Could open %s for writing", git_path("MERGE_MSG"));
1141 + if (write_in_full(fd, merge_msg.buf, merge_msg.len) !=
1142 + merge_msg.len)
1143 + die("Could not write to %s", git_path("MERGE_MSG"));
1144 + close(fd);
1145 + }
1146 +
1147 + if (merge_was_ok) {
1148 + fprintf(stderr, "Automatic merge went well; "
1149 + "stopped before committing as requested\n");
1150 + return 0;
1151 + } else
1152 + return suggest_conflicts();
1153 +}
builtin.h
+1
@@ -64,6 +64,7 @@ extern int cmd_ls_tree(int argc, const char **argv, const char *prefix);
64 extern int cmd_ls_remote(int argc, const char **argv, const char *prefix);
65 extern int cmd_mailinfo(int argc, const char **argv, const char *prefix);
66 extern int cmd_mailsplit(int argc, const char **argv, const char *prefix);
67 +extern int cmd_merge(int argc, const char **argv, const char *prefix);
68 extern int cmd_merge_base(int argc, const char **argv, const char *prefix);
69 extern int cmd_merge_ours(int argc, const char **argv, const char *prefix);
70 extern int cmd_merge_file(int argc, const char **argv, const char *prefix);
contrib/examples/git-merge.sh renamed
git.c
+1
@@ -271,6 +271,7 @@ static void handle_internal_command(int argc, const char **argv)
271 { "ls-remote", cmd_ls_remote },
272 { "mailinfo", cmd_mailinfo },
273 { "mailsplit", cmd_mailsplit },
274 + { "merge", cmd_merge, RUN_SETUP | NEED_WORK_TREE },
275 { "merge-base", cmd_merge_base, RUN_SETUP },
276 { "merge-file", cmd_merge_file },
277 { "merge-ours", cmd_merge_ours, RUN_SETUP },
t/t7602-merge-octopus-many.sh
+1 -1
@@ -23,7 +23,7 @@ test_expect_success 'setup' '
23 done
24 '
25
26 -test_expect_failure 'merge c1 with c2, c3, c4, ... c29' '
26 +test_expect_success 'merge c1 with c2, c3, c4, ... c29' '
27 git reset --hard c1 &&
28 i=2 &&
29 refs="" &&