2020#include "prompt.h"
2121#include "tree.h"
2222
23- static void init_color (struct repository * r , struct add_i_state * s ,
23+ static void init_color (struct repository * r , int use_color ,
2424 const char * section_and_slot , char * dst ,
2525 const char * default_color )
2626{
2727 char * key = xstrfmt ("color.%s" , section_and_slot );
2828 const char * value ;
2929
30- if (!s -> use_color )
30+ if (!use_color )
3131 dst [0 ] = '\0' ;
3232 else if (repo_config_get_value (r , key , & value ) ||
3333 color_parse (value , dst ))
@@ -36,42 +36,63 @@ static void init_color(struct repository *r, struct add_i_state *s,
3636 free (key );
3737}
3838
39- void init_add_i_state (struct add_i_state * s , struct repository * r ,
40- struct add_p_opt * add_p_opt )
39+ static int check_color_config (struct repository * r , const char * var )
4140{
4241 const char * value ;
42+ int ret ;
43+
44+ if (repo_config_get_value (r , var , & value ))
45+ ret = -1 ;
46+ else
47+ ret = git_config_colorbool (var , value );
48+
49+ /*
50+ * Do not rely on want_color() to fall back to color.ui for us. It uses
51+ * the value parsed by git_color_config(), which may not have been
52+ * called by the main command.
53+ */
54+ if (ret < 0 && !repo_config_get_value (r , "color.ui" , & value ))
55+ ret = git_config_colorbool ("color.ui" , value );
4356
57+ return want_color (ret );
58+ }
59+
60+ void init_add_i_state (struct add_i_state * s , struct repository * r ,
61+ struct add_p_opt * add_p_opt )
62+ {
4463 s -> r = r ;
4564 s -> context = -1 ;
4665 s -> interhunkcontext = -1 ;
4766
48- if (repo_config_get_value (r , "color.interactive" , & value ))
49- s -> use_color = -1 ;
50- else
51- s -> use_color =
52- git_config_colorbool ("color.interactive" , value );
53- s -> use_color = want_color (s -> use_color );
54-
55- init_color (r , s , "interactive.header" , s -> header_color , GIT_COLOR_BOLD );
56- init_color (r , s , "interactive.help" , s -> help_color , GIT_COLOR_BOLD_RED );
57- init_color (r , s , "interactive.prompt" , s -> prompt_color ,
58- GIT_COLOR_BOLD_BLUE );
59- init_color (r , s , "interactive.error" , s -> error_color ,
60- GIT_COLOR_BOLD_RED );
61-
62- init_color (r , s , "diff.frag" , s -> fraginfo_color ,
63- diff_get_color (s -> use_color , DIFF_FRAGINFO ));
64- init_color (r , s , "diff.context" , s -> context_color , "fall back" );
67+ s -> use_color_interactive = check_color_config (r , "color.interactive" );
68+
69+ init_color (r , s -> use_color_interactive , "interactive.header" ,
70+ s -> header_color , GIT_COLOR_BOLD );
71+ init_color (r , s -> use_color_interactive , "interactive.help" ,
72+ s -> help_color , GIT_COLOR_BOLD_RED );
73+ init_color (r , s -> use_color_interactive , "interactive.prompt" ,
74+ s -> prompt_color , GIT_COLOR_BOLD_BLUE );
75+ init_color (r , s -> use_color_interactive , "interactive.error" ,
76+ s -> error_color , GIT_COLOR_BOLD_RED );
77+ strlcpy (s -> reset_color_interactive ,
78+ s -> use_color_interactive ? GIT_COLOR_RESET : "" , COLOR_MAXLEN );
79+
80+ s -> use_color_diff = check_color_config (r , "color.diff" );
81+
82+ init_color (r , s -> use_color_diff , "diff.frag" , s -> fraginfo_color ,
83+ diff_get_color (s -> use_color_diff , DIFF_FRAGINFO ));
84+ init_color (r , s -> use_color_diff , "diff.context" , s -> context_color ,
85+ "fall back" );
6586 if (!strcmp (s -> context_color , "fall back" ))
66- init_color (r , s , "diff.plain" , s -> context_color ,
67- diff_get_color ( s -> use_color , DIFF_CONTEXT ));
68- init_color ( r , s , "diff.old" , s -> file_old_color ,
69- diff_get_color ( s -> use_color , DIFF_FILE_OLD ));
70- init_color ( r , s , "diff.new" , s -> file_new_color ,
71- diff_get_color ( s -> use_color , DIFF_FILE_NEW ));
72-
73- strlcpy (s -> reset_color ,
74- s -> use_color ? GIT_COLOR_RESET : "" , COLOR_MAXLEN );
87+ init_color (r , s -> use_color_diff , "diff.plain" ,
88+ s -> context_color ,
89+ diff_get_color ( s -> use_color_diff , DIFF_CONTEXT ));
90+ init_color ( r , s -> use_color_diff , "diff.old" , s -> file_old_color ,
91+ diff_get_color ( s -> use_color_diff , DIFF_FILE_OLD ));
92+ init_color ( r , s -> use_color_diff , "diff.new" , s -> file_new_color ,
93+ diff_get_color ( s -> use_color_diff , DIFF_FILE_NEW ));
94+ strlcpy (s -> reset_color_diff ,
95+ s -> use_color_diff ? GIT_COLOR_RESET : "" , COLOR_MAXLEN );
7596
7697 FREE_AND_NULL (s -> interactive_diff_filter );
7798 repo_config_get_string (r , "interactive.difffilter" ,
@@ -109,7 +130,8 @@ void clear_add_i_state(struct add_i_state *s)
109130 FREE_AND_NULL (s -> interactive_diff_filter );
110131 FREE_AND_NULL (s -> interactive_diff_algorithm );
111132 memset (s , 0 , sizeof (* s ));
112- s -> use_color = -1 ;
133+ s -> use_color_interactive = -1 ;
134+ s -> use_color_diff = -1 ;
113135}
114136
115137/*
@@ -1188,9 +1210,9 @@ int run_add_i(struct repository *r, const struct pathspec *ps,
11881210 * When color was asked for, use the prompt color for
11891211 * highlighting, otherwise use square brackets.
11901212 */
1191- if (s .use_color ) {
1213+ if (s .use_color_interactive ) {
11921214 data .color = s .prompt_color ;
1193- data .reset = s .reset_color ;
1215+ data .reset = s .reset_color_interactive ;
11941216 }
11951217 print_file_item_data .color = data .color ;
11961218 print_file_item_data .reset = data .reset ;
0 commit comments