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 "xdiff-interface.h"
|
||||||
#include "color.h"
|
#include "color.h"
|
||||||
#include "attr.h"
|
#include "attr.h"
|
||||||
|
#include "run-command.h"
|
||||||
|
|
||||||
#ifdef NO_FAST_WORKING_DIRECTORY
|
#ifdef NO_FAST_WORKING_DIRECTORY
|
||||||
#define FAST_WORKING_DIRECTORY 0
|
#define FAST_WORKING_DIRECTORY 0
|
||||||
|
@ -1748,40 +1749,6 @@ static void remove_tempfile_on_signal(int signo)
|
||||||
raise(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:
|
/* An external diff command takes:
|
||||||
*
|
*
|
||||||
* diff-cmd name infile1 infile1-sha1 infile1-mode \
|
* diff-cmd name infile1 infile1-sha1 infile1-mode \
|
||||||
|
@ -1834,7 +1801,8 @@ static void run_external_diff(const char *pgm,
|
||||||
*arg++ = name;
|
*arg++ = name;
|
||||||
}
|
}
|
||||||
*arg = NULL;
|
*arg = NULL;
|
||||||
retval = spawn_prog(pgm, spawn_arg);
|
fflush(NULL);
|
||||||
|
retval = run_command_v_opt(spawn_arg, 0);
|
||||||
remove_tempfile();
|
remove_tempfile();
|
||||||
if (retval) {
|
if (retval) {
|
||||||
fprintf(stderr, "external diff died, stopping at %s.\n", name);
|
fprintf(stderr, "external diff died, stopping at %s.\n", name);
|
||||||
|
|
Loading…
Reference in New Issue