@@ -1600,6 +1600,7 @@ static void builtin_diff(const char *name_a,
1600
1600
struct diff_filespec * one ,
1601
1601
struct diff_filespec * two ,
1602
1602
const char * xfrm_msg ,
1603
+ int must_show_header ,
1603
1604
struct diff_options * o ,
1604
1605
int complete_rewrite )
1605
1606
{
@@ -1651,16 +1652,19 @@ static void builtin_diff(const char *name_a,
1651
1652
strbuf_addf (& header , "%snew file mode %06o%s\n" , set , two -> mode , reset );
1652
1653
if (xfrm_msg )
1653
1654
strbuf_addstr (& header , xfrm_msg );
1655
+ must_show_header = 1 ;
1654
1656
}
1655
1657
else if (lbl [1 ][0 ] == '/' ) {
1656
1658
strbuf_addf (& header , "%sdeleted file mode %06o%s\n" , set , one -> mode , reset );
1657
1659
if (xfrm_msg )
1658
1660
strbuf_addstr (& header , xfrm_msg );
1661
+ must_show_header = 1 ;
1659
1662
}
1660
1663
else {
1661
1664
if (one -> mode != two -> mode ) {
1662
1665
strbuf_addf (& header , "%sold mode %06o%s\n" , set , one -> mode , reset );
1663
1666
strbuf_addf (& header , "%snew mode %06o%s\n" , set , two -> mode , reset );
1667
+ must_show_header = 1 ;
1664
1668
}
1665
1669
if (xfrm_msg )
1666
1670
strbuf_addstr (& header , xfrm_msg );
@@ -1691,8 +1695,11 @@ static void builtin_diff(const char *name_a,
1691
1695
(diff_filespec_is_binary (two ) && !textconv_two ) )) {
1692
1696
/* Quite common confusing case */
1693
1697
if (mf1 .size == mf2 .size &&
1694
- !memcmp (mf1 .ptr , mf2 .ptr , mf1 .size ))
1698
+ !memcmp (mf1 .ptr , mf2 .ptr , mf1 .size )) {
1699
+ if (must_show_header )
1700
+ fprintf (o -> file , "%s" , header .buf );
1695
1701
goto free_ab_and_return ;
1702
+ }
1696
1703
fprintf (o -> file , "%s" , header .buf );
1697
1704
strbuf_reset (& header );
1698
1705
if (DIFF_OPT_TST (o , BINARY ))
@@ -1710,7 +1717,7 @@ static void builtin_diff(const char *name_a,
1710
1717
struct emit_callback ecbdata ;
1711
1718
const struct userdiff_funcname * pe ;
1712
1719
1713
- if (!DIFF_XDL_TST (o , WHITESPACE_FLAGS )) {
1720
+ if (!DIFF_XDL_TST (o , WHITESPACE_FLAGS ) || must_show_header ) {
1714
1721
fprintf (o -> file , "%s" , header .buf );
1715
1722
strbuf_reset (& header );
1716
1723
}
@@ -2320,11 +2327,13 @@ static void fill_metainfo(struct strbuf *msg,
2320
2327
struct diff_filespec * two ,
2321
2328
struct diff_options * o ,
2322
2329
struct diff_filepair * p ,
2330
+ int * must_show_header ,
2323
2331
int use_color )
2324
2332
{
2325
2333
const char * set = diff_get_color (use_color , DIFF_METAINFO );
2326
2334
const char * reset = diff_get_color (use_color , DIFF_RESET );
2327
2335
2336
+ * must_show_header = 1 ;
2328
2337
strbuf_init (msg , PATH_MAX * 2 + 300 );
2329
2338
switch (p -> status ) {
2330
2339
case DIFF_STATUS_COPIED :
@@ -2353,8 +2362,7 @@ static void fill_metainfo(struct strbuf *msg,
2353
2362
}
2354
2363
/* fallthru */
2355
2364
default :
2356
- /* nothing */
2357
- ;
2365
+ * must_show_header = 0 ;
2358
2366
}
2359
2367
if (one && two && hashcmp (one -> sha1 , two -> sha1 )) {
2360
2368
int abbrev = DIFF_OPT_TST (o , FULL_INDEX ) ? 40 : DEFAULT_ABBREV ;
@@ -2386,6 +2394,7 @@ static void run_diff_cmd(const char *pgm,
2386
2394
{
2387
2395
const char * xfrm_msg = NULL ;
2388
2396
int complete_rewrite = (p -> status == DIFF_STATUS_MODIFIED ) && p -> score ;
2397
+ int must_show_header = 0 ;
2389
2398
2390
2399
if (!DIFF_OPT_TST (o , ALLOW_EXTERNAL ))
2391
2400
pgm = NULL ;
@@ -2401,6 +2410,7 @@ static void run_diff_cmd(const char *pgm,
2401
2410
* external diff driver
2402
2411
*/
2403
2412
fill_metainfo (msg , name , other , one , two , o , p ,
2413
+ & must_show_header ,
2404
2414
DIFF_OPT_TST (o , COLOR_DIFF ) && !pgm );
2405
2415
xfrm_msg = msg -> len ? msg -> buf : NULL ;
2406
2416
}
@@ -2412,7 +2422,8 @@ static void run_diff_cmd(const char *pgm,
2412
2422
}
2413
2423
if (one && two )
2414
2424
builtin_diff (name , other ? other : name ,
2415
- one , two , xfrm_msg , o , complete_rewrite );
2425
+ one , two , xfrm_msg , must_show_header ,
2426
+ o , complete_rewrite );
2416
2427
else
2417
2428
fprintf (o -> file , "* Unmerged path %s\n" , name );
2418
2429
}
0 commit comments