@@ -1596,6 +1596,7 @@ static void builtin_diff(const char *name_a,
1596
1596
struct diff_filespec * one ,
1597
1597
struct diff_filespec * two ,
1598
1598
const char * xfrm_msg ,
1599
+ int must_show_header ,
1599
1600
struct diff_options * o ,
1600
1601
int complete_rewrite )
1601
1602
{
@@ -1647,16 +1648,19 @@ static void builtin_diff(const char *name_a,
1647
1648
strbuf_addf (& header , "%snew file mode %06o%s\n" , set , two -> mode , reset );
1648
1649
if (xfrm_msg && xfrm_msg [0 ])
1649
1650
strbuf_addf (& header , "%s%s%s\n" , set , xfrm_msg , reset );
1651
+ must_show_header = 1 ;
1650
1652
}
1651
1653
else if (lbl [1 ][0 ] == '/' ) {
1652
1654
strbuf_addf (& header , "%sdeleted file mode %06o%s\n" , set , one -> mode , reset );
1653
1655
if (xfrm_msg && xfrm_msg [0 ])
1654
1656
strbuf_addf (& header , "%s%s%s\n" , set , xfrm_msg , reset );
1657
+ must_show_header = 1 ;
1655
1658
}
1656
1659
else {
1657
1660
if (one -> mode != two -> mode ) {
1658
1661
strbuf_addf (& header , "%sold mode %06o%s\n" , set , one -> mode , reset );
1659
1662
strbuf_addf (& header , "%snew mode %06o%s\n" , set , two -> mode , reset );
1663
+ must_show_header = 1 ;
1660
1664
}
1661
1665
if (xfrm_msg && xfrm_msg [0 ])
1662
1666
strbuf_addf (& header , "%s%s%s\n" , set , xfrm_msg , reset );
@@ -1687,8 +1691,11 @@ static void builtin_diff(const char *name_a,
1687
1691
(diff_filespec_is_binary (two ) && !textconv_two ) )) {
1688
1692
/* Quite common confusing case */
1689
1693
if (mf1 .size == mf2 .size &&
1690
- !memcmp (mf1 .ptr , mf2 .ptr , mf1 .size ))
1694
+ !memcmp (mf1 .ptr , mf2 .ptr , mf1 .size )) {
1695
+ if (must_show_header )
1696
+ fprintf (o -> file , "%s" , header .buf );
1691
1697
goto free_ab_and_return ;
1698
+ }
1692
1699
fprintf (o -> file , "%s" , header .buf );
1693
1700
strbuf_reset (& header );
1694
1701
if (DIFF_OPT_TST (o , BINARY ))
@@ -1706,7 +1713,7 @@ static void builtin_diff(const char *name_a,
1706
1713
struct emit_callback ecbdata ;
1707
1714
const struct userdiff_funcname * pe ;
1708
1715
1709
- if (!DIFF_XDL_TST (o , WHITESPACE_FLAGS )) {
1716
+ if (!DIFF_XDL_TST (o , WHITESPACE_FLAGS ) || must_show_header ) {
1710
1717
fprintf (o -> file , "%s" , header .buf );
1711
1718
strbuf_reset (& header );
1712
1719
}
@@ -2315,8 +2322,10 @@ static void fill_metainfo(struct strbuf *msg,
2315
2322
struct diff_filespec * one ,
2316
2323
struct diff_filespec * two ,
2317
2324
struct diff_options * o ,
2318
- struct diff_filepair * p )
2325
+ struct diff_filepair * p ,
2326
+ int * must_show_header )
2319
2327
{
2328
+ * must_show_header = 1 ;
2320
2329
strbuf_init (msg , PATH_MAX * 2 + 300 );
2321
2330
switch (p -> status ) {
2322
2331
case DIFF_STATUS_COPIED :
@@ -2344,7 +2353,7 @@ static void fill_metainfo(struct strbuf *msg,
2344
2353
/* fallthru */
2345
2354
default :
2346
2355
/* nothing */
2347
- ;
2356
+ * must_show_header = 0 ;
2348
2357
}
2349
2358
if (one && two && hashcmp (one -> sha1 , two -> sha1 )) {
2350
2359
int abbrev = DIFF_OPT_TST (o , FULL_INDEX ) ? 40 : DEFAULT_ABBREV ;
@@ -2378,9 +2387,10 @@ static void run_diff_cmd(const char *pgm,
2378
2387
{
2379
2388
const char * xfrm_msg = NULL ;
2380
2389
int complete_rewrite = (p -> status == DIFF_STATUS_MODIFIED ) && p -> score ;
2390
+ int must_show_header = 0 ;
2381
2391
2382
2392
if (msg ) {
2383
- fill_metainfo (msg , name , other , one , two , o , p );
2393
+ fill_metainfo (msg , name , other , one , two , o , p , & must_show_header );
2384
2394
xfrm_msg = msg -> len ? msg -> buf : NULL ;
2385
2395
}
2386
2396
@@ -2399,7 +2409,8 @@ static void run_diff_cmd(const char *pgm,
2399
2409
}
2400
2410
if (one && two )
2401
2411
builtin_diff (name , other ? other : name ,
2402
- one , two , xfrm_msg , o , complete_rewrite );
2412
+ one , two , xfrm_msg , must_show_header ,
2413
+ o , complete_rewrite );
2403
2414
else
2404
2415
fprintf (o -> file , "* Unmerged path %s\n" , name );
2405
2416
}
0 commit comments