@@ -1837,6 +1837,7 @@ static void builtin_diff(const char *name_a,
18371837 struct diff_filespec * one ,
18381838 struct diff_filespec * two ,
18391839 const char * xfrm_msg ,
1840+ int must_show_header ,
18401841 struct diff_options * o ,
18411842 int complete_rewrite )
18421843{
@@ -1896,16 +1897,19 @@ static void builtin_diff(const char *name_a,
18961897 strbuf_addf (& header , "%s%snew file mode %06o%s\n" , line_prefix , set , two -> mode , reset );
18971898 if (xfrm_msg )
18981899 strbuf_addstr (& header , xfrm_msg );
1900+ must_show_header = 1 ;
18991901 }
19001902 else if (lbl [1 ][0 ] == '/' ) {
19011903 strbuf_addf (& header , "%s%sdeleted file mode %06o%s\n" , line_prefix , set , one -> mode , reset );
19021904 if (xfrm_msg )
19031905 strbuf_addstr (& header , xfrm_msg );
1906+ must_show_header = 1 ;
19041907 }
19051908 else {
19061909 if (one -> mode != two -> mode ) {
19071910 strbuf_addf (& header , "%s%sold mode %06o%s\n" , line_prefix , set , one -> mode , reset );
19081911 strbuf_addf (& header , "%s%snew mode %06o%s\n" , line_prefix , set , two -> mode , reset );
1912+ must_show_header = 1 ;
19091913 }
19101914 if (xfrm_msg )
19111915 strbuf_addstr (& header , xfrm_msg );
@@ -1935,8 +1939,11 @@ static void builtin_diff(const char *name_a,
19351939 die ("unable to read files to diff" );
19361940 /* Quite common confusing case */
19371941 if (mf1 .size == mf2 .size &&
1938- !memcmp (mf1 .ptr , mf2 .ptr , mf1 .size ))
1942+ !memcmp (mf1 .ptr , mf2 .ptr , mf1 .size )) {
1943+ if (must_show_header )
1944+ fprintf (o -> file , "%s" , header .buf );
19391945 goto free_ab_and_return ;
1946+ }
19401947 fprintf (o -> file , "%s" , header .buf );
19411948 strbuf_reset (& header );
19421949 if (DIFF_OPT_TST (o , BINARY ))
@@ -1954,7 +1961,7 @@ static void builtin_diff(const char *name_a,
19541961 struct emit_callback ecbdata ;
19551962 const struct userdiff_funcname * pe ;
19561963
1957- if (!DIFF_XDL_TST (o , WHITESPACE_FLAGS )) {
1964+ if (!DIFF_XDL_TST (o , WHITESPACE_FLAGS ) || must_show_header ) {
19581965 fprintf (o -> file , "%s" , header .buf );
19591966 strbuf_reset (& header );
19601967 }
@@ -2568,18 +2575,19 @@ static void fill_metainfo(struct strbuf *msg,
25682575 struct diff_filespec * two ,
25692576 struct diff_options * o ,
25702577 struct diff_filepair * p ,
2578+ int * must_show_header ,
25712579 int use_color )
25722580{
25732581 const char * set = diff_get_color (use_color , DIFF_METAINFO );
25742582 const char * reset = diff_get_color (use_color , DIFF_RESET );
25752583 struct strbuf * msgbuf ;
25762584 char * line_prefix = "" ;
25772585
2586+ * must_show_header = 1 ;
25782587 if (o -> output_prefix ) {
25792588 msgbuf = o -> output_prefix (o , o -> output_prefix_data );
25802589 line_prefix = msgbuf -> buf ;
25812590 }
2582-
25832591 strbuf_init (msg , PATH_MAX * 2 + 300 );
25842592 switch (p -> status ) {
25852593 case DIFF_STATUS_COPIED :
@@ -2613,7 +2621,7 @@ static void fill_metainfo(struct strbuf *msg,
26132621 /* fallthru */
26142622 default :
26152623 /* nothing */
2616- ;
2624+ * must_show_header = 0 ;
26172625 }
26182626 if (one && two && hashcmp (one -> sha1 , two -> sha1 )) {
26192627 int abbrev = DIFF_OPT_TST (o , FULL_INDEX ) ? 40 : DEFAULT_ABBREV ;
@@ -2646,6 +2654,7 @@ static void run_diff_cmd(const char *pgm,
26462654{
26472655 const char * xfrm_msg = NULL ;
26482656 int complete_rewrite = (p -> status == DIFF_STATUS_MODIFIED ) && p -> score ;
2657+ int must_show_header = 0 ;
26492658
26502659 if (!DIFF_OPT_TST (o , ALLOW_EXTERNAL ))
26512660 pgm = NULL ;
@@ -2661,6 +2670,7 @@ static void run_diff_cmd(const char *pgm,
26612670 * external diff driver
26622671 */
26632672 fill_metainfo (msg , name , other , one , two , o , p ,
2673+ & must_show_header ,
26642674 DIFF_OPT_TST (o , COLOR_DIFF ) && !pgm );
26652675 xfrm_msg = msg -> len ? msg -> buf : NULL ;
26662676 }
@@ -2672,7 +2682,8 @@ static void run_diff_cmd(const char *pgm,
26722682 }
26732683 if (one && two )
26742684 builtin_diff (name , other ? other : name ,
2675- one , two , xfrm_msg , o , complete_rewrite );
2685+ one , two , xfrm_msg , must_show_header ,
2686+ o , complete_rewrite );
26762687 else
26772688 fprintf (o -> file , "* Unmerged path %s\n" , name );
26782689}
0 commit comments