@@ -562,14 +562,18 @@ static void check_blank_at_eof(mmfile_t *mf1, mmfile_t *mf2,
562
562
ecbdata -> blank_at_eof_in_postimage = (at - l2 ) + 1 ;
563
563
}
564
564
565
- static void emit_line_0 (struct diff_options * o , const char * set , const char * reset ,
565
+ static void emit_line_0 (struct diff_options * o ,
566
+ const char * set , unsigned reverse , const char * reset ,
566
567
int first , const char * line , int len )
567
568
{
568
569
int has_trailing_newline , has_trailing_carriage_return ;
569
570
int nofirst ;
570
571
FILE * file = o -> file ;
571
572
572
- fputs (diff_line_prefix (o ), file );
573
+ if (first )
574
+ fputs (diff_line_prefix (o ), file );
575
+ else if (!len )
576
+ return ;
573
577
574
578
if (len == 0 ) {
575
579
has_trailing_newline = (first == '\n' );
@@ -587,8 +591,10 @@ static void emit_line_0(struct diff_options *o, const char *set, const char *res
587
591
}
588
592
589
593
if (len || !nofirst ) {
594
+ if (reverse && want_color (o -> use_color ))
595
+ fputs (GIT_COLOR_REVERSE , file );
590
596
fputs (set , file );
591
- if (!nofirst )
597
+ if (first && !nofirst )
592
598
fputc (first , file );
593
599
fwrite (line , len , 1 , file );
594
600
fputs (reset , file );
@@ -602,7 +608,7 @@ static void emit_line_0(struct diff_options *o, const char *set, const char *res
602
608
static void emit_line (struct diff_options * o , const char * set , const char * reset ,
603
609
const char * line , int len )
604
610
{
605
- emit_line_0 (o , set , reset , line [0 ], line + 1 , len - 1 );
611
+ emit_line_0 (o , set , 0 , reset , line [0 ], line + 1 , len - 1 );
606
612
}
607
613
608
614
enum diff_symbol {
@@ -962,7 +968,8 @@ static void dim_moved_lines(struct diff_options *o)
962
968
963
969
static void emit_line_ws_markup (struct diff_options * o ,
964
970
const char * set , const char * reset ,
965
- const char * line , int len , char sign ,
971
+ const char * line , int len ,
972
+ const char * set_sign , char sign ,
966
973
unsigned ws_rule , int blank_at_eof )
967
974
{
968
975
const char * ws = NULL ;
@@ -973,14 +980,20 @@ static void emit_line_ws_markup(struct diff_options *o,
973
980
ws = NULL ;
974
981
}
975
982
976
- if (!ws )
977
- emit_line_0 (o , set , reset , sign , line , len );
978
- else if (blank_at_eof )
983
+ if (!ws && !set_sign )
984
+ emit_line_0 (o , set , 0 , reset , sign , line , len );
985
+ else if (!ws ) {
986
+ /* Emit just the prefix, then the rest. */
987
+ emit_line_0 (o , set_sign ? set_sign : set , !!set_sign , reset ,
988
+ sign , "" , 0 );
989
+ emit_line_0 (o , set , 0 , reset , 0 , line , len );
990
+ } else if (blank_at_eof )
979
991
/* Blank line at EOF - paint '+' as well */
980
- emit_line_0 (o , ws , reset , sign , line , len );
992
+ emit_line_0 (o , ws , 0 , reset , sign , line , len );
981
993
else {
982
994
/* Emit just the prefix, then the rest. */
983
- emit_line_0 (o , set , reset , sign , "" , 0 );
995
+ emit_line_0 (o , set_sign ? set_sign : set , !!set_sign , reset ,
996
+ sign , "" , 0 );
984
997
ws_check_emit (line , len , ws_rule ,
985
998
o -> file , set , reset , ws );
986
999
}
@@ -990,7 +1003,7 @@ static void emit_diff_symbol_from_struct(struct diff_options *o,
990
1003
struct emitted_diff_symbol * eds )
991
1004
{
992
1005
static const char * nneof = " No newline at end of file\n" ;
993
- const char * context , * reset , * set , * meta , * fraginfo ;
1006
+ const char * context , * reset , * set , * set_sign , * meta , * fraginfo ;
994
1007
struct strbuf sb = STRBUF_INIT ;
995
1008
996
1009
enum diff_symbol s = eds -> s ;
@@ -1003,7 +1016,7 @@ static void emit_diff_symbol_from_struct(struct diff_options *o,
1003
1016
context = diff_get_color_opt (o , DIFF_CONTEXT );
1004
1017
reset = diff_get_color_opt (o , DIFF_RESET );
1005
1018
putc ('\n' , o -> file );
1006
- emit_line_0 (o , context , reset , '\\' ,
1019
+ emit_line_0 (o , context , 0 , reset , '\\' ,
1007
1020
nneof , strlen (nneof ));
1008
1021
break ;
1009
1022
case DIFF_SYMBOL_SUBMODULE_HEADER :
@@ -1030,7 +1043,18 @@ static void emit_diff_symbol_from_struct(struct diff_options *o,
1030
1043
case DIFF_SYMBOL_CONTEXT :
1031
1044
set = diff_get_color_opt (o , DIFF_CONTEXT );
1032
1045
reset = diff_get_color_opt (o , DIFF_RESET );
1033
- emit_line_ws_markup (o , set , reset , line , len , ' ' ,
1046
+ set_sign = NULL ;
1047
+ if (o -> flags .dual_color_diffed_diffs ) {
1048
+ char c = !len ? 0 : line [0 ];
1049
+
1050
+ if (c == '+' )
1051
+ set = diff_get_color_opt (o , DIFF_FILE_NEW );
1052
+ else if (c == '@' )
1053
+ set = diff_get_color_opt (o , DIFF_FRAGINFO );
1054
+ else if (c == '-' )
1055
+ set = diff_get_color_opt (o , DIFF_FILE_OLD );
1056
+ }
1057
+ emit_line_ws_markup (o , set , reset , line , len , set_sign , ' ' ,
1034
1058
flags & (DIFF_SYMBOL_CONTENT_WS_MASK ), 0 );
1035
1059
break ;
1036
1060
case DIFF_SYMBOL_PLUS :
@@ -1057,7 +1081,20 @@ static void emit_diff_symbol_from_struct(struct diff_options *o,
1057
1081
set = diff_get_color_opt (o , DIFF_FILE_NEW );
1058
1082
}
1059
1083
reset = diff_get_color_opt (o , DIFF_RESET );
1060
- emit_line_ws_markup (o , set , reset , line , len , '+' ,
1084
+ if (!o -> flags .dual_color_diffed_diffs )
1085
+ set_sign = NULL ;
1086
+ else {
1087
+ char c = !len ? 0 : line [0 ];
1088
+
1089
+ set_sign = set ;
1090
+ if (c == '-' )
1091
+ set = diff_get_color_opt (o , DIFF_FILE_OLD );
1092
+ else if (c == '@' )
1093
+ set = diff_get_color_opt (o , DIFF_FRAGINFO );
1094
+ else if (c != '+' )
1095
+ set = diff_get_color_opt (o , DIFF_CONTEXT );
1096
+ }
1097
+ emit_line_ws_markup (o , set , reset , line , len , set_sign , '+' ,
1061
1098
flags & DIFF_SYMBOL_CONTENT_WS_MASK ,
1062
1099
flags & DIFF_SYMBOL_CONTENT_BLANK_LINE_EOF );
1063
1100
break ;
@@ -1085,7 +1122,20 @@ static void emit_diff_symbol_from_struct(struct diff_options *o,
1085
1122
set = diff_get_color_opt (o , DIFF_FILE_OLD );
1086
1123
}
1087
1124
reset = diff_get_color_opt (o , DIFF_RESET );
1088
- emit_line_ws_markup (o , set , reset , line , len , '-' ,
1125
+ if (!o -> flags .dual_color_diffed_diffs )
1126
+ set_sign = NULL ;
1127
+ else {
1128
+ char c = !len ? 0 : line [0 ];
1129
+
1130
+ set_sign = set ;
1131
+ if (c == '+' )
1132
+ set = diff_get_color_opt (o , DIFF_FILE_NEW );
1133
+ else if (c == '@' )
1134
+ set = diff_get_color_opt (o , DIFF_FRAGINFO );
1135
+ else if (c != '-' )
1136
+ set = diff_get_color_opt (o , DIFF_CONTEXT );
1137
+ }
1138
+ emit_line_ws_markup (o , set , reset , line , len , set_sign , '-' ,
1089
1139
flags & DIFF_SYMBOL_CONTENT_WS_MASK , 0 );
1090
1140
break ;
1091
1141
case DIFF_SYMBOL_WORDS_PORCELAIN :
@@ -1276,6 +1326,7 @@ static void emit_hunk_header(struct emit_callback *ecbdata,
1276
1326
const char * frag = diff_get_color (ecbdata -> color_diff , DIFF_FRAGINFO );
1277
1327
const char * func = diff_get_color (ecbdata -> color_diff , DIFF_FUNCINFO );
1278
1328
const char * reset = diff_get_color (ecbdata -> color_diff , DIFF_RESET );
1329
+ const char * reverse = ecbdata -> color_diff ? GIT_COLOR_REVERSE : "" ;
1279
1330
static const char atat [2 ] = { '@' , '@' };
1280
1331
const char * cp , * ep ;
1281
1332
struct strbuf msgbuf = STRBUF_INIT ;
@@ -1296,6 +1347,8 @@ static void emit_hunk_header(struct emit_callback *ecbdata,
1296
1347
ep += 2 ; /* skip over @@ */
1297
1348
1298
1349
/* The hunk header in fraginfo color */
1350
+ if (ecbdata -> opt -> flags .dual_color_diffed_diffs )
1351
+ strbuf_addstr (& msgbuf , reverse );
1299
1352
strbuf_addstr (& msgbuf , frag );
1300
1353
strbuf_add (& msgbuf , line , ep - line );
1301
1354
strbuf_addstr (& msgbuf , reset );
0 commit comments