X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=merge-index.c;h=fa719cb0b1bd227423587c9e41eed77c755465a4;hb=562ca192f94496611583688beb3725603ce51f89;hp=727527fd59480a11a563108fa5d55a2696a40e98;hpb=56fc63193975edd4b9f520b6c65c2b97ecd8ee38;p=git.git diff --git a/merge-index.c b/merge-index.c index 727527fd5..fa719cb0b 100644 --- a/merge-index.c +++ b/merge-index.c @@ -1,32 +1,17 @@ -#include -#include - #include "cache.h" +#include "run-command.h" -static const char *pgm = NULL; -static const char *arguments[8]; +static const char *pgm; +static const char *arguments[9]; static int one_shot, quiet; static int err; static void run_program(void) { - int pid = fork(), status; - - if (pid < 0) - die("unable to fork"); - if (!pid) { - execlp(pgm, arguments[0], - arguments[1], - arguments[2], - arguments[3], - arguments[4], - arguments[5], - arguments[6], - arguments[7], - NULL); - die("unable to execute '%s'", pgm); - } - if (waitpid(pid, &status, 0) < 0 || !WIFEXITED(status) || WEXITSTATUS(status)) { + struct child_process child; + memset(&child, 0, sizeof(child)); + child.argv = arguments; + if (run_command(&child)) { if (one_shot) { err++; } else { @@ -40,7 +25,7 @@ static void run_program(void) static int merge_entry(int pos, const char *path) { int found; - + if (pos >= active_nr) die("git-merge-index: %s not in the cache", path); arguments[0] = pgm; @@ -51,6 +36,7 @@ static int merge_entry(int pos, const char *path) arguments[5] = ""; arguments[6] = ""; arguments[7] = ""; + arguments[8] = NULL; found = 0; do { static char hexbuf[4][60]; @@ -62,7 +48,7 @@ static int merge_entry(int pos, const char *path) break; found++; strcpy(hexbuf[stage], sha1_to_hex(ce->sha1)); - sprintf(ownbuf[stage], "%o", ntohl(ce->ce_mode) & (~S_IFMT)); + sprintf(ownbuf[stage], "%o", ntohl(ce->ce_mode)); arguments[stage] = hexbuf[stage]; arguments[stage + 4] = ownbuf[stage]; } while (++pos < active_nr); @@ -99,9 +85,15 @@ int main(int argc, char **argv) { int i, force_file = 0; + /* Without this we cannot rely on waitpid() to tell + * what happened to our children. + */ + signal(SIGCHLD, SIG_DFL); + if (argc < 3) usage("git-merge-index [-o] [-q] (-a | *)"); + setup_git_directory(); read_cache(); i = 1;