]> git.ipfire.org Git - thirdparty/git.git/blame - diff-merges.c
advice: add enum variants for missing advice variables
[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;
19b2517f 9static int suppress_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;
09322b1d
SO
20}
21
3d2b5f2f
SO
22static void set_separate(struct rev_info *revs)
23{
24 suppress(revs);
25 revs->separate_merges = 1;
26}
27
8c0ba528
SO
28static void set_first_parent(struct rev_info *revs)
29{
30 set_separate(revs);
31 revs->first_parent_merges = 1;
32}
33
3d2b5f2f
SO
34static void set_combined(struct rev_info *revs)
35{
255a4dac 36 suppress(revs);
3d2b5f2f
SO
37 revs->combine_merges = 1;
38 revs->dense_combined_merges = 0;
39}
40
3b6c17b5
SO
41static void set_dense_combined(struct rev_info *revs)
42{
255a4dac 43 suppress(revs);
3b6c17b5
SO
44 revs->combine_merges = 1;
45 revs->dense_combined_merges = 1;
46}
47
26a0f58d 48static diff_merges_setup_func_t func_by_opt(const char *optarg)
3d2b5f2f 49{
26a0f58d
SO
50 if (!strcmp(optarg, "off") || !strcmp(optarg, "none"))
51 return suppress;
388091fe 52 if (!strcmp(optarg, "1") || !strcmp(optarg, "first-parent"))
26a0f58d 53 return set_first_parent;
38fc4dbb 54 else if (!strcmp(optarg, "separate"))
26a0f58d 55 return set_separate;
5071c753 56 else if (!strcmp(optarg, "c") || !strcmp(optarg, "combined"))
26a0f58d 57 return set_combined;
5071c753 58 else if (!strcmp(optarg, "cc") || !strcmp(optarg, "dense-combined"))
26a0f58d 59 return set_dense_combined;
38fc4dbb 60 else if (!strcmp(optarg, "m") || !strcmp(optarg, "on"))
26a0f58d
SO
61 return set_to_default;
62 return NULL;
63}
64
65static void set_diff_merges(struct rev_info *revs, const char *optarg)
66{
67 diff_merges_setup_func_t func = func_by_opt(optarg);
68
69 if (!func)
3d2b5f2f 70 die(_("unknown value for --diff-merges: %s"), optarg);
a6d19ecc 71
26a0f58d
SO
72 func(revs);
73
74 /* NOTE: the merges_need_diff flag is cleared by func() call */
75 if (func != suppress)
76 revs->merges_need_diff = 1;
3d2b5f2f 77}
3b6c17b5 78
564a4fc8
SO
79/*
80 * Public functions. They are in the order they are called.
81 */
82
17c13e60
SO
83int diff_merges_config(const char *value)
84{
85 diff_merges_setup_func_t func = func_by_opt(value);
86
87 if (!func)
88 return -1;
89
90 set_to_default = func;
91 return 0;
92}
93
19b2517f
SO
94void diff_merges_suppress_options_parsing(void)
95{
96 suppress_parsing = 1;
97}
98
18f09473 99int diff_merges_parse_opts(struct rev_info *revs, const char **argv)
a37eec63
SO
100{
101 int argcount = 1;
102 const char *optarg;
103 const char *arg = argv[0];
104
19b2517f
SO
105 if (suppress_parsing)
106 return 0;
107
5733b20f 108 if (!strcmp(arg, "-m")) {
19b2517f 109 set_to_default(revs);
5733b20f 110 } else if (!strcmp(arg, "-c")) {
3d2b5f2f 111 set_combined(revs);
fd16a399 112 revs->merges_imply_patch = 1;
5733b20f 113 } else if (!strcmp(arg, "--cc")) {
3b6c17b5 114 set_dense_combined(revs);
fd16a399 115 revs->merges_imply_patch = 1;
5733b20f 116 } else if (!strcmp(arg, "--no-diff-merges")) {
09322b1d 117 suppress(revs);
5733b20f 118 } else if (!strcmp(arg, "--combined-all-paths")) {
a37eec63 119 revs->combined_all_paths = 1;
5733b20f 120 } else if ((argcount = parse_long_opt("diff-merges", argv, &optarg))) {
3d2b5f2f 121 set_diff_merges(revs, optarg);
5733b20f 122 } else
1a2c4d80 123 return 0;
a37eec63 124
1a2c4d80 125 revs->explicit_diff_merges = 1;
a37eec63
SO
126 return argcount;
127}
128
09322b1d
SO
129void diff_merges_suppress(struct rev_info *revs)
130{
131 suppress(revs);
132}
133
4f54544d 134void diff_merges_default_to_first_parent(struct rev_info *revs)
a37eec63 135{
1a2c4d80
SO
136 if (!revs->explicit_diff_merges)
137 revs->separate_merges = 1;
138 if (revs->separate_merges)
3291eea3 139 revs->first_parent_merges = 1;
a37eec63
SO
140}
141
18f09473 142void diff_merges_default_to_dense_combined(struct rev_info *revs)
a37eec63 143{
1a2c4d80
SO
144 if (!revs->explicit_diff_merges)
145 set_dense_combined(revs);
a37eec63 146}
564a4fc8 147
3b6c17b5
SO
148void diff_merges_set_dense_combined_if_unset(struct rev_info *revs)
149{
150 if (!revs->combine_merges)
151 set_dense_combined(revs);
152}
153
564a4fc8
SO
154void diff_merges_setup_revs(struct rev_info *revs)
155{
19b2517f
SO
156 if (suppress_parsing)
157 return;
158
1a2c4d80
SO
159 if (revs->combine_merges == 0)
160 revs->dense_combined_merges = 0;
161 if (revs->separate_merges == 0)
162 revs->first_parent_merges = 0;
564a4fc8
SO
163 if (revs->combined_all_paths && !revs->combine_merges)
164 die("--combined-all-paths makes no sense without -c or --cc");
fd16a399 165 if (revs->merges_imply_patch)
e121b4b8 166 revs->diff = 1;
fd16a399 167 if (revs->merges_imply_patch || revs->merges_need_diff) {
0c627f5d
SO
168 if (!revs->diffopt.output_format)
169 revs->diffopt.output_format = DIFF_FORMAT_PATCH;
170 }
564a4fc8 171}