On Wed, May 11, 2016 at 9:17 AM, Christian Couder <christian.couder@xxxxxxxxx> wrote: > To libify `git apply` functionality we must make init_apply_state() > usable outside "builtin/apply.c". > > Let's do that by moving it into a new "apply.c". Similar to my comment about apply.h and 'struct apply_state', I can easily see apply.c introduced very early in the conversion. In fact, I'd imagine apply.c and apply.h being introduced by the same patch, with that patch placing init_apply_state() in apply.c and 'struct apply_state' in apply.h. However, I see that you're moving other functions, as well, which already existed in builtin/apply.c, so I guess that's why introduction of apply.c waited until this step. > Helped-by: Eric Sunshine <sunshine@xxxxxxxxxxxxxx> > Signed-off-by: Christian Couder <chriscool@xxxxxxxxxxxxx> > --- > diff --git a/apply.c b/apply.c > @@ -0,0 +1,83 @@ > +#include "cache.h" > +#include "lockfile.h" > +#include "apply.h" > + > +static void git_apply_config(void) > +{ > + git_config_get_string_const("apply.whitespace", &apply_default_whitespace); > + git_config_get_string_const("apply.ignorewhitespace", &apply_default_ignorewhitespace); > + git_config(git_default_config, NULL); > +} > + > +int parse_whitespace_option(struct apply_state *state, const char *option) > +{ > + if (!option) { > + state->ws_error_action = warn_on_ws_error; > + return 0; > + } > + if (!strcmp(option, "warn")) { > + state->ws_error_action = warn_on_ws_error; > + return 0; > + } > + if (!strcmp(option, "nowarn")) { > + state->ws_error_action = nowarn_ws_error; > + return 0; > + } > + if (!strcmp(option, "error")) { > + state->ws_error_action = die_on_ws_error; > + return 0; > + } > + if (!strcmp(option, "error-all")) { > + state->ws_error_action = die_on_ws_error; > + state->squelch_whitespace_errors = 0; > + return 0; > + } > + if (!strcmp(option, "strip") || !strcmp(option, "fix")) { > + state->ws_error_action = correct_ws_error; > + return 0; > + } > + return error(_("unrecognized whitespace option '%s'"), option); > +} > + > +int parse_ignorewhitespace_option(struct apply_state *state, > + const char *option) > +{ > + if (!option || !strcmp(option, "no") || > + !strcmp(option, "false") || !strcmp(option, "never") || > + !strcmp(option, "none")) { > + state->ws_ignore_action = ignore_ws_none; > + return 0; > + } > + if (!strcmp(option, "change")) { > + state->ws_ignore_action = ignore_ws_change; > + return 0; > + } > + return error(_("unrecognized whitespace ignore option '%s'"), option); > +} > + > +void init_apply_state(struct apply_state *state, > + const char *prefix, > + struct lock_file *lock_file) > +{ > + memset(state, 0, sizeof(*state)); > + state->prefix = prefix; > + state->prefix_length = state->prefix ? strlen(state->prefix) : 0; > + state->lock_file = lock_file ? lock_file : xcalloc(1, sizeof(*lock_file)); > + state->newfd = -1; > + state->apply = 1; > + state->line_termination = '\n'; > + state->p_value = 1; > + state->p_context = UINT_MAX; > + state->squelch_whitespace_errors = 5; > + state->ws_error_action = warn_on_ws_error; > + state->ws_ignore_action = ignore_ws_none; > + state->linenr = 1; > + strbuf_init(&state->root, 0); > + > + git_apply_config(); > + if (apply_default_whitespace && parse_whitespace_option(state, apply_default_whitespace)) > + exit(1); > + if (apply_default_ignorewhitespace && parse_ignorewhitespace_option(state, apply_default_ignorewhitespace)) > + exit(1); > +} > + > diff --git a/apply.h b/apply.h > index aa11ea6..0f77f4d 100644 > --- a/apply.h > +++ b/apply.h > @@ -112,4 +112,13 @@ struct apply_state { > enum ws_ignore ws_ignore_action; > }; > > +extern int parse_whitespace_option(struct apply_state *state, > + const char *option); > +extern int parse_ignorewhitespace_option(struct apply_state *state, > + const char *option); > + > +extern void init_apply_state(struct apply_state *state, > + const char *prefix, > + struct lock_file *lock_file); > + > #endif -- 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