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