]> git.ipfire.org Git - thirdparty/git.git/blame - diff-merges.c
Git 2.35.8
[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;
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
5acffd34 94void diff_merges_suppress_m_parsing(void)
19b2517f 95{
5acffd34 96 suppress_m_parsing = 1;
19b2517f
SO
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
5acffd34 105 if (!suppress_m_parsing && !strcmp(arg, "-m")) {
19b2517f 106 set_to_default(revs);
5733b20f 107 } else if (!strcmp(arg, "-c")) {
3d2b5f2f 108 set_combined(revs);
fd16a399 109 revs->merges_imply_patch = 1;
5733b20f 110 } else if (!strcmp(arg, "--cc")) {
3b6c17b5 111 set_dense_combined(revs);
fd16a399 112 revs->merges_imply_patch = 1;
5733b20f 113 } else if (!strcmp(arg, "--no-diff-merges")) {
09322b1d 114 suppress(revs);
5733b20f 115 } else if (!strcmp(arg, "--combined-all-paths")) {
a37eec63 116 revs->combined_all_paths = 1;
5733b20f 117 } else if ((argcount = parse_long_opt("diff-merges", argv, &optarg))) {
3d2b5f2f 118 set_diff_merges(revs, optarg);
5733b20f 119 } else
1a2c4d80 120 return 0;
a37eec63 121
1a2c4d80 122 revs->explicit_diff_merges = 1;
a37eec63
SO
123 return argcount;
124}
125
09322b1d
SO
126void diff_merges_suppress(struct rev_info *revs)
127{
128 suppress(revs);
129}
130
4f54544d 131void diff_merges_default_to_first_parent(struct rev_info *revs)
a37eec63 132{
1a2c4d80
SO
133 if (!revs->explicit_diff_merges)
134 revs->separate_merges = 1;
135 if (revs->separate_merges)
3291eea3 136 revs->first_parent_merges = 1;
a37eec63
SO
137}
138
18f09473 139void diff_merges_default_to_dense_combined(struct rev_info *revs)
a37eec63 140{
1a2c4d80
SO
141 if (!revs->explicit_diff_merges)
142 set_dense_combined(revs);
a37eec63 143}
564a4fc8 144
3b6c17b5
SO
145void diff_merges_set_dense_combined_if_unset(struct rev_info *revs)
146{
147 if (!revs->combine_merges)
148 set_dense_combined(revs);
149}
150
564a4fc8
SO
151void diff_merges_setup_revs(struct rev_info *revs)
152{
1a2c4d80
SO
153 if (revs->combine_merges == 0)
154 revs->dense_combined_merges = 0;
155 if (revs->separate_merges == 0)
156 revs->first_parent_merges = 0;
564a4fc8
SO
157 if (revs->combined_all_paths && !revs->combine_merges)
158 die("--combined-all-paths makes no sense without -c or --cc");
fd16a399 159 if (revs->merges_imply_patch)
e121b4b8 160 revs->diff = 1;
fd16a399 161 if (revs->merges_imply_patch || revs->merges_need_diff) {
0c627f5d
SO
162 if (!revs->diffopt.output_format)
163 revs->diffopt.output_format = DIFF_FORMAT_PATCH;
164 }
564a4fc8 165}