X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=merge-cache.c;h=48412330cb950813b37d7254947a3f70a4fd99d8;hb=dfe070511c652f2b8e1bf6540f238c9ca9ba41d3;hp=3aa391be0a236ea1c432dadcd14824c2fe2b44ea;hpb=75118b13bc8187c629886b108929f996c47daf01;p=git.git diff --git a/merge-cache.c b/merge-cache.c index 3aa391be..48412330 100644 --- a/merge-cache.c +++ b/merge-cache.c @@ -4,7 +4,9 @@ #include "cache.h" static const char *pgm = NULL; -static const char *arguments[5]; +static const char *arguments[8]; +static int one_shot; +static int err; static void run_program(void) { @@ -18,34 +20,18 @@ static void run_program(void) 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)) - die("merge program failed"); -} - -static char *create_temp_file(int stage, unsigned char *sha1) -{ - static char template[4][50]; - char *path = template[stage]; - void *buf; - char type[100]; - unsigned long size; - int fd; - - buf = read_sha1_file(sha1, type, &size); - if (!buf || strcmp(type, "blob")) - die("unable to read blob object %s", sha1_to_hex(sha1)); - - strcpy(path, ".merge_file_XXXXXX"); - fd = mkstemp(path); - if (fd < 0) - die("unable to create temp-file"); - if (write(fd, buf, size) != size) - die("unable to write temp-file"); - close(fd); - return path; + if (waitpid(pid, &status, 0) < 0 || !WIFEXITED(status) || WEXITSTATUS(status)) { + if (one_shot) + err++; + else + die("merge program failed"); + } } static int merge_entry(int pos, const char *path) @@ -59,15 +45,23 @@ static int merge_entry(int pos, const char *path) arguments[2] = ""; arguments[3] = ""; arguments[4] = path; + arguments[5] = ""; + arguments[6] = ""; + arguments[7] = ""; found = 0; do { + static char hexbuf[4][60]; + static char ownbuf[4][60]; struct cache_entry *ce = active_cache[pos]; int stage = ce_stage(ce); if (strcmp(ce->name, path)) break; found++; - arguments[stage] = create_temp_file(stage, ce->sha1); + strcpy(hexbuf[stage], sha1_to_hex(ce->sha1)); + sprintf(ownbuf[stage], "%o", ntohl(ce->ce_mode) & (~S_IFMT)); + arguments[stage] = hexbuf[stage]; + arguments[stage + 4] = ownbuf[stage]; } while (++pos < active_nr); if (!found) die("merge-cache: %s not in the cache", path); @@ -103,12 +97,17 @@ int main(int argc, char **argv) int i, force_file = 0; if (argc < 3) - usage("merge-cache (-a | *)"); + usage("merge-cache [-o] (-a | *)"); read_cache(); - pgm = argv[1]; - for (i = 2; i < argc; i++) { + i = 1; + if (!strcmp(argv[1], "-o")) { + one_shot = 1; + i++; + } + pgm = argv[i++]; + for (; i < argc; i++) { char *arg = argv[i]; if (!force_file && *arg == '-') { if (!strcmp(arg, "--")) { @@ -123,5 +122,7 @@ int main(int argc, char **argv) } merge_file(arg); } + if (err) + die("merge program failed"); return 0; }