]> git.ipfire.org Git - thirdparty/git.git/blob - diff-merges.c
diff-merges: introduce revs->first_parent_merges flag
[thirdparty/git.git] / diff-merges.c
1 #include "diff-merges.h"
2
3 #include "revision.h"
4
5 static 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
13 static void set_dense_combined(struct rev_info *revs)
14 {
15 revs->combine_merges = 1;
16 revs->dense_combined_merges = 1;
17 }
18
19
20 /*
21 * Public functions. They are in the order they are called.
22 */
23
24 void diff_merges_init_revs(struct rev_info *revs)
25 {
26 revs->ignore_merges = -1;
27 }
28
29 int diff_merges_parse_opts(struct rev_info *revs, const char **argv)
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;
49 set_dense_combined(revs);
50 } else if (!strcmp(arg, "--no-diff-merges")) {
51 suppress(revs);
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")) {
57 suppress(revs);
58 } else {
59 die(_("unknown value for --diff-merges: %s"), optarg);
60 }
61 } else
62 argcount = 0;
63
64 return argcount;
65 }
66
67 void diff_merges_suppress(struct rev_info *revs)
68 {
69 suppress(revs);
70 }
71
72 void diff_merges_default_to_first_parent(struct rev_info *revs)
73 {
74 if (revs->ignore_merges < 0) /* No -m */
75 revs->ignore_merges = 0;
76 if (!revs->combine_merges) /* No -c/--cc" */
77 revs->first_parent_merges = 1;
78 }
79
80 void diff_merges_default_to_dense_combined(struct rev_info *revs)
81 {
82 if (revs->ignore_merges < 0) { /* No -m */
83 revs->ignore_merges = 0;
84 if (!revs->combine_merges) { /* No -c/--cc" */
85 revs->combine_merges = 1;
86 revs->dense_combined_merges = 1;
87 }
88 }
89 }
90
91 void diff_merges_set_dense_combined_if_unset(struct rev_info *revs)
92 {
93 if (!revs->combine_merges)
94 set_dense_combined(revs);
95 }
96
97 void 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 }