]> git.ipfire.org Git - thirdparty/git.git/commitdiff
grep API: call grep_config() after grep_init()
authorÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Wed, 16 Feb 2022 00:00:36 +0000 (01:00 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 16 Feb 2022 02:00:50 +0000 (18:00 -0800)
The grep_init() function used the odd pattern of initializing the
passed-in "struct grep_opt" with a statically defined "grep_defaults"
struct, which would be modified in-place when we invoked
grep_config().

So we effectively (b) initialized config, (a) then defaults, (c)
followed by user options. Usually those are ordered as "a", "b" and
"c" instead.

As the comments being removed here show the previous behavior needed
to be carefully explained as we'd potentially share the populated
configuration among different instances of grep_init(). In practice we
didn't do that, but now that it can't be a concern anymore let's
remove those comments.

This does not change the behavior of any of the configuration
variables or options. That would have been the case if we didn't move
around the grep_config() call in "builtin/log.c". But now that we call
"grep_config" after "git_log_config" and "git_format_config" we'll
need to pass in the already initialized "struct grep_opt *".

See 6ba9bb76e02 (grep: copy struct in one fell swoop, 2020-11-29) and
7687a0541e0 (grep: move the configuration parsing logic to grep.[ch],
2012-10-09) for the commits that added the comments.

The memcpy() pattern here will be optimized away and follows the
convention of other *_init() functions. See 5726a6b4012 (*.c *_init():
define in terms of corresponding *_INIT macro, 2021-07-01).

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/grep.c
builtin/log.c
grep.c
grep.h

index 5ec4cecae458810592893e5240dca75e0787df29..0ea124321b6b3784b82ea362efa26278df4e2150 100644 (file)
@@ -285,7 +285,7 @@ static int wait_all(void)
 
 static int grep_cmd_config(const char *var, const char *value, void *cb)
 {
-       int st = grep_config(var, value, NULL);
+       int st = grep_config(var, value, cb);
        if (git_color_default_config(var, value, NULL) < 0)
                st = -1;
 
@@ -966,8 +966,8 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
        };
        grep_prefix = prefix;
 
-       git_config(grep_cmd_config, NULL);
        grep_init(&opt, the_repository);
+       git_config(grep_cmd_config, &opt);
 
        /*
         * If there is no -- then the paths must exist in the working
index 4b493408cc5d1253e84fd17dddec58340d38aa7e..06283b37e7a43a5faeca201e1c03f2c1597f200f 100644 (file)
@@ -520,8 +520,6 @@ static int git_log_config(const char *var, const char *value, void *cb)
                return 0;
        }
 
-       if (grep_config(var, value, cb) < 0)
-               return -1;
        if (git_gpg_config(var, value, cb) < 0)
                return -1;
        return git_diff_ui_config(var, value, cb);
@@ -536,6 +534,8 @@ int cmd_whatchanged(int argc, const char **argv, const char *prefix)
        git_config(git_log_config, NULL);
 
        repo_init_revisions(the_repository, &rev, prefix);
+       git_config(grep_config, &rev.grep_filter);
+
        rev.diff = 1;
        rev.simplify_history = 0;
        memset(&opt, 0, sizeof(opt));
@@ -650,6 +650,8 @@ int cmd_show(int argc, const char **argv, const char *prefix)
 
        memset(&match_all, 0, sizeof(match_all));
        repo_init_revisions(the_repository, &rev, prefix);
+       git_config(grep_config, &rev.grep_filter);
+
        rev.diff = 1;
        rev.always_show_header = 1;
        rev.no_walk = 1;
@@ -733,6 +735,8 @@ int cmd_log_reflog(int argc, const char **argv, const char *prefix)
 
        repo_init_revisions(the_repository, &rev, prefix);
        init_reflog_walk(&rev.reflog_info);
+       git_config(grep_config, &rev.grep_filter);
+
        rev.verbose_header = 1;
        memset(&opt, 0, sizeof(opt));
        opt.def = "HEAD";
@@ -766,6 +770,8 @@ int cmd_log(int argc, const char **argv, const char *prefix)
        git_config(git_log_config, NULL);
 
        repo_init_revisions(the_repository, &rev, prefix);
+       git_config(grep_config, &rev.grep_filter);
+
        rev.always_show_header = 1;
        memset(&opt, 0, sizeof(opt));
        opt.def = "HEAD";
@@ -1848,10 +1854,13 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
        extra_hdr.strdup_strings = 1;
        extra_to.strdup_strings = 1;
        extra_cc.strdup_strings = 1;
+
        init_log_defaults();
        init_display_notes(&notes_opt);
        git_config(git_format_config, NULL);
        repo_init_revisions(the_repository, &rev, prefix);
+       git_config(grep_config, &rev.grep_filter);
+
        rev.show_notes = show_notes;
        memcpy(&rev.notes_opt, &notes_opt, sizeof(notes_opt));
        rev.commit_format = CMIT_FMT_EMAIL;
diff --git a/grep.c b/grep.c
index 8421dc55486b90785a936cbc1cd6e5200b36ad56..35e12e43c09fe794b250d1e2264eee684cbd36f1 100644 (file)
--- a/grep.c
+++ b/grep.c
@@ -19,27 +19,6 @@ 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] = GIT_COLOR_MAGENTA,
-               [GREP_COLOR_FUNCTION] = "",
-               [GREP_COLOR_LINENO] = GIT_COLOR_GREEN,
-               [GREP_COLOR_COLUMNNO] = GIT_COLOR_GREEN,
-               [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,
-};
-
 static const char *color_grep_slots[] = {
        [GREP_COLOR_CONTEXT]        = "context",
        [GREP_COLOR_FILENAME]       = "filename",
@@ -75,20 +54,12 @@ define_list_config_array_extra(color_grep_slots, {"match"});
  */
 int grep_config(const char *var, const char *value, void *cb)
 {
-       struct grep_opt *opt = &grep_defaults;
+       struct grep_opt *opt = cb;
        const char *slot;
 
        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;
@@ -134,14 +105,10 @@ int grep_config(const char *var, const char *value, void *cb)
        return 0;
 }
 
-/*
- * Initialize one instance of grep_opt and copy the
- * default values from the template we read the configuration
- * information in an earlier call to git_config(grep_config).
- */
 void grep_init(struct grep_opt *opt, struct repository *repo)
 {
-       *opt = grep_defaults;
+       struct grep_opt blank = GREP_OPT_INIT;
+       memcpy(opt, &blank, sizeof(*opt));
 
        opt->repo = repo;
        opt->pattern_tail = &opt->pattern_list;
diff --git a/grep.h b/grep.h
index 23a2a41d2c47eb161c314bbdaf430553bd98b302..3112d1c2a38333d47af38569e2f42677025711b4 100644 (file)
--- a/grep.h
+++ b/grep.h
@@ -179,6 +179,27 @@ struct grep_opt {
        void *output_priv;
 };
 
+#define GREP_OPT_INIT { \
+       .relative = 1, \
+       .pathname = 1, \
+       .max_depth = -1, \
+       .pattern_type_option = GREP_PATTERN_TYPE_UNSPECIFIED, \
+       .colors = { \
+               [GREP_COLOR_CONTEXT] = "", \
+               [GREP_COLOR_FILENAME] = GIT_COLOR_MAGENTA, \
+               [GREP_COLOR_FUNCTION] = "", \
+               [GREP_COLOR_LINENO] = GIT_COLOR_GREEN, \
+               [GREP_COLOR_COLUMNNO] = GIT_COLOR_GREEN, \
+               [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, \
+}
+
 int grep_config(const char *var, const char *value, void *);
 void grep_init(struct grep_opt *, struct repository *repo);
 void grep_commit_pattern_type(enum grep_pattern_type, struct grep_opt *opt);