Stephen Boyd | c2e86ad | 2011-03-22 00:51:05 -0700 | [diff] [blame] | 1 | #include "builtin.h" |
Elijah Newren | 6c6ddf9 | 2023-04-11 03:00:39 +0000 | [diff] [blame] | 2 | #include "advice.h" |
Elijah Newren | f394e09 | 2023-03-21 06:25:54 +0000 | [diff] [blame] | 3 | #include "gettext.h" |
Elijah Newren | d1cbe1e | 2023-04-22 20:17:20 +0000 | [diff] [blame] | 4 | #include "hash.h" |
Daniel Barkalow | e1b3a2c | 2008-02-07 11:40:05 -0500 | [diff] [blame] | 5 | #include "merge-recursive.h" |
Elijah Newren | dabab1d | 2023-04-11 00:41:49 -0700 | [diff] [blame] | 6 | #include "object-name.h" |
Elijah Newren | d1cbe1e | 2023-04-22 20:17:20 +0000 | [diff] [blame] | 7 | #include "repository.h" |
Johannes Schindelin | 6d297f8 | 2006-07-08 18:42:41 +0200 | [diff] [blame] | 8 | |
Thiago Farina | e78d01b | 2010-08-30 00:30:22 -0300 | [diff] [blame] | 9 | static const char builtin_merge_recursive_usage[] = |
| 10 | "git %s <base>... -- <head> <remote> ..."; |
| 11 | |
Jeff King | d64bb06 | 2019-01-11 17:16:55 -0500 | [diff] [blame] | 12 | static char *better_branch_name(const char *branch) |
Shawn O. Pearce | 7ba3c07 | 2006-12-28 02:35:20 -0500 | [diff] [blame] | 13 | { |
brian m. carlson | b7f20f7 | 2018-07-16 01:28:04 +0000 | [diff] [blame] | 14 | static char githead_env[8 + GIT_MAX_HEXSZ + 1]; |
Shawn O. Pearce | 7ba3c07 | 2006-12-28 02:35:20 -0500 | [diff] [blame] | 15 | char *name; |
| 16 | |
brian m. carlson | b7f20f7 | 2018-07-16 01:28:04 +0000 | [diff] [blame] | 17 | if (strlen(branch) != the_hash_algo->hexsz) |
Jeff King | d64bb06 | 2019-01-11 17:16:55 -0500 | [diff] [blame] | 18 | return xstrdup(branch); |
Jeff King | 5096d49 | 2015-09-24 17:06:08 -0400 | [diff] [blame] | 19 | xsnprintf(githead_env, sizeof(githead_env), "GITHEAD_%s", branch); |
Shawn O. Pearce | 7ba3c07 | 2006-12-28 02:35:20 -0500 | [diff] [blame] | 20 | name = getenv(githead_env); |
Jeff King | d64bb06 | 2019-01-11 17:16:55 -0500 | [diff] [blame] | 21 | return xstrdup(name ? name : branch); |
Shawn O. Pearce | 7ba3c07 | 2006-12-28 02:35:20 -0500 | [diff] [blame] | 22 | } |
| 23 | |
Jeff King | 5247b76 | 2023-03-28 16:56:55 -0400 | [diff] [blame] | 24 | int cmd_merge_recursive(int argc, const char **argv, const char *prefix UNUSED) |
Johannes Schindelin | 6d297f8 | 2006-07-08 18:42:41 +0200 | [diff] [blame] | 25 | { |
brian m. carlson | 4e8161a | 2016-06-24 23:09:28 +0000 | [diff] [blame] | 26 | const struct object_id *bases[21]; |
Stephan Beyer | 73118f8 | 2008-08-12 22:13:59 +0200 | [diff] [blame] | 27 | unsigned bases_count = 0; |
| 28 | int i, failed; |
brian m. carlson | 4e8161a | 2016-06-24 23:09:28 +0000 | [diff] [blame] | 29 | struct object_id h1, h2; |
Miklos Vajna | 8a2fce1 | 2008-08-25 16:25:57 +0200 | [diff] [blame] | 30 | struct merge_options o; |
Jeff King | d64bb06 | 2019-01-11 17:16:55 -0500 | [diff] [blame] | 31 | char *better1, *better2; |
Miklos Vajna | 8a2fce1 | 2008-08-25 16:25:57 +0200 | [diff] [blame] | 32 | struct commit *result; |
Johannes Schindelin | 6d297f8 | 2006-07-08 18:42:41 +0200 | [diff] [blame] | 33 | |
Nguyễn Thái Ngọc Duy | 0d6caa2 | 2019-01-12 09:13:29 +0700 | [diff] [blame] | 34 | init_merge_options(&o, the_repository); |
Christian Couder | 5955654 | 2013-11-30 21:55:40 +0100 | [diff] [blame] | 35 | if (argv[0] && ends_with(argv[0], "-subtree")) |
Junio C Hamano | 85e51b7 | 2008-06-30 22:18:57 -0700 | [diff] [blame] | 36 | o.subtree_shift = ""; |
Junio C Hamano | 68faf68 | 2007-02-15 16:32:45 -0800 | [diff] [blame] | 37 | |
Johannes Schindelin | 6d297f8 | 2006-07-08 18:42:41 +0200 | [diff] [blame] | 38 | if (argc < 4) |
Thiago Farina | e78d01b | 2010-08-30 00:30:22 -0300 | [diff] [blame] | 39 | usagef(builtin_merge_recursive_usage, argv[0]); |
Johannes Schindelin | 6d297f8 | 2006-07-08 18:42:41 +0200 | [diff] [blame] | 40 | |
Johannes Schindelin | 6d297f8 | 2006-07-08 18:42:41 +0200 | [diff] [blame] | 41 | for (i = 1; i < argc; ++i) { |
Avery Pennarun | 8cc5b29 | 2009-11-25 21:23:55 -0500 | [diff] [blame] | 42 | const char *arg = argv[i]; |
| 43 | |
Christian Couder | 5955654 | 2013-11-30 21:55:40 +0100 | [diff] [blame] | 44 | if (starts_with(arg, "--")) { |
Avery Pennarun | 8cc5b29 | 2009-11-25 21:23:55 -0500 | [diff] [blame] | 45 | if (!arg[2]) |
| 46 | break; |
Jonathan Nieder | 635a7bb | 2010-08-26 00:47:58 -0500 | [diff] [blame] | 47 | if (parse_merge_opt(&o, arg + 2)) |
Vasco Almeida | ccf7813 | 2016-09-15 14:59:01 +0000 | [diff] [blame] | 48 | die(_("unknown option %s"), arg); |
Avery Pennarun | 8cc5b29 | 2009-11-25 21:23:55 -0500 | [diff] [blame] | 49 | continue; |
| 50 | } |
Miklos Vajna | 8a2fce1 | 2008-08-25 16:25:57 +0200 | [diff] [blame] | 51 | if (bases_count < ARRAY_SIZE(bases)-1) { |
brian m. carlson | 4e8161a | 2016-06-24 23:09:28 +0000 | [diff] [blame] | 52 | struct object_id *oid = xmalloc(sizeof(struct object_id)); |
Ævar Arnfjörð Bjarmason | d850b7a | 2023-03-28 15:58:46 +0200 | [diff] [blame] | 53 | if (repo_get_oid(the_repository, argv[i], oid)) |
Vasco Almeida | ccf7813 | 2016-09-15 14:59:01 +0000 | [diff] [blame] | 54 | die(_("could not parse object '%s'"), argv[i]); |
brian m. carlson | 4e8161a | 2016-06-24 23:09:28 +0000 | [diff] [blame] | 55 | bases[bases_count++] = oid; |
Stephan Beyer | 73118f8 | 2008-08-12 22:13:59 +0200 | [diff] [blame] | 56 | } |
Stephan Beyer | 73118f8 | 2008-08-12 22:13:59 +0200 | [diff] [blame] | 57 | else |
Vasco Almeida | ccf7813 | 2016-09-15 14:59:01 +0000 | [diff] [blame] | 58 | warning(Q_("cannot handle more than %d base. " |
| 59 | "Ignoring %s.", |
| 60 | "cannot handle more than %d bases. " |
| 61 | "Ignoring %s.", |
Ævar Arnfjörð Bjarmason | 6f69325 | 2022-03-07 16:27:07 +0100 | [diff] [blame] | 62 | ARRAY_SIZE(bases)-1), |
Johannes Schindelin | b74d779 | 2009-05-23 10:04:51 +0200 | [diff] [blame] | 63 | (int)ARRAY_SIZE(bases)-1, argv[i]); |
Johannes Schindelin | 6d297f8 | 2006-07-08 18:42:41 +0200 | [diff] [blame] | 64 | } |
| 65 | if (argc - i != 3) /* "--" "<head>" "<remote>" */ |
Vasco Almeida | ccf7813 | 2016-09-15 14:59:01 +0000 | [diff] [blame] | 66 | die(_("not handling anything other than two heads merge.")); |
Johannes Schindelin | 6d297f8 | 2006-07-08 18:42:41 +0200 | [diff] [blame] | 67 | |
Elijah Newren | 9822175 | 2019-08-17 11:41:28 -0700 | [diff] [blame] | 68 | if (repo_read_index_unmerged(the_repository)) |
| 69 | die_resolve_conflict("merge"); |
| 70 | |
Miklos Vajna | 8a2fce1 | 2008-08-25 16:25:57 +0200 | [diff] [blame] | 71 | o.branch1 = argv[++i]; |
| 72 | o.branch2 = argv[++i]; |
Johannes Schindelin | 6d297f8 | 2006-07-08 18:42:41 +0200 | [diff] [blame] | 73 | |
Ævar Arnfjörð Bjarmason | d850b7a | 2023-03-28 15:58:46 +0200 | [diff] [blame] | 74 | if (repo_get_oid(the_repository, o.branch1, &h1)) |
Vasco Almeida | ccf7813 | 2016-09-15 14:59:01 +0000 | [diff] [blame] | 75 | die(_("could not resolve ref '%s'"), o.branch1); |
Ævar Arnfjörð Bjarmason | d850b7a | 2023-03-28 15:58:46 +0200 | [diff] [blame] | 76 | if (repo_get_oid(the_repository, o.branch2, &h2)) |
Vasco Almeida | ccf7813 | 2016-09-15 14:59:01 +0000 | [diff] [blame] | 77 | die(_("could not resolve ref '%s'"), o.branch2); |
Johannes Schindelin | 6d297f8 | 2006-07-08 18:42:41 +0200 | [diff] [blame] | 78 | |
Jeff King | d64bb06 | 2019-01-11 17:16:55 -0500 | [diff] [blame] | 79 | o.branch1 = better1 = better_branch_name(o.branch1); |
| 80 | o.branch2 = better2 = better_branch_name(o.branch2); |
Shawn O. Pearce | 3f6ee2d | 2007-01-14 00:28:58 -0500 | [diff] [blame] | 81 | |
Miklos Vajna | 8a2fce1 | 2008-08-25 16:25:57 +0200 | [diff] [blame] | 82 | if (o.verbosity >= 3) |
Vasco Almeida | 765773c | 2016-09-15 14:59:02 +0000 | [diff] [blame] | 83 | printf(_("Merging %s with %s\n"), o.branch1, o.branch2); |
Shawn O. Pearce | e0ec181 | 2006-12-23 03:44:47 -0500 | [diff] [blame] | 84 | |
brian m. carlson | 4e8161a | 2016-06-24 23:09:28 +0000 | [diff] [blame] | 85 | failed = merge_recursive_generic(&o, &h1, &h2, bases_count, bases, &result); |
Jeff King | d64bb06 | 2019-01-11 17:16:55 -0500 | [diff] [blame] | 86 | |
| 87 | free(better1); |
| 88 | free(better2); |
| 89 | |
Stephan Beyer | 73118f8 | 2008-08-12 22:13:59 +0200 | [diff] [blame] | 90 | if (failed < 0) |
| 91 | return 128; /* die() error code */ |
| 92 | return failed; |
Johannes Schindelin | 6d297f8 | 2006-07-08 18:42:41 +0200 | [diff] [blame] | 93 | } |