]> git.ipfire.org Git - thirdparty/git.git/blame - diff-merges.c
Merge branch 'jk/mailmap-only-at-root'
[thirdparty/git.git] / diff-merges.c
CommitLineData
a37eec63
SO
1#include "diff-merges.h"
2
3#include "revision.h"
4
09322b1d
SO
5static void suppress(struct rev_info *revs)
6{
1a2c4d80 7 revs->separate_merges = 0;
09322b1d
SO
8 revs->first_parent_merges = 0;
9 revs->combine_merges = 0;
10 revs->dense_combined_merges = 0;
255a4dac 11 revs->combined_all_paths = 0;
5733b20f 12 revs->combined_imply_patch = 0;
a6d19ecc 13 revs->merges_need_diff = 0;
09322b1d
SO
14}
15
3d2b5f2f
SO
16static void set_separate(struct rev_info *revs)
17{
18 suppress(revs);
19 revs->separate_merges = 1;
20}
21
8c0ba528
SO
22static void set_first_parent(struct rev_info *revs)
23{
24 set_separate(revs);
25 revs->first_parent_merges = 1;
26}
27
3d2b5f2f
SO
28static void set_m(struct rev_info *revs)
29{
30 /*
31 * To "diff-index", "-m" means "match missing", and to the "log"
32 * family of commands, it means "show full diff for merges". Set
33 * both fields appropriately.
34 */
35 set_separate(revs);
36 revs->match_missing = 1;
37}
38
39static void set_combined(struct rev_info *revs)
40{
255a4dac 41 suppress(revs);
3d2b5f2f
SO
42 revs->combine_merges = 1;
43 revs->dense_combined_merges = 0;
44}
45
3b6c17b5
SO
46static void set_dense_combined(struct rev_info *revs)
47{
255a4dac 48 suppress(revs);
3b6c17b5
SO
49 revs->combine_merges = 1;
50 revs->dense_combined_merges = 1;
51}
52
3d2b5f2f
SO
53static void set_diff_merges(struct rev_info *revs, const char *optarg)
54{
a6d19ecc 55 if (!strcmp(optarg, "off") || !strcmp(optarg, "none")) {
3d2b5f2f 56 suppress(revs);
a6d19ecc
SO
57 /* Return early to leave revs->merges_need_diff unset */
58 return;
59 }
60
388091fe 61 if (!strcmp(optarg, "1") || !strcmp(optarg, "first-parent"))
8c0ba528 62 set_first_parent(revs);
5071c753 63 else if (!strcmp(optarg, "m") || !strcmp(optarg, "separate"))
8c0ba528 64 set_separate(revs);
5071c753 65 else if (!strcmp(optarg, "c") || !strcmp(optarg, "combined"))
8c0ba528 66 set_combined(revs);
5071c753 67 else if (!strcmp(optarg, "cc") || !strcmp(optarg, "dense-combined"))
8c0ba528
SO
68 set_dense_combined(revs);
69 else
3d2b5f2f 70 die(_("unknown value for --diff-merges: %s"), optarg);
a6d19ecc
SO
71
72 /* The flag is cleared by set_xxx() functions, so don't move this up */
73 revs->merges_need_diff = 1;
3d2b5f2f 74}
3b6c17b5 75
564a4fc8
SO
76/*
77 * Public functions. They are in the order they are called.
78 */
79
18f09473 80int diff_merges_parse_opts(struct rev_info *revs, const char **argv)
a37eec63
SO
81{
82 int argcount = 1;
83 const char *optarg;
84 const char *arg = argv[0];
85
5733b20f 86 if (!strcmp(arg, "-m")) {
3d2b5f2f 87 set_m(revs);
5733b20f 88 } else if (!strcmp(arg, "-c")) {
3d2b5f2f 89 set_combined(revs);
5733b20f
SO
90 revs->combined_imply_patch = 1;
91 } else if (!strcmp(arg, "--cc")) {
3b6c17b5 92 set_dense_combined(revs);
5733b20f
SO
93 revs->combined_imply_patch = 1;
94 } else if (!strcmp(arg, "--no-diff-merges")) {
09322b1d 95 suppress(revs);
5733b20f 96 } else if (!strcmp(arg, "--combined-all-paths")) {
a37eec63 97 revs->combined_all_paths = 1;
5733b20f 98 } else if ((argcount = parse_long_opt("diff-merges", argv, &optarg))) {
3d2b5f2f 99 set_diff_merges(revs, optarg);
5733b20f 100 } else
1a2c4d80 101 return 0;
a37eec63 102
1a2c4d80 103 revs->explicit_diff_merges = 1;
a37eec63
SO
104 return argcount;
105}
106
09322b1d
SO
107void diff_merges_suppress(struct rev_info *revs)
108{
109 suppress(revs);
110}
111
4f54544d 112void diff_merges_default_to_first_parent(struct rev_info *revs)
a37eec63 113{
1a2c4d80
SO
114 if (!revs->explicit_diff_merges)
115 revs->separate_merges = 1;
116 if (revs->separate_merges)
3291eea3 117 revs->first_parent_merges = 1;
a37eec63
SO
118}
119
18f09473 120void diff_merges_default_to_dense_combined(struct rev_info *revs)
a37eec63 121{
1a2c4d80
SO
122 if (!revs->explicit_diff_merges)
123 set_dense_combined(revs);
a37eec63 124}
564a4fc8 125
3b6c17b5
SO
126void diff_merges_set_dense_combined_if_unset(struct rev_info *revs)
127{
128 if (!revs->combine_merges)
129 set_dense_combined(revs);
130}
131
564a4fc8
SO
132void diff_merges_setup_revs(struct rev_info *revs)
133{
1a2c4d80
SO
134 if (revs->combine_merges == 0)
135 revs->dense_combined_merges = 0;
136 if (revs->separate_merges == 0)
137 revs->first_parent_merges = 0;
564a4fc8
SO
138 if (revs->combined_all_paths && !revs->combine_merges)
139 die("--combined-all-paths makes no sense without -c or --cc");
a6d19ecc 140 if (revs->combined_imply_patch)
e121b4b8 141 revs->diff = 1;
a6d19ecc 142 if (revs->combined_imply_patch || revs->merges_need_diff) {
0c627f5d
SO
143 if (!revs->diffopt.output_format)
144 revs->diffopt.output_format = DIFF_FORMAT_PATCH;
145 }
564a4fc8 146}