@@ -1140,6 +1140,7 @@ struct checkdiff_t {
11401140 struct diff_options * o ;
11411141 unsigned ws_rule ;
11421142 unsigned status ;
1143+ int trailing_blanks_start ;
11431144};
11441145
11451146static void checkdiff_consume (void * priv , char * line , unsigned long len )
@@ -1154,6 +1155,10 @@ static void checkdiff_consume(void *priv, char *line, unsigned long len)
11541155 if (line [0 ] == '+' ) {
11551156 unsigned bad ;
11561157 data -> lineno ++ ;
1158+ if (!ws_blank_line (line + 1 , len - 1 , data -> ws_rule ))
1159+ data -> trailing_blanks_start = 0 ;
1160+ else if (!data -> trailing_blanks_start )
1161+ data -> trailing_blanks_start = data -> lineno ;
11571162 bad = ws_check (line + 1 , len - 1 , data -> ws_rule );
11581163 if (!bad )
11591164 return ;
@@ -1165,14 +1170,16 @@ static void checkdiff_consume(void *priv, char *line, unsigned long len)
11651170 emit_line (data -> o -> file , set , reset , line , 1 );
11661171 ws_check_emit (line + 1 , len - 1 , data -> ws_rule ,
11671172 data -> o -> file , set , reset , ws );
1168- } else if (line [0 ] == ' ' )
1173+ } else if (line [0 ] == ' ' ) {
11691174 data -> lineno ++ ;
1170- else if (line [0 ] == '@' ) {
1175+ data -> trailing_blanks_start = 0 ;
1176+ } else if (line [0 ] == '@' ) {
11711177 char * plus = strchr (line , '+' );
11721178 if (plus )
11731179 data -> lineno = strtol (plus , NULL , 10 ) - 1 ;
11741180 else
11751181 die ("invalid diff" );
1182+ data -> trailing_blanks_start = 0 ;
11761183 }
11771184}
11781185
@@ -1584,6 +1591,12 @@ static void builtin_checkdiff(const char *name_a, const char *name_b,
15841591 ecb .outf = xdiff_outf ;
15851592 ecb .priv = & data ;
15861593 xdi_diff (& mf1 , & mf2 , & xpp , & xecfg , & ecb );
1594+
1595+ if (data .trailing_blanks_start ) {
1596+ fprintf (o -> file , "%s:%d: ends with blank lines.\n" ,
1597+ data .filename , data .trailing_blanks_start );
1598+ data .status = 1 ; /* report errors */
1599+ }
15871600 }
15881601 free_and_return :
15891602 diff_free_filespec_data (one );
0 commit comments