@@ -1649,21 +1649,21 @@ static void builtin_diff(const char *name_a,
16491649 if (lbl [0 ][0 ] == '/' ) {
16501650 /* /dev/null */
16511651 strbuf_addf (& header , "%snew file mode %06o%s\n" , set , two -> mode , reset );
1652- if (xfrm_msg && xfrm_msg [ 0 ] )
1653- strbuf_addf (& header , "%s%s%s\n" , set , xfrm_msg , reset );
1652+ if (xfrm_msg )
1653+ strbuf_addstr (& header , xfrm_msg );
16541654 }
16551655 else if (lbl [1 ][0 ] == '/' ) {
16561656 strbuf_addf (& header , "%sdeleted file mode %06o%s\n" , set , one -> mode , reset );
1657- if (xfrm_msg && xfrm_msg [ 0 ] )
1658- strbuf_addf (& header , "%s%s%s\n" , set , xfrm_msg , reset );
1657+ if (xfrm_msg )
1658+ strbuf_addstr (& header , xfrm_msg );
16591659 }
16601660 else {
16611661 if (one -> mode != two -> mode ) {
16621662 strbuf_addf (& header , "%sold mode %06o%s\n" , set , one -> mode , reset );
16631663 strbuf_addf (& header , "%snew mode %06o%s\n" , set , two -> mode , reset );
16641664 }
1665- if (xfrm_msg && xfrm_msg [ 0 ] )
1666- strbuf_addf (& header , "%s%s%s\n" , set , xfrm_msg , reset );
1665+ if (xfrm_msg )
1666+ strbuf_addstr (& header , xfrm_msg );
16671667
16681668 /*
16691669 * we do not run diff between different kind
@@ -2319,30 +2319,36 @@ static void fill_metainfo(struct strbuf *msg,
23192319 struct diff_filespec * one ,
23202320 struct diff_filespec * two ,
23212321 struct diff_options * o ,
2322- struct diff_filepair * p )
2322+ struct diff_filepair * p ,
2323+ int use_color )
23232324{
2325+ const char * set = diff_get_color (use_color , DIFF_METAINFO );
2326+ const char * reset = diff_get_color (use_color , DIFF_RESET );
2327+
23242328 strbuf_init (msg , PATH_MAX * 2 + 300 );
23252329 switch (p -> status ) {
23262330 case DIFF_STATUS_COPIED :
2327- strbuf_addf (msg , "similarity index %d%%" , similarity_index (p ));
2328- strbuf_addstr (msg , "\ncopy from " );
2331+ strbuf_addf (msg , "%ssimilarity index %d%%" ,
2332+ set , similarity_index (p ));
2333+ strbuf_addf (msg , "%s\n%scopy from " , reset , set );
23292334 quote_c_style (name , msg , NULL , 0 );
2330- strbuf_addstr (msg , "\ncopy to " );
2335+ strbuf_addf (msg , "%s\n%scopy to " , reset , set );
23312336 quote_c_style (other , msg , NULL , 0 );
2332- strbuf_addch (msg , '\n' );
2337+ strbuf_addf (msg , "%s\n" , reset );
23332338 break ;
23342339 case DIFF_STATUS_RENAMED :
2335- strbuf_addf (msg , "similarity index %d%%" , similarity_index (p ));
2336- strbuf_addstr (msg , "\nrename from " );
2340+ strbuf_addf (msg , "%ssimilarity index %d%%" ,
2341+ set , similarity_index (p ));
2342+ strbuf_addf (msg , "%s\n%srename from " , reset , set );
23372343 quote_c_style (name , msg , NULL , 0 );
2338- strbuf_addstr (msg , "\nrename to " );
2344+ strbuf_addf (msg , "%s\n%srename to " , reset , set );
23392345 quote_c_style (other , msg , NULL , 0 );
2340- strbuf_addch (msg , '\n' );
2346+ strbuf_addf (msg , "%s\n" , reset );
23412347 break ;
23422348 case DIFF_STATUS_MODIFIED :
23432349 if (p -> score ) {
2344- strbuf_addf (msg , "dissimilarity index %d%%\n" ,
2345- similarity_index (p ));
2350+ strbuf_addf (msg , "%sdissimilarity index %d%%%s \n" ,
2351+ set , similarity_index (p ), reset );
23462352 break ;
23472353 }
23482354 /* fallthru */
@@ -2359,15 +2365,13 @@ static void fill_metainfo(struct strbuf *msg,
23592365 (!fill_mmfile (& mf , two ) && diff_filespec_is_binary (two )))
23602366 abbrev = 40 ;
23612367 }
2362- strbuf_addf (msg , "index %.*s..%.*s" ,
2368+ strbuf_addf (msg , "%sindex %.*s..%.*s" , set ,
23632369 abbrev , sha1_to_hex (one -> sha1 ),
23642370 abbrev , sha1_to_hex (two -> sha1 ));
23652371 if (one -> mode == two -> mode )
23662372 strbuf_addf (msg , " %06o" , one -> mode );
2367- strbuf_addch (msg , '\n' );
2373+ strbuf_addf (msg , "%s\n" , reset );
23682374 }
2369- if (msg -> len )
2370- strbuf_setlen (msg , msg -> len - 1 );
23712375}
23722376
23732377static void run_diff_cmd (const char * pgm ,
@@ -2383,11 +2387,6 @@ static void run_diff_cmd(const char *pgm,
23832387 const char * xfrm_msg = NULL ;
23842388 int complete_rewrite = (p -> status == DIFF_STATUS_MODIFIED ) && p -> score ;
23852389
2386- if (msg ) {
2387- fill_metainfo (msg , name , other , one , two , o , p );
2388- xfrm_msg = msg -> len ? msg -> buf : NULL ;
2389- }
2390-
23912390 if (!DIFF_OPT_TST (o , ALLOW_EXTERNAL ))
23922391 pgm = NULL ;
23932392 else {
@@ -2396,6 +2395,16 @@ static void run_diff_cmd(const char *pgm,
23962395 pgm = drv -> external ;
23972396 }
23982397
2398+ if (msg ) {
2399+ /*
2400+ * don't use colors when the header is intended for an
2401+ * external diff driver
2402+ */
2403+ fill_metainfo (msg , name , other , one , two , o , p ,
2404+ DIFF_OPT_TST (o , COLOR_DIFF ) && !pgm );
2405+ xfrm_msg = msg -> len ? msg -> buf : NULL ;
2406+ }
2407+
23992408 if (pgm ) {
24002409 run_external_diff (pgm , name , other , one , two , xfrm_msg ,
24012410 complete_rewrite );
0 commit comments