Browse Source

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
Johannes Sixt 17 years ago committed by Shawn O. Pearce
parent
commit
d5535ec75c
  1. 38
      diff.c

38
diff.c

@ -9,6 +9,7 @@ @@ -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) @@ -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, @@ -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…
Cancel
Save