]> git.ipfire.org Git - thirdparty/git.git/blame - diff-merges.c
diff-merges: introduce revs->first_parent_merges flag
[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{
7 revs->ignore_merges = 1;
8 revs->first_parent_merges = 0;
9 revs->combine_merges = 0;
10 revs->dense_combined_merges = 0;
11}
12
3b6c17b5
SO
13static void set_dense_combined(struct rev_info *revs)
14{
15 revs->combine_merges = 1;
16 revs->dense_combined_merges = 1;
17}
18
19
564a4fc8
SO
20/*
21 * Public functions. They are in the order they are called.
22 */
23
18f09473 24void diff_merges_init_revs(struct rev_info *revs)
a37eec63
SO
25{
26 revs->ignore_merges = -1;
27}
28
18f09473 29int diff_merges_parse_opts(struct rev_info *revs, const char **argv)
a37eec63
SO
30{
31 int argcount = 1;
32 const char *optarg;
33 const char *arg = argv[0];
34
35 if (!strcmp(arg, "-m")) {
36 /*
37 * To "diff-index", "-m" means "match missing", and to the "log"
38 * family of commands, it means "show full diff for merges". Set
39 * both fields appropriately.
40 */
41 revs->ignore_merges = 0;
42 revs->match_missing = 1;
43 } else if (!strcmp(arg, "-c")) {
44 revs->diff = 1;
45 revs->dense_combined_merges = 0;
46 revs->combine_merges = 1;
47 } else if (!strcmp(arg, "--cc")) {
48 revs->diff = 1;
3b6c17b5 49 set_dense_combined(revs);
a37eec63 50 } else if (!strcmp(arg, "--no-diff-merges")) {
09322b1d 51 suppress(revs);
a37eec63
SO
52 } else if (!strcmp(arg, "--combined-all-paths")) {
53 revs->diff = 1;
54 revs->combined_all_paths = 1;
55 } else if ((argcount = parse_long_opt("diff-merges", argv, &optarg))) {
56 if (!strcmp(optarg, "off")) {
09322b1d 57 suppress(revs);
a37eec63
SO
58 } else {
59 die(_("unknown value for --diff-merges: %s"), optarg);
60 }
61 } else
62 argcount = 0;
63
64 return argcount;
65}
66
09322b1d
SO
67void diff_merges_suppress(struct rev_info *revs)
68{
69 suppress(revs);
70}
71
4f54544d 72void diff_merges_default_to_first_parent(struct rev_info *revs)
a37eec63 73{
7acf0d06 74 if (revs->ignore_merges < 0) /* No -m */
a37eec63 75 revs->ignore_merges = 0;
3291eea3
SO
76 if (!revs->combine_merges) /* No -c/--cc" */
77 revs->first_parent_merges = 1;
a37eec63
SO
78}
79
18f09473 80void diff_merges_default_to_dense_combined(struct rev_info *revs)
a37eec63 81{
7acf0d06 82 if (revs->ignore_merges < 0) { /* No -m */
a37eec63 83 revs->ignore_merges = 0;
7acf0d06 84 if (!revs->combine_merges) { /* No -c/--cc" */
a37eec63
SO
85 revs->combine_merges = 1;
86 revs->dense_combined_merges = 1;
87 }
88 }
89}
564a4fc8 90
3b6c17b5
SO
91void diff_merges_set_dense_combined_if_unset(struct rev_info *revs)
92{
93 if (!revs->combine_merges)
94 set_dense_combined(revs);
95}
96
564a4fc8
SO
97void diff_merges_setup_revs(struct rev_info *revs)
98{
99 if (revs->combine_merges && revs->ignore_merges < 0)
100 revs->ignore_merges = 0;
101 if (revs->ignore_merges < 0)
102 revs->ignore_merges = 1;
103 if (revs->combined_all_paths && !revs->combine_merges)
104 die("--combined-all-paths makes no sense without -c or --cc");
105}