X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=merge-cache.c;h=744681b24fc9a3690b5d10f50b62d5887b8ed7f3;hb=debb9d84445239ffbc630611548af630fb8e1e7a;hp=68ac4ab2d926005a5a729017c1bcb70a30634bd8;hpb=e3b4be7f6c31d85b5f6abc42bd24d61bce5027b4;p=git.git diff --git a/merge-cache.c b/merge-cache.c index 68ac4ab2..744681b2 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, quiet; +static int err; static void run_program(void) { @@ -18,11 +20,21 @@ 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"); + if (waitpid(pid, &status, 0) < 0 || !WIFEXITED(status) || WEXITSTATUS(status)) { + if (one_shot) { + err++; + } else { + if (!quiet) + die("merge program failed"); + exit(1); + } + } } static int merge_entry(int pos, const char *path) @@ -30,15 +42,19 @@ static int merge_entry(int pos, const char *path) int found; if (pos >= active_nr) - die("merge-cache: %s not in the cache", path); + die("git-merge-cache: %s not in the cache", path); arguments[0] = pgm; arguments[1] = ""; 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); @@ -46,10 +62,12 @@ 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)); arguments[stage] = hexbuf[stage]; + arguments[stage + 4] = ownbuf[stage]; } while (++pos < active_nr); if (!found) - die("merge-cache: %s not in the cache", path); + die("git-merge-cache: %s not in the cache", path); run_program(); return found; } @@ -82,12 +100,21 @@ int main(int argc, char **argv) int i, force_file = 0; if (argc < 3) - usage("merge-cache (-a | *)"); + usage("git-merge-cache [-o] [-q] (-a | *)"); read_cache(); - pgm = argv[1]; - for (i = 2; i < argc; i++) { + i = 1; + if (!strcmp(argv[i], "-o")) { + one_shot = 1; + i++; + } + if (!strcmp(argv[i], "-q")) { + quiet = 1; + i++; + } + pgm = argv[i++]; + for (; i < argc; i++) { char *arg = argv[i]; if (!force_file && *arg == '-') { if (!strcmp(arg, "--")) { @@ -98,9 +125,11 @@ int main(int argc, char **argv) merge_all(); continue; } - die("merge-cache: unknown option %s", arg); + die("git-merge-cache: unknown option %s", arg); } merge_file(arg); } - return 0; + if (err && !quiet) + die("merge program failed"); + return err; }