@@ -359,7 +359,7 @@ static int
359359do_git_diff_no_hunks  (FILE  * f , char  * * header , unsigned int   num_headers ,
360360		      int  match , char  * * line , size_t  * linelen ,
361361		      unsigned long  * linenum , unsigned long  start_linenum ,
362- 		      char  status , const  char  * bestname , const  char  * patchname ,
362+ 		      char  * status , const  char  * bestname , const  char  * patchname ,
363363		      int  * orig_file_exists , int  * new_file_exists ,
364364		      enum  git_diff_type  git_type )
365365{
@@ -386,6 +386,16 @@ do_git_diff_no_hunks (FILE *f, char **header, unsigned int num_headers,
386386		break ;
387387	}
388388
389+ 	/* Update status based on file existence (do this early so returns below have correct status) */ 
390+ 	if  (status  !=  NULL  &&  mode  !=  mode_filter  &&  show_status  && 
391+ 	    orig_file_exists  !=  NULL  &&  new_file_exists  !=  NULL ) {
392+ 		if  (!* orig_file_exists )
393+ 			* status  =  '+' ;
394+ 		else  if  (!* new_file_exists )
395+ 			* status  =  '-' ;
396+ 		/* else: keep existing '!' value for modifications */ 
397+ 	}
398+ 
389399	/* If this diff matches the filter, display it */ 
390400	if  (match ) {
391401		if  (mode  ==  mode_filter ) {
@@ -394,7 +404,7 @@ do_git_diff_no_hunks (FILE *f, char **header, unsigned int num_headers,
394404				fputs  (header [i ], stdout );
395405		} else  if  (mode  ==  mode_list  &&  !displayed_filename ) {
396406			if  (!show_status ) {
397- 				display_filename  (start_linenum , status ,
407+ 				display_filename  (start_linenum , * status ,
398408						  bestname , patchname );
399409			}
400410			displayed_filename  =  1 ;
@@ -455,7 +465,7 @@ static int
455465do_unified  (FILE  * f , char  * * header , unsigned int   num_headers ,
456466	    int  match , char  * * line ,
457467	    size_t  * linelen , unsigned long  * linenum ,
458- 	    unsigned long  start_linenum , char  status ,
468+ 	    unsigned long  start_linenum , char  * status ,
459469	    const  char  * bestname , const  char  * patchname ,
460470	    int  * orig_file_exists , int  * new_file_exists )
461471{
@@ -671,7 +681,7 @@ do_unified (FILE *f, char **header, unsigned int num_headers,
671681				if  (!displayed_filename ) {
672682					displayed_filename  =  1 ;
673683					display_filename  (start_linenum ,
674- 							  status , bestname ,
684+ 							  * status , bestname ,
675685							  patchname );
676686				}
677687
@@ -746,14 +756,24 @@ do_unified (FILE *f, char **header, unsigned int num_headers,
746756			* new_file_exists  =  0 ;
747757	}
748758
759+ 	/* Update status based on final file existence after empty file processing */ 
760+ 	if  (status  !=  NULL  &&  mode  !=  mode_filter  &&  show_status  && 
761+ 	    orig_file_exists  !=  NULL  &&  new_file_exists  !=  NULL ) {
762+ 		if  (!* orig_file_exists )
763+ 			* status  =  '+' ;
764+ 		else  if  (!* new_file_exists )
765+ 			* status  =  '-' ;
766+ 		/* else: keep existing '!' value for modifications */ 
767+ 	}
768+ 
749769	return  ret ;
750770}
751771
752772static  int 
753773do_context  (FILE  * f , char  * * header , unsigned int   num_headers ,
754774	    int  match , char  * * line ,
755775	    size_t  * linelen , unsigned long  * linenum ,
756- 	    unsigned long  start_linenum , char  status ,
776+ 	    unsigned long  start_linenum , char  * status ,
757777	    const  char  * bestname , const  char  * patchname ,
758778	    int  * orig_file_exists , int  * new_file_exists )
759779{
@@ -1020,7 +1040,7 @@ do_context (FILE *f, char **header, unsigned int num_headers,
10201040					if  (!displayed_filename ) {
10211041						displayed_filename  =  1 ;
10221042						display_filename (start_linenum ,
1023- 								 status ,
1043+ 								 * status ,
10241044								 bestname ,
10251045								 patchname );
10261046					}
@@ -1150,6 +1170,16 @@ do_context (FILE *f, char **header, unsigned int num_headers,
11501170			* new_file_exists  =  0 ;
11511171	}
11521172
1173+ 	/* Update status based on final file existence after empty file processing */ 
1174+ 	if  (status  !=  NULL  &&  mode  !=  mode_filter  &&  show_status  && 
1175+ 	    orig_file_exists  !=  NULL  &&  new_file_exists  !=  NULL ) {
1176+ 		if  (!* orig_file_exists )
1177+ 			* status  =  '+' ;
1178+ 		else  if  (!* new_file_exists )
1179+ 			* status  =  '-' ;
1180+ 		/* else: keep existing '!' value for modifications */ 
1181+ 	}
1182+ 
11531183	return  ret ;
11541184}
11551185
@@ -1180,7 +1210,7 @@ static int filterdiff (FILE *f, const char *patchname)
11801210		int  (* do_diff ) (FILE  * , char  * * , unsigned int  ,
11811211				int , char  * * , size_t  * ,
11821212				unsigned long  * , unsigned long ,
1183- 				char , const  char  * , const  char  * ,
1213+ 				char   * , const  char  * , const  char  * ,
11841214				int  * , int  * );
11851215
11861216		orig_file_exists  =  0 ; // shut gcc up 
@@ -1375,19 +1405,13 @@ static int filterdiff (FILE *f, const char *patchname)
13751405								/* Process the git diff (it will handle filename display) */ 
13761406				result  =  do_git_diff_no_hunks  (f , header , num_headers ,
13771407							     match , & line , & linelen , & linenum ,
1378- 							     start_linenum , status , p , patchname ,
1408+ 							     start_linenum , & status , p , patchname ,
13791409							     & orig_file_exists , & new_file_exists ,
13801410							     git_type );
13811411
13821412				/* Print filename with status if in list mode and matches */ 
1383- 				if  (match  &&  show_status  &&  mode  ==  mode_list ) {
1384- 					if  (!orig_file_exists )
1385- 						status  =  '+' ;
1386- 					else  if  (!new_file_exists )
1387- 						status  =  '-' ;
1388- 
1413+ 				if  (match  &&  show_status  &&  mode  ==  mode_list )
13891414					display_filename  (start_linenum , status , p , patchname );
1390- 				}
13911415
13921416				/* Clean up */ 
13931417				free  (git_old_name );
@@ -1476,19 +1500,13 @@ static int filterdiff (FILE *f, const char *patchname)
14761500		result  =  do_diff  (f , header , num_headers ,
14771501				  match , & line ,
14781502				  & linelen , & linenum ,
1479- 				  start_linenum , status , p , patchname ,
1503+ 				  start_linenum , & status , p , patchname ,
14801504				  & orig_file_exists , & new_file_exists );
14811505
14821506		// print if it matches. 
1483- 		if  (match  &&  show_status  &&  mode  ==  mode_list ) {
1484- 			if  (!orig_file_exists )
1485- 				status  =  '+' ;
1486- 			else  if  (!new_file_exists )
1487- 				status  =  '-' ;
1488- 
1507+ 		if  (match  &&  show_status  &&  mode  ==  mode_list )
14891508			display_filename  (start_linenum , status ,
14901509					  p , patchname );
1491- 		}
14921510
14931511		switch  (result ) {
14941512		case  EOF :
0 commit comments