]> git.ipfire.org Git - thirdparty/git.git/blame - diff-merges.c
t3428: restore coverage for "apply" backend
[thirdparty/git.git] / diff-merges.c
CommitLineData
a37eec63
SO
1#include "diff-merges.h"
2
3#include "revision.h"
4
4320815e
SO
5typedef void (*diff_merges_setup_func_t)(struct rev_info *);
6static void set_separate(struct rev_info *revs);
7
8static diff_merges_setup_func_t set_to_default = set_separate;
5acffd34 9static int suppress_m_parsing;
4320815e 10
09322b1d
SO
11static void suppress(struct rev_info *revs)
12{
1a2c4d80 13 revs->separate_merges = 0;
09322b1d
SO
14 revs->first_parent_merges = 0;
15 revs->combine_merges = 0;
16 revs->dense_combined_merges = 0;
255a4dac 17 revs->combined_all_paths = 0;
fd16a399 18 revs->merges_imply_patch = 0;
a6d19ecc 19 revs->merges_need_diff = 0;
db757e8b 20 revs->remerge_diff = 0;
09322b1d
SO
21}
22
563005ec 23static void common_setup(struct rev_info *revs)
3d2b5f2f
SO
24{
25 suppress(revs);
563005ec
SO
26 revs->merges_need_diff = 1;
27}
28
29static void set_none(struct rev_info *revs)
30{
31 suppress(revs);
32}
33
34static void set_separate(struct rev_info *revs)
35{
36 common_setup(revs);
3d2b5f2f 37 revs->separate_merges = 1;
0dec322d 38 revs->simplify_history = 0;
3d2b5f2f
SO
39}
40
8c0ba528
SO
41static void set_first_parent(struct rev_info *revs)
42{
43 set_separate(revs);
44 revs->first_parent_merges = 1;
45}
46
3d2b5f2f
SO
47static void set_combined(struct rev_info *revs)
48{
563005ec 49 common_setup(revs);
3d2b5f2f
SO
50 revs->combine_merges = 1;
51 revs->dense_combined_merges = 0;
52}
53
3b6c17b5
SO
54static void set_dense_combined(struct rev_info *revs)
55{
563005ec 56 common_setup(revs);
3b6c17b5
SO
57 revs->combine_merges = 1;
58 revs->dense_combined_merges = 1;
59}
60
db757e8b
EN
61static void set_remerge_diff(struct rev_info *revs)
62{
563005ec 63 common_setup(revs);
db757e8b 64 revs->remerge_diff = 1;
0dec322d 65 revs->simplify_history = 0;
db757e8b
EN
66}
67
26a0f58d 68static diff_merges_setup_func_t func_by_opt(const char *optarg)
3d2b5f2f 69{
26a0f58d 70 if (!strcmp(optarg, "off") || !strcmp(optarg, "none"))
563005ec 71 return set_none;
388091fe 72 if (!strcmp(optarg, "1") || !strcmp(optarg, "first-parent"))
26a0f58d 73 return set_first_parent;
c7c4f760 74 if (!strcmp(optarg, "separate"))
26a0f58d 75 return set_separate;
c7c4f760 76 if (!strcmp(optarg, "c") || !strcmp(optarg, "combined"))
26a0f58d 77 return set_combined;
c7c4f760 78 if (!strcmp(optarg, "cc") || !strcmp(optarg, "dense-combined"))
26a0f58d 79 return set_dense_combined;
c7c4f760 80 if (!strcmp(optarg, "r") || !strcmp(optarg, "remerge"))
db757e8b 81 return set_remerge_diff;
c7c4f760 82 if (!strcmp(optarg, "m") || !strcmp(optarg, "on"))
26a0f58d
SO
83 return set_to_default;
84 return NULL;
85}
86
87static void set_diff_merges(struct rev_info *revs, const char *optarg)
88{
89 diff_merges_setup_func_t func = func_by_opt(optarg);
90
91 if (!func)
1a8aea85 92 die(_("invalid value for '%s': '%s'"), "--diff-merges", optarg);
a6d19ecc 93
26a0f58d 94 func(revs);
3d2b5f2f 95}
3b6c17b5 96
564a4fc8
SO
97/*
98 * Public functions. They are in the order they are called.
99 */
100
17c13e60
SO
101int diff_merges_config(const char *value)
102{
103 diff_merges_setup_func_t func = func_by_opt(value);
104
105 if (!func)
106 return -1;
107
108 set_to_default = func;
109 return 0;
110}
111
5acffd34 112void diff_merges_suppress_m_parsing(void)
19b2517f 113{
5acffd34 114 suppress_m_parsing = 1;
19b2517f
SO
115}
116
18f09473 117int diff_merges_parse_opts(struct rev_info *revs, const char **argv)
a37eec63
SO
118{
119 int argcount = 1;
120 const char *optarg;
121 const char *arg = argv[0];
122
5acffd34 123 if (!suppress_m_parsing && !strcmp(arg, "-m")) {
19b2517f 124 set_to_default(revs);
563005ec 125 revs->merges_need_diff = 0;
5733b20f 126 } else if (!strcmp(arg, "-c")) {
3d2b5f2f 127 set_combined(revs);
fd16a399 128 revs->merges_imply_patch = 1;
5733b20f 129 } else if (!strcmp(arg, "--cc")) {
3b6c17b5 130 set_dense_combined(revs);
fd16a399 131 revs->merges_imply_patch = 1;
db757e8b
EN
132 } else if (!strcmp(arg, "--remerge-diff")) {
133 set_remerge_diff(revs);
134 revs->merges_imply_patch = 1;
5733b20f 135 } else if (!strcmp(arg, "--no-diff-merges")) {
563005ec 136 set_none(revs);
5733b20f 137 } else if (!strcmp(arg, "--combined-all-paths")) {
a37eec63 138 revs->combined_all_paths = 1;
5733b20f 139 } else if ((argcount = parse_long_opt("diff-merges", argv, &optarg))) {
3d2b5f2f 140 set_diff_merges(revs, optarg);
5733b20f 141 } else
1a2c4d80 142 return 0;
a37eec63 143
1a2c4d80 144 revs->explicit_diff_merges = 1;
a37eec63
SO
145 return argcount;
146}
147
09322b1d
SO
148void diff_merges_suppress(struct rev_info *revs)
149{
563005ec 150 set_none(revs);
09322b1d
SO
151}
152
4f54544d 153void diff_merges_default_to_first_parent(struct rev_info *revs)
a37eec63 154{
1a2c4d80
SO
155 if (!revs->explicit_diff_merges)
156 revs->separate_merges = 1;
157 if (revs->separate_merges)
3291eea3 158 revs->first_parent_merges = 1;
a37eec63
SO
159}
160
18f09473 161void diff_merges_default_to_dense_combined(struct rev_info *revs)
a37eec63 162{
1a2c4d80
SO
163 if (!revs->explicit_diff_merges)
164 set_dense_combined(revs);
a37eec63 165}
564a4fc8 166
3b6c17b5
SO
167void diff_merges_set_dense_combined_if_unset(struct rev_info *revs)
168{
169 if (!revs->combine_merges)
170 set_dense_combined(revs);
171}
172
564a4fc8
SO
173void diff_merges_setup_revs(struct rev_info *revs)
174{
1a2c4d80
SO
175 if (revs->combine_merges == 0)
176 revs->dense_combined_merges = 0;
177 if (revs->separate_merges == 0)
178 revs->first_parent_merges = 0;
564a4fc8
SO
179 if (revs->combined_all_paths && !revs->combine_merges)
180 die("--combined-all-paths makes no sense without -c or --cc");
fd16a399 181 if (revs->merges_imply_patch)
e121b4b8 182 revs->diff = 1;
fd16a399 183 if (revs->merges_imply_patch || revs->merges_need_diff) {
0c627f5d
SO
184 if (!revs->diffopt.output_format)
185 revs->diffopt.output_format = DIFF_FORMAT_PATCH;
186 }
564a4fc8 187}