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 <chrisc...@tuxfamily.org>
---
 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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to