зеркало из https://github.com/microsoft/git.git
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>
This commit is contained in:
Родитель
dc1bfdcd1a
Коммит
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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче