22
33#include "revision.h"
44
5+ typedef void (* diff_merges_setup_func_t )(struct rev_info * );
6+ static void set_separate (struct rev_info * revs );
7+
8+ static diff_merges_setup_func_t set_to_default = set_separate ;
9+
510static void suppress (struct rev_info * revs )
611{
712 revs -> separate_merges = 0 ;
@@ -29,10 +34,10 @@ static void set_m(struct rev_info *revs)
2934{
3035 /*
3136 * To "diff-index", "-m" means "match missing", and to the "log"
32- * family of commands, it means "show full diff for merges". Set
37+ * family of commands, it means "show default diff for merges". Set
3338 * both fields appropriately.
3439 */
35- set_separate (revs );
40+ set_to_default (revs );
3641 revs -> match_missing = 1 ;
3742}
3843
@@ -50,33 +55,52 @@ static void set_dense_combined(struct rev_info *revs)
5055 revs -> dense_combined_merges = 1 ;
5156}
5257
53- static void set_diff_merges ( struct rev_info * revs , const char * optarg )
58+ static diff_merges_setup_func_t func_by_opt ( const char * optarg )
5459{
55- if (!strcmp (optarg , "off" ) || !strcmp (optarg , "none" )) {
56- suppress (revs );
57- /* Return early to leave revs->merges_need_diff unset */
58- return ;
59- }
60-
60+ if (!strcmp (optarg , "off" ) || !strcmp (optarg , "none" ))
61+ return suppress ;
6162 if (!strcmp (optarg , "1" ) || !strcmp (optarg , "first-parent" ))
62- set_first_parent ( revs ) ;
63- else if (!strcmp (optarg , "m" ) || ! strcmp ( optarg , " separate" ))
64- set_separate ( revs ) ;
63+ return set_first_parent ;
64+ else if (!strcmp (optarg , "separate" ))
65+ return set_separate ;
6566 else if (!strcmp (optarg , "c" ) || !strcmp (optarg , "combined" ))
66- set_combined ( revs ) ;
67+ return set_combined ;
6768 else if (!strcmp (optarg , "cc" ) || !strcmp (optarg , "dense-combined" ))
68- set_dense_combined (revs );
69- else
69+ return set_dense_combined ;
70+ else if (!strcmp (optarg , "m" ) || !strcmp (optarg , "on" ))
71+ return set_to_default ;
72+ return NULL ;
73+ }
74+
75+ static void set_diff_merges (struct rev_info * revs , const char * optarg )
76+ {
77+ diff_merges_setup_func_t func = func_by_opt (optarg );
78+
79+ if (!func )
7080 die (_ ("unknown value for --diff-merges: %s" ), optarg );
7181
72- /* The flag is cleared by set_xxx() functions, so don't move this up */
73- revs -> merges_need_diff = 1 ;
82+ func (revs );
83+
84+ /* NOTE: the merges_need_diff flag is cleared by func() call */
85+ if (func != suppress )
86+ revs -> merges_need_diff = 1 ;
7487}
7588
7689/*
7790 * Public functions. They are in the order they are called.
7891 */
7992
93+ int diff_merges_config (const char * value )
94+ {
95+ diff_merges_setup_func_t func = func_by_opt (value );
96+
97+ if (!func )
98+ return -1 ;
99+
100+ set_to_default = func ;
101+ return 0 ;
102+ }
103+
80104int diff_merges_parse_opts (struct rev_info * revs , const char * * argv )
81105{
82106 int argcount = 1 ;
0 commit comments