@@ -1600,6 +1600,7 @@ static void builtin_diff(const char *name_a,
16001600 struct diff_filespec * one ,
16011601 struct diff_filespec * two ,
16021602 const char * xfrm_msg ,
1603+ int must_show_header ,
16031604 struct diff_options * o ,
16041605 int complete_rewrite )
16051606{
@@ -1651,16 +1652,19 @@ static void builtin_diff(const char *name_a,
16511652 strbuf_addf (& header , "%snew file mode %06o%s\n" , set , two -> mode , reset );
16521653 if (xfrm_msg )
16531654 strbuf_addstr (& header , xfrm_msg );
1655+ must_show_header = 1 ;
16541656 }
16551657 else if (lbl [1 ][0 ] == '/' ) {
16561658 strbuf_addf (& header , "%sdeleted file mode %06o%s\n" , set , one -> mode , reset );
16571659 if (xfrm_msg )
16581660 strbuf_addstr (& header , xfrm_msg );
1661+ must_show_header = 1 ;
16591662 }
16601663 else {
16611664 if (one -> mode != two -> mode ) {
16621665 strbuf_addf (& header , "%sold mode %06o%s\n" , set , one -> mode , reset );
16631666 strbuf_addf (& header , "%snew mode %06o%s\n" , set , two -> mode , reset );
1667+ must_show_header = 1 ;
16641668 }
16651669 if (xfrm_msg )
16661670 strbuf_addstr (& header , xfrm_msg );
@@ -1691,8 +1695,11 @@ static void builtin_diff(const char *name_a,
16911695 (diff_filespec_is_binary (two ) && !textconv_two ) )) {
16921696 /* Quite common confusing case */
16931697 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 );
16951701 goto free_ab_and_return ;
1702+ }
16961703 fprintf (o -> file , "%s" , header .buf );
16971704 strbuf_reset (& header );
16981705 if (DIFF_OPT_TST (o , BINARY ))
@@ -1710,7 +1717,7 @@ static void builtin_diff(const char *name_a,
17101717 struct emit_callback ecbdata ;
17111718 const struct userdiff_funcname * pe ;
17121719
1713- if (!DIFF_XDL_TST (o , WHITESPACE_FLAGS )) {
1720+ if (!DIFF_XDL_TST (o , WHITESPACE_FLAGS ) || must_show_header ) {
17141721 fprintf (o -> file , "%s" , header .buf );
17151722 strbuf_reset (& header );
17161723 }
@@ -2320,11 +2327,13 @@ static void fill_metainfo(struct strbuf *msg,
23202327 struct diff_filespec * two ,
23212328 struct diff_options * o ,
23222329 struct diff_filepair * p ,
2330+ int * must_show_header ,
23232331 int use_color )
23242332{
23252333 const char * set = diff_get_color (use_color , DIFF_METAINFO );
23262334 const char * reset = diff_get_color (use_color , DIFF_RESET );
23272335
2336+ * must_show_header = 1 ;
23282337 strbuf_init (msg , PATH_MAX * 2 + 300 );
23292338 switch (p -> status ) {
23302339 case DIFF_STATUS_COPIED :
@@ -2353,8 +2362,7 @@ static void fill_metainfo(struct strbuf *msg,
23532362 }
23542363 /* fallthru */
23552364 default :
2356- /* nothing */
2357- ;
2365+ * must_show_header = 0 ;
23582366 }
23592367 if (one && two && hashcmp (one -> sha1 , two -> sha1 )) {
23602368 int abbrev = DIFF_OPT_TST (o , FULL_INDEX ) ? 40 : DEFAULT_ABBREV ;
@@ -2386,6 +2394,7 @@ static void run_diff_cmd(const char *pgm,
23862394{
23872395 const char * xfrm_msg = NULL ;
23882396 int complete_rewrite = (p -> status == DIFF_STATUS_MODIFIED ) && p -> score ;
2397+ int must_show_header = 0 ;
23892398
23902399 if (!DIFF_OPT_TST (o , ALLOW_EXTERNAL ))
23912400 pgm = NULL ;
@@ -2401,6 +2410,7 @@ static void run_diff_cmd(const char *pgm,
24012410 * external diff driver
24022411 */
24032412 fill_metainfo (msg , name , other , one , two , o , p ,
2413+ & must_show_header ,
24042414 DIFF_OPT_TST (o , COLOR_DIFF ) && !pgm );
24052415 xfrm_msg = msg -> len ? msg -> buf : NULL ;
24062416 }
@@ -2412,7 +2422,8 @@ static void run_diff_cmd(const char *pgm,
24122422 }
24132423 if (one && two )
24142424 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 );
24162427 else
24172428 fprintf (o -> file , "* Unmerged path %s\n" , name );
24182429}
0 commit comments