20
20
#include "prompt.h"
21
21
#include "tree.h"
22
22
23
- static void init_color (struct repository * r , struct add_i_state * s ,
23
+ static void init_color (struct repository * r , int use_color ,
24
24
const char * section_and_slot , char * dst ,
25
25
const char * default_color )
26
26
{
27
27
char * key = xstrfmt ("color.%s" , section_and_slot );
28
28
const char * value ;
29
29
30
- if (!s -> use_color )
30
+ if (!use_color )
31
31
dst [0 ] = '\0' ;
32
32
else if (repo_config_get_value (r , key , & value ) ||
33
33
color_parse (value , dst ))
@@ -36,42 +36,63 @@ static void init_color(struct repository *r, struct add_i_state *s,
36
36
free (key );
37
37
}
38
38
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 )
41
40
{
42
41
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 );
43
56
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
+ {
44
63
s -> r = r ;
45
64
s -> context = -1 ;
46
65
s -> interhunkcontext = -1 ;
47
66
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" );
65
86
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 );
75
96
76
97
FREE_AND_NULL (s -> interactive_diff_filter );
77
98
repo_config_get_string (r , "interactive.difffilter" ,
@@ -109,7 +130,8 @@ void clear_add_i_state(struct add_i_state *s)
109
130
FREE_AND_NULL (s -> interactive_diff_filter );
110
131
FREE_AND_NULL (s -> interactive_diff_algorithm );
111
132
memset (s , 0 , sizeof (* s ));
112
- s -> use_color = -1 ;
133
+ s -> use_color_interactive = -1 ;
134
+ s -> use_color_diff = -1 ;
113
135
}
114
136
115
137
/*
@@ -1188,9 +1210,9 @@ int run_add_i(struct repository *r, const struct pathspec *ps,
1188
1210
* When color was asked for, use the prompt color for
1189
1211
* highlighting, otherwise use square brackets.
1190
1212
*/
1191
- if (s .use_color ) {
1213
+ if (s .use_color_interactive ) {
1192
1214
data .color = s .prompt_color ;
1193
- data .reset = s .reset_color ;
1215
+ data .reset = s .reset_color_interactive ;
1194
1216
}
1195
1217
print_file_item_data .color = data .color ;
1196
1218
print_file_item_data .reset = data .reset ;
0 commit comments