builtin/apply: make add_conflicted_stages_file() return -1 on error
[gitweb.git] / apply.c
diff --git a/apply.c b/apply.c
index c858ca4be9aab155a280d659b134fab8f98c2fab..2eac3e37a91402e0b26689fc5bee117f9f4fce23 100644 (file)
--- a/apply.c
+++ b/apply.c
@@ -55,9 +55,9 @@ int parse_ignorewhitespace_option(struct apply_state *state,
        return error(_("unrecognized whitespace ignore option '%s'"), option);
 }
 
-void init_apply_state(struct apply_state *state,
-                     const char *prefix,
-                     struct lock_file *lock_file)
+int init_apply_state(struct apply_state *state,
+                    const char *prefix,
+                    struct lock_file *lock_file)
 {
        memset(state, 0, sizeof(*state));
        state->prefix = prefix;
@@ -79,9 +79,10 @@ void init_apply_state(struct apply_state *state,
 
        git_apply_config();
        if (apply_default_whitespace && parse_whitespace_option(state, apply_default_whitespace))
-               exit(1);
+               return -1;
        if (apply_default_ignorewhitespace && parse_ignorewhitespace_option(state, apply_default_ignorewhitespace))
-               exit(1);
+               return -1;
+       return 0;
 }
 
 void clear_apply_state(struct apply_state *state)
@@ -92,3 +93,35 @@ void clear_apply_state(struct apply_state *state)
 
        /* &state->fn_table is cleared at the end of apply_patch() */
 }
+
+int check_apply_state(struct apply_state *state, int force_apply)
+{
+       int is_not_gitdir = !startup_info->have_repository;
+
+       if (state->apply_with_reject && state->threeway)
+               return error("--reject and --3way cannot be used together.");
+       if (state->cached && state->threeway)
+               return error("--cached and --3way cannot be used together.");
+       if (state->threeway) {
+               if (is_not_gitdir)
+                       return error(_("--3way outside a repository"));
+               state->check_index = 1;
+       }
+       if (state->apply_with_reject)
+               state->apply = state->apply_verbosely = 1;
+       if (!force_apply && (state->diffstat || state->numstat || state->summary || state->check || state->fake_ancestor))
+               state->apply = 0;
+       if (state->check_index && is_not_gitdir)
+               return error(_("--index outside a repository"));
+       if (state->cached) {
+               if (is_not_gitdir)
+                       return error(_("--cached outside a repository"));
+               state->check_index = 1;
+       }
+       if (state->check_index)
+               state->unsafe_paths = 0;
+       if (!state->lock_file)
+               return error("BUG: state->lock_file should not be NULL");
+
+       return 0;
+}