]> git.ipfire.org Git - thirdparty/git.git/blobdiff - grep.c
config: improve error message for boolean config
[thirdparty/git.git] / grep.c
diff --git a/grep.c b/grep.c
index 54af9f813e99043c723ba4f6e9fd32023d0be655..efeb6dc58dbec7dad4ea715909d92780faa27ee0 100644 (file)
--- a/grep.c
+++ b/grep.c
@@ -14,7 +14,31 @@ static int grep_source_load(struct grep_source *gs);
 static int grep_source_is_binary(struct grep_source *gs,
                                 struct index_state *istate);
 
-static struct grep_opt grep_defaults;
+static void std_output(struct grep_opt *opt, const void *buf, size_t size)
+{
+       fwrite(buf, size, 1, stdout);
+}
+
+static struct grep_opt grep_defaults = {
+       .relative = 1,
+       .pathname = 1,
+       .max_depth = -1,
+       .pattern_type_option = GREP_PATTERN_TYPE_UNSPECIFIED,
+       .colors = {
+               [GREP_COLOR_CONTEXT] = "",
+               [GREP_COLOR_FILENAME] = "",
+               [GREP_COLOR_FUNCTION] = "",
+               [GREP_COLOR_LINENO] = "",
+               [GREP_COLOR_COLUMNNO] = "",
+               [GREP_COLOR_MATCH_CONTEXT] = GIT_COLOR_BOLD_RED,
+               [GREP_COLOR_MATCH_SELECTED] = GIT_COLOR_BOLD_RED,
+               [GREP_COLOR_SELECTED] = "",
+               [GREP_COLOR_SEP] = GIT_COLOR_CYAN,
+       },
+       .only_matching = 0,
+       .color = -1,
+       .output = std_output,
+};
 
 #ifdef USE_LIBPCRE2
 static pcre2_general_context *pcre2_global_context;
@@ -42,50 +66,6 @@ static const char *color_grep_slots[] = {
        [GREP_COLOR_SEP]            = "separator",
 };
 
-static void std_output(struct grep_opt *opt, const void *buf, size_t size)
-{
-       fwrite(buf, size, 1, stdout);
-}
-
-static void color_set(char *dst, const char *color_bytes)
-{
-       xsnprintf(dst, COLOR_MAXLEN, "%s", color_bytes);
-}
-
-/*
- * Initialize the grep_defaults template with hardcoded defaults.
- * We could let the compiler do this, but without C99 initializers
- * the code gets unwieldy and unreadable, so...
- */
-void init_grep_defaults(struct repository *repo)
-{
-       struct grep_opt *opt = &grep_defaults;
-       static int run_once;
-
-       if (run_once)
-               return;
-       run_once++;
-
-       memset(opt, 0, sizeof(*opt));
-       opt->repo = repo;
-       opt->relative = 1;
-       opt->pathname = 1;
-       opt->max_depth = -1;
-       opt->pattern_type_option = GREP_PATTERN_TYPE_UNSPECIFIED;
-       color_set(opt->colors[GREP_COLOR_CONTEXT], "");
-       color_set(opt->colors[GREP_COLOR_FILENAME], "");
-       color_set(opt->colors[GREP_COLOR_FUNCTION], "");
-       color_set(opt->colors[GREP_COLOR_LINENO], "");
-       color_set(opt->colors[GREP_COLOR_COLUMNNO], "");
-       color_set(opt->colors[GREP_COLOR_MATCH_CONTEXT], GIT_COLOR_BOLD_RED);
-       color_set(opt->colors[GREP_COLOR_MATCH_SELECTED], GIT_COLOR_BOLD_RED);
-       color_set(opt->colors[GREP_COLOR_SELECTED], "");
-       color_set(opt->colors[GREP_COLOR_SEP], GIT_COLOR_CYAN);
-       opt->only_matching = 0;
-       opt->color = -1;
-       opt->output = std_output;
-}
-
 static int parse_pattern_type_arg(const char *opt, const char *arg)
 {
        if (!strcmp(arg, "default"))
@@ -115,6 +95,14 @@ int grep_config(const char *var, const char *value, void *cb)
        if (userdiff_config(var, value) < 0)
                return -1;
 
+       /*
+        * The instance of grep_opt that we set up here is copied by
+        * grep_init() to be used by each individual invocation.
+        * When populating a new field of this structure here, be
+        * sure to think about ownership -- e.g., you might need to
+        * override the shallow copy in grep_init() with a deep copy.
+        */
+
        if (!strcmp(var, "grep.extendedregexp")) {
                opt->extended_regexp_option = git_config_bool(var, value);
                return 0;
@@ -172,9 +160,6 @@ int grep_config(const char *var, const char *value, void *cb)
  */
 void grep_init(struct grep_opt *opt, struct repository *repo, const char *prefix)
 {
-       struct grep_opt *def = &grep_defaults;
-       int i;
-
 #if defined(USE_LIBPCRE2)
        if (!pcre2_global_context)
                pcre2_global_context = pcre2_general_context_create(
@@ -186,26 +171,13 @@ void grep_init(struct grep_opt *opt, struct repository *repo, const char *prefix
        pcre_free = free;
 #endif
 
-       memset(opt, 0, sizeof(*opt));
+       *opt = grep_defaults;
+
        opt->repo = repo;
        opt->prefix = prefix;
        opt->prefix_length = (prefix && *prefix) ? strlen(prefix) : 0;
        opt->pattern_tail = &opt->pattern_list;
        opt->header_tail = &opt->header_list;
-
-       opt->only_matching = def->only_matching;
-       opt->color = def->color;
-       opt->extended_regexp_option = def->extended_regexp_option;
-       opt->pattern_type_option = def->pattern_type_option;
-       opt->linenum = def->linenum;
-       opt->columnnum = def->columnnum;
-       opt->max_depth = def->max_depth;
-       opt->pathname = def->pathname;
-       opt->relative = def->relative;
-       opt->output = def->output;
-
-       for (i = 0; i < NR_GREP_COLORS; i++)
-               color_set(opt->colors[i], def->colors[i]);
 }
 
 void grep_destroy(void)