@@ -570,14 +570,18 @@ static void check_blank_at_eof(mmfile_t *mf1, mmfile_t *mf2,
570
570
ecbdata -> blank_at_eof_in_postimage = (at - l2 ) + 1 ;
571
571
}
572
572
573
- static void emit_line_0 (struct diff_options * o , const char * set , const char * reset ,
573
+ static void emit_line_0 (struct diff_options * o ,
574
+ const char * set , unsigned reverse , const char * reset ,
574
575
int first , const char * line , int len )
575
576
{
576
577
int has_trailing_newline , has_trailing_carriage_return ;
577
578
int nofirst ;
578
579
FILE * file = o -> file ;
579
580
580
- fputs (diff_line_prefix (o ), file );
581
+ if (first )
582
+ fputs (diff_line_prefix (o ), file );
583
+ else if (!len )
584
+ return ;
581
585
582
586
if (len == 0 ) {
583
587
has_trailing_newline = (first == '\n' );
@@ -595,8 +599,10 @@ static void emit_line_0(struct diff_options *o, const char *set, const char *res
595
599
}
596
600
597
601
if (len || !nofirst ) {
602
+ if (reverse && want_color (o -> use_color ))
603
+ fputs (GIT_COLOR_REVERSE , file );
598
604
fputs (set , file );
599
- if (!nofirst )
605
+ if (first && !nofirst )
600
606
fputc (first , file );
601
607
fwrite (line , len , 1 , file );
602
608
fputs (reset , file );
@@ -610,7 +616,7 @@ static void emit_line_0(struct diff_options *o, const char *set, const char *res
610
616
static void emit_line (struct diff_options * o , const char * set , const char * reset ,
611
617
const char * line , int len )
612
618
{
613
- emit_line_0 (o , set , reset , line [0 ], line + 1 , len - 1 );
619
+ emit_line_0 (o , set , 0 , reset , line [0 ], line + 1 , len - 1 );
614
620
}
615
621
616
622
enum diff_symbol {
@@ -970,7 +976,8 @@ static void dim_moved_lines(struct diff_options *o)
970
976
971
977
static void emit_line_ws_markup (struct diff_options * o ,
972
978
const char * set , const char * reset ,
973
- const char * line , int len , char sign ,
979
+ const char * line , int len ,
980
+ const char * set_sign , char sign ,
974
981
unsigned ws_rule , int blank_at_eof )
975
982
{
976
983
const char * ws = NULL ;
@@ -981,14 +988,20 @@ static void emit_line_ws_markup(struct diff_options *o,
981
988
ws = NULL ;
982
989
}
983
990
984
- if (!ws )
985
- emit_line_0 (o , set , reset , sign , line , len );
986
- else if (blank_at_eof )
991
+ if (!ws && !set_sign )
992
+ emit_line_0 (o , set , 0 , reset , sign , line , len );
993
+ else if (!ws ) {
994
+ /* Emit just the prefix, then the rest. */
995
+ emit_line_0 (o , set_sign ? set_sign : set , !!set_sign , reset ,
996
+ sign , "" , 0 );
997
+ emit_line_0 (o , set , 0 , reset , 0 , line , len );
998
+ } else if (blank_at_eof )
987
999
/* Blank line at EOF - paint '+' as well */
988
- emit_line_0 (o , ws , reset , sign , line , len );
1000
+ emit_line_0 (o , ws , 0 , reset , sign , line , len );
989
1001
else {
990
1002
/* Emit just the prefix, then the rest. */
991
- emit_line_0 (o , set , reset , sign , "" , 0 );
1003
+ emit_line_0 (o , set_sign ? set_sign : set , !!set_sign , reset ,
1004
+ sign , "" , 0 );
992
1005
ws_check_emit (line , len , ws_rule ,
993
1006
o -> file , set , reset , ws );
994
1007
}
@@ -998,7 +1011,7 @@ static void emit_diff_symbol_from_struct(struct diff_options *o,
998
1011
struct emitted_diff_symbol * eds )
999
1012
{
1000
1013
static const char * nneof = " No newline at end of file\n" ;
1001
- const char * context , * reset , * set , * meta , * fraginfo ;
1014
+ const char * context , * reset , * set , * set_sign , * meta , * fraginfo ;
1002
1015
struct strbuf sb = STRBUF_INIT ;
1003
1016
1004
1017
enum diff_symbol s = eds -> s ;
@@ -1011,7 +1024,7 @@ static void emit_diff_symbol_from_struct(struct diff_options *o,
1011
1024
context = diff_get_color_opt (o , DIFF_CONTEXT );
1012
1025
reset = diff_get_color_opt (o , DIFF_RESET );
1013
1026
putc ('\n' , o -> file );
1014
- emit_line_0 (o , context , reset , '\\' ,
1027
+ emit_line_0 (o , context , 0 , reset , '\\' ,
1015
1028
nneof , strlen (nneof ));
1016
1029
break ;
1017
1030
case DIFF_SYMBOL_SUBMODULE_HEADER :
@@ -1038,7 +1051,18 @@ static void emit_diff_symbol_from_struct(struct diff_options *o,
1038
1051
case DIFF_SYMBOL_CONTEXT :
1039
1052
set = diff_get_color_opt (o , DIFF_CONTEXT );
1040
1053
reset = diff_get_color_opt (o , DIFF_RESET );
1041
- emit_line_ws_markup (o , set , reset , line , len , ' ' ,
1054
+ set_sign = NULL ;
1055
+ if (o -> flags .dual_color_diffed_diffs ) {
1056
+ char c = !len ? 0 : line [0 ];
1057
+
1058
+ if (c == '+' )
1059
+ set = diff_get_color_opt (o , DIFF_FILE_NEW );
1060
+ else if (c == '@' )
1061
+ set = diff_get_color_opt (o , DIFF_FRAGINFO );
1062
+ else if (c == '-' )
1063
+ set = diff_get_color_opt (o , DIFF_FILE_OLD );
1064
+ }
1065
+ emit_line_ws_markup (o , set , reset , line , len , set_sign , ' ' ,
1042
1066
flags & (DIFF_SYMBOL_CONTENT_WS_MASK ), 0 );
1043
1067
break ;
1044
1068
case DIFF_SYMBOL_PLUS :
@@ -1065,7 +1089,20 @@ static void emit_diff_symbol_from_struct(struct diff_options *o,
1065
1089
set = diff_get_color_opt (o , DIFF_FILE_NEW );
1066
1090
}
1067
1091
reset = diff_get_color_opt (o , DIFF_RESET );
1068
- emit_line_ws_markup (o , set , reset , line , len , '+' ,
1092
+ if (!o -> flags .dual_color_diffed_diffs )
1093
+ set_sign = NULL ;
1094
+ else {
1095
+ char c = !len ? 0 : line [0 ];
1096
+
1097
+ set_sign = set ;
1098
+ if (c == '-' )
1099
+ set = diff_get_color_opt (o , DIFF_FILE_OLD );
1100
+ else if (c == '@' )
1101
+ set = diff_get_color_opt (o , DIFF_FRAGINFO );
1102
+ else if (c != '+' )
1103
+ set = diff_get_color_opt (o , DIFF_CONTEXT );
1104
+ }
1105
+ emit_line_ws_markup (o , set , reset , line , len , set_sign , '+' ,
1069
1106
flags & DIFF_SYMBOL_CONTENT_WS_MASK ,
1070
1107
flags & DIFF_SYMBOL_CONTENT_BLANK_LINE_EOF );
1071
1108
break ;
@@ -1093,7 +1130,20 @@ static void emit_diff_symbol_from_struct(struct diff_options *o,
1093
1130
set = diff_get_color_opt (o , DIFF_FILE_OLD );
1094
1131
}
1095
1132
reset = diff_get_color_opt (o , DIFF_RESET );
1096
- emit_line_ws_markup (o , set , reset , line , len , '-' ,
1133
+ if (!o -> flags .dual_color_diffed_diffs )
1134
+ set_sign = NULL ;
1135
+ else {
1136
+ char c = !len ? 0 : line [0 ];
1137
+
1138
+ set_sign = set ;
1139
+ if (c == '+' )
1140
+ set = diff_get_color_opt (o , DIFF_FILE_NEW );
1141
+ else if (c == '@' )
1142
+ set = diff_get_color_opt (o , DIFF_FRAGINFO );
1143
+ else if (c != '-' )
1144
+ set = diff_get_color_opt (o , DIFF_CONTEXT );
1145
+ }
1146
+ emit_line_ws_markup (o , set , reset , line , len , set_sign , '-' ,
1097
1147
flags & DIFF_SYMBOL_CONTENT_WS_MASK , 0 );
1098
1148
break ;
1099
1149
case DIFF_SYMBOL_WORDS_PORCELAIN :
@@ -1284,6 +1334,7 @@ static void emit_hunk_header(struct emit_callback *ecbdata,
1284
1334
const char * frag = diff_get_color (ecbdata -> color_diff , DIFF_FRAGINFO );
1285
1335
const char * func = diff_get_color (ecbdata -> color_diff , DIFF_FUNCINFO );
1286
1336
const char * reset = diff_get_color (ecbdata -> color_diff , DIFF_RESET );
1337
+ const char * reverse = ecbdata -> color_diff ? GIT_COLOR_REVERSE : "" ;
1287
1338
static const char atat [2 ] = { '@' , '@' };
1288
1339
const char * cp , * ep ;
1289
1340
struct strbuf msgbuf = STRBUF_INIT ;
@@ -1304,6 +1355,8 @@ static void emit_hunk_header(struct emit_callback *ecbdata,
1304
1355
ep += 2 ; /* skip over @@ */
1305
1356
1306
1357
/* The hunk header in fraginfo color */
1358
+ if (ecbdata -> opt -> flags .dual_color_diffed_diffs )
1359
+ strbuf_addstr (& msgbuf , reverse );
1307
1360
strbuf_addstr (& msgbuf , frag );
1308
1361
strbuf_add (& msgbuf , line , ep - line );
1309
1362
strbuf_addstr (& msgbuf , reset );
0 commit comments