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