@@ -1706,21 +1706,21 @@ static void builtin_diff(const char *name_a,
17061706 if (lbl [0 ][0 ] == '/' ) {
17071707 /* /dev/null */
17081708 strbuf_addf (& header , "%snew file mode %06o%s\n" , set , two -> mode , reset );
1709- if (xfrm_msg && xfrm_msg [ 0 ] )
1710- strbuf_addf (& header , "%s%s%s\n" , set , xfrm_msg , reset );
1709+ if (xfrm_msg )
1710+ strbuf_addstr (& header , xfrm_msg );
17111711 }
17121712 else if (lbl [1 ][0 ] == '/' ) {
17131713 strbuf_addf (& header , "%sdeleted file mode %06o%s\n" , set , one -> mode , reset );
1714- if (xfrm_msg && xfrm_msg [ 0 ] )
1715- strbuf_addf (& header , "%s%s%s\n" , set , xfrm_msg , reset );
1714+ if (xfrm_msg )
1715+ strbuf_addstr (& header , xfrm_msg );
17161716 }
17171717 else {
17181718 if (one -> mode != two -> mode ) {
17191719 strbuf_addf (& header , "%sold mode %06o%s\n" , set , one -> mode , reset );
17201720 strbuf_addf (& header , "%snew mode %06o%s\n" , set , two -> mode , reset );
17211721 }
1722- if (xfrm_msg && xfrm_msg [ 0 ] )
1723- strbuf_addf (& header , "%s%s%s\n" , set , xfrm_msg , reset );
1722+ if (xfrm_msg )
1723+ strbuf_addstr (& header , xfrm_msg );
17241724
17251725 /*
17261726 * we do not run diff between different kind
@@ -2379,30 +2379,36 @@ static void fill_metainfo(struct strbuf *msg,
23792379 struct diff_filespec * one ,
23802380 struct diff_filespec * two ,
23812381 struct diff_options * o ,
2382- struct diff_filepair * p )
2382+ struct diff_filepair * p ,
2383+ int use_color )
23832384{
2385+ const char * set = diff_get_color (use_color , DIFF_METAINFO );
2386+ const char * reset = diff_get_color (use_color , DIFF_RESET );
2387+
23842388 strbuf_init (msg , PATH_MAX * 2 + 300 );
23852389 switch (p -> status ) {
23862390 case DIFF_STATUS_COPIED :
2387- strbuf_addf (msg , "similarity index %d%%" , similarity_index (p ));
2388- strbuf_addstr (msg , "\ncopy from " );
2391+ strbuf_addf (msg , "%ssimilarity index %d%%" ,
2392+ set , similarity_index (p ));
2393+ strbuf_addf (msg , "%s\n%scopy from " , reset , set );
23892394 quote_c_style (name , msg , NULL , 0 );
2390- strbuf_addstr (msg , "\ncopy to " );
2395+ strbuf_addf (msg , "%s\n%scopy to " , reset , set );
23912396 quote_c_style (other , msg , NULL , 0 );
2392- strbuf_addch (msg , '\n' );
2397+ strbuf_addf (msg , "%s\n" , reset );
23932398 break ;
23942399 case DIFF_STATUS_RENAMED :
2395- strbuf_addf (msg , "similarity index %d%%" , similarity_index (p ));
2396- strbuf_addstr (msg , "\nrename from " );
2400+ strbuf_addf (msg , "%ssimilarity index %d%%" ,
2401+ set , similarity_index (p ));
2402+ strbuf_addf (msg , "%s\n%srename from " , reset , set );
23972403 quote_c_style (name , msg , NULL , 0 );
2398- strbuf_addstr (msg , "\nrename to " );
2404+ strbuf_addf (msg , "%s\n%srename to " , reset , set );
23992405 quote_c_style (other , msg , NULL , 0 );
2400- strbuf_addch (msg , '\n' );
2406+ strbuf_addf (msg , "%s\n" , reset );
24012407 break ;
24022408 case DIFF_STATUS_MODIFIED :
24032409 if (p -> score ) {
2404- strbuf_addf (msg , "dissimilarity index %d%%\n" ,
2405- similarity_index (p ));
2410+ strbuf_addf (msg , "%sdissimilarity index %d%%%s \n" ,
2411+ set , similarity_index (p ), reset );
24062412 break ;
24072413 }
24082414 /* fallthru */
@@ -2419,15 +2425,13 @@ static void fill_metainfo(struct strbuf *msg,
24192425 (!fill_mmfile (& mf , two ) && diff_filespec_is_binary (two )))
24202426 abbrev = 40 ;
24212427 }
2422- strbuf_addf (msg , "index %.*s..%.*s" ,
2428+ strbuf_addf (msg , "%sindex %.*s..%.*s" , set ,
24232429 abbrev , sha1_to_hex (one -> sha1 ),
24242430 abbrev , sha1_to_hex (two -> sha1 ));
24252431 if (one -> mode == two -> mode )
24262432 strbuf_addf (msg , " %06o" , one -> mode );
2427- strbuf_addch (msg , '\n' );
2433+ strbuf_addf (msg , "%s\n" , reset );
24282434 }
2429- if (msg -> len )
2430- strbuf_setlen (msg , msg -> len - 1 );
24312435}
24322436
24332437static void run_diff_cmd (const char * pgm ,
@@ -2443,11 +2447,6 @@ static void run_diff_cmd(const char *pgm,
24432447 const char * xfrm_msg = NULL ;
24442448 int complete_rewrite = (p -> status == DIFF_STATUS_MODIFIED ) && p -> score ;
24452449
2446- if (msg ) {
2447- fill_metainfo (msg , name , other , one , two , o , p );
2448- xfrm_msg = msg -> len ? msg -> buf : NULL ;
2449- }
2450-
24512450 if (!DIFF_OPT_TST (o , ALLOW_EXTERNAL ))
24522451 pgm = NULL ;
24532452 else {
@@ -2456,6 +2455,16 @@ static void run_diff_cmd(const char *pgm,
24562455 pgm = drv -> external ;
24572456 }
24582457
2458+ if (msg ) {
2459+ /*
2460+ * don't use colors when the header is intended for an
2461+ * external diff driver
2462+ */
2463+ fill_metainfo (msg , name , other , one , two , o , p ,
2464+ DIFF_OPT_TST (o , COLOR_DIFF ) && !pgm );
2465+ xfrm_msg = msg -> len ? msg -> buf : NULL ;
2466+ }
2467+
24592468 if (pgm ) {
24602469 run_external_diff (pgm , name , other , one , two , xfrm_msg ,
24612470 complete_rewrite );
0 commit comments