Coverage Report

Created: 2024-09-08 06:24

/src/git/diff-merges.c
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
}