To libify `git apply` functionality we have to signal errors to the caller instead of die()ing. As a first step in this direction, let's make apply_patch() return -1 in case of errors instead of dying. For now its only caller apply_all_patches() will exit(1) when apply_patch() return -1. In a later patch, apply_all_patches() will return -1 too instead of exiting. Signed-off-by: Christian Couder <chriscool@xxxxxxxxxxxxx> --- builtin/apply.c | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/builtin/apply.c b/builtin/apply.c index 84ff2da..bc209f5 100644 --- a/builtin/apply.c +++ b/builtin/apply.c @@ -4522,6 +4522,14 @@ static int write_out_results(struct apply_state *state, struct patch *list) #define INACCURATE_EOF (1<<0) #define RECOUNT (1<<1) +/* + * Try to apply a patch. + * + * Returns: + * -1 if an error happened + * 0 if the patch applied + * 1 if the patch did not apply + */ static int apply_patch(struct apply_state *state, int fd, const char *filename, @@ -4564,7 +4572,7 @@ static int apply_patch(struct apply_state *state, } if (!list && !skipped_patch) - die(_("unrecognized input")); + return error(_("unrecognized input")); if (state->whitespace_error && (state->ws_error_action == die_on_ws_error)) state->apply = 0; @@ -4575,19 +4583,17 @@ static int apply_patch(struct apply_state *state, hold_locked_index(state->lock_file, 1); } - if (state->check_index) { - if (read_cache() < 0) - die(_("unable to read index file")); - } + if (state->check_index && read_cache() < 0) + return error(_("unable to read index file")); if ((state->check || state->apply) && check_patch_list(state, list) < 0 && !state->apply_with_reject) - exit(1); + return -1; if (state->apply && write_out_results(state, list)) { if (state->apply_with_reject) - exit(1); + return -1; /* with --3way, we still need to write the index out */ return 1; } @@ -4730,6 +4736,7 @@ static int apply_all_patches(struct apply_state *state, int options) { int i; + int res; int errs = 0; int read_stdin = 1; @@ -4738,7 +4745,10 @@ static int apply_all_patches(struct apply_state *state, int fd; if (!strcmp(arg, "-")) { - errs |= apply_patch(state, 0, "<stdin>", options); + res = apply_patch(state, 0, "<stdin>", options); + if (res < 0) + exit(1); + errs |= res; read_stdin = 0; continue; } else if (0 < state->prefix_length) @@ -4751,12 +4761,19 @@ static int apply_all_patches(struct apply_state *state, die_errno(_("can't open patch '%s'"), arg); read_stdin = 0; set_default_whitespace_mode(state); - errs |= apply_patch(state, fd, arg, options); + res = apply_patch(state, fd, arg, options); + if (res < 0) + exit(1); + errs |= res; close(fd); } set_default_whitespace_mode(state); - if (read_stdin) - errs |= apply_patch(state, 0, "<stdin>", options); + if (read_stdin) { + res = apply_patch(state, 0, "<stdin>", options); + if (res < 0) + exit(1); + errs |= res; + } if (state->whitespace_error) { if (state->squelch_whitespace_errors && -- 2.8.1.300.g5fed0c0 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html