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