]>
Commit | Line | Data |
---|---|---|
1 | #include "cache.h" | |
2 | #include "commit.h" | |
3 | #include "tag.h" | |
4 | #include "merge-recursive.h" | |
5 | #include "xdiff-interface.h" | |
6 | ||
7 | static const char builtin_merge_recursive_usage[] = | |
8 | "git %s <base>... -- <head> <remote> ..."; | |
9 | ||
10 | static const char *better_branch_name(const char *branch) | |
11 | { | |
12 | static char githead_env[8 + 40 + 1]; | |
13 | char *name; | |
14 | ||
15 | if (strlen(branch) != 40) | |
16 | return branch; | |
17 | sprintf(githead_env, "GITHEAD_%s", branch); | |
18 | name = getenv(githead_env); | |
19 | return name ? name : branch; | |
20 | } | |
21 | ||
22 | int cmd_merge_recursive(int argc, const char **argv, const char *prefix) | |
23 | { | |
24 | const unsigned char *bases[21]; | |
25 | unsigned bases_count = 0; | |
26 | int i, failed; | |
27 | unsigned char h1[20], h2[20]; | |
28 | struct merge_options o; | |
29 | struct commit *result; | |
30 | ||
31 | init_merge_options(&o); | |
32 | if (argv[0] && !suffixcmp(argv[0], "-subtree")) | |
33 | o.subtree_shift = ""; | |
34 | ||
35 | if (argc < 4) | |
36 | usagef(builtin_merge_recursive_usage, argv[0]); | |
37 | ||
38 | for (i = 1; i < argc; ++i) { | |
39 | const char *arg = argv[i]; | |
40 | ||
41 | if (!prefixcmp(arg, "--")) { | |
42 | if (!arg[2]) | |
43 | break; | |
44 | if (parse_merge_opt(&o, arg + 2)) | |
45 | die("Unknown option %s", arg); | |
46 | continue; | |
47 | } | |
48 | if (bases_count < ARRAY_SIZE(bases)-1) { | |
49 | unsigned char *sha = xmalloc(20); | |
50 | if (get_sha1(argv[i], sha)) | |
51 | die("Could not parse object '%s'", argv[i]); | |
52 | bases[bases_count++] = sha; | |
53 | } | |
54 | else | |
55 | warning("Cannot handle more than %d bases. " | |
56 | "Ignoring %s.", | |
57 | (int)ARRAY_SIZE(bases)-1, argv[i]); | |
58 | } | |
59 | if (argc - i != 3) /* "--" "<head>" "<remote>" */ | |
60 | die("Not handling anything other than two heads merge."); | |
61 | ||
62 | o.branch1 = argv[++i]; | |
63 | o.branch2 = argv[++i]; | |
64 | ||
65 | if (get_sha1(o.branch1, h1)) | |
66 | die("Could not resolve ref '%s'", o.branch1); | |
67 | if (get_sha1(o.branch2, h2)) | |
68 | die("Could not resolve ref '%s'", o.branch2); | |
69 | ||
70 | o.branch1 = better_branch_name(o.branch1); | |
71 | o.branch2 = better_branch_name(o.branch2); | |
72 | ||
73 | if (o.verbosity >= 3) | |
74 | printf("Merging %s with %s\n", o.branch1, o.branch2); | |
75 | ||
76 | failed = merge_recursive_generic(&o, h1, h2, bases_count, bases, &result); | |
77 | if (failed < 0) | |
78 | return 128; /* die() error code */ | |
79 | return failed; | |
80 | } |