Use run_command() to spawn external diff programs instead of fork/exec.
Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>maint
							parent
							
								
									dc1bfdcd1a
								
							
						
					
					
						commit
						d5535ec75c
					
				
							
								
								
									
										38
									
								
								diff.c
								
								
								
								
							
							
						
						
									
										38
									
								
								diff.c
								
								
								
								
							|  | @ -9,6 +9,7 @@ | |||
| #include "xdiff-interface.h" | ||||
| #include "color.h" | ||||
| #include "attr.h" | ||||
| #include "run-command.h" | ||||
|  | ||||
| #ifdef NO_FAST_WORKING_DIRECTORY | ||||
| #define FAST_WORKING_DIRECTORY 0 | ||||
|  | @ -1748,40 +1749,6 @@ static void remove_tempfile_on_signal(int signo) | |||
| 	raise(signo); | ||||
| } | ||||
|  | ||||
| static int spawn_prog(const char *pgm, const char **arg) | ||||
| { | ||||
| 	pid_t pid; | ||||
| 	int status; | ||||
|  | ||||
| 	fflush(NULL); | ||||
| 	pid = fork(); | ||||
| 	if (pid < 0) | ||||
| 		die("unable to fork"); | ||||
| 	if (!pid) { | ||||
| 		execvp(pgm, (char *const*) arg); | ||||
| 		exit(255); | ||||
| 	} | ||||
|  | ||||
| 	while (waitpid(pid, &status, 0) < 0) { | ||||
| 		if (errno == EINTR) | ||||
| 			continue; | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	/* Earlier we did not check the exit status because | ||||
| 	 * diff exits non-zero if files are different, and | ||||
| 	 * we are not interested in knowing that.  It was a | ||||
| 	 * mistake which made it harder to quit a diff-* | ||||
| 	 * session that uses the git-apply-patch-script as | ||||
| 	 * the GIT_EXTERNAL_DIFF.  A custom GIT_EXTERNAL_DIFF | ||||
| 	 * should also exit non-zero only when it wants to | ||||
| 	 * abort the entire diff-* session. | ||||
| 	 */ | ||||
| 	if (WIFEXITED(status) && !WEXITSTATUS(status)) | ||||
| 		return 0; | ||||
| 	return -1; | ||||
| } | ||||
|  | ||||
| /* An external diff command takes: | ||||
|  * | ||||
|  * diff-cmd name infile1 infile1-sha1 infile1-mode \ | ||||
|  | @ -1834,7 +1801,8 @@ static void run_external_diff(const char *pgm, | |||
| 		*arg++ = name; | ||||
| 	} | ||||
| 	*arg = NULL; | ||||
| 	retval = spawn_prog(pgm, spawn_arg); | ||||
| 	fflush(NULL); | ||||
| 	retval = run_command_v_opt(spawn_arg, 0); | ||||
| 	remove_tempfile(); | ||||
| 	if (retval) { | ||||
| 		fprintf(stderr, "external diff died, stopping at %s.\n", name); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Johannes Sixt
						Johannes Sixt