[PATCH v2 0/8] grep: simplify & delete code by changing obscure cfg variable behavior
- From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- Date
- Nov 10, 2021, 01:43 UTC
- Message-ID
- <cover-v2-0.8-00000000000-20211110T013632Z-avarab@gmail.com>
- In-Reply-To
- <cover-0.8-00000000000-20211106T210711Z-avarab@gmail.com>
This series changes the behavior of an obscure interaction between "grep.extendedRegexp=true" and "grep.patternType=default". See 7-8/8. Along the way we can delete a lot of code that was needed to support the previous behavior.
For v1 and a more extensive summary see [1]. Thanks a lot Taylor for the detailed review on v1!
Hopefully this v1 addresses all the feedback on one way or another, it's still 8 patches, but much of the early part of v1 is squashed together & re-done as suggested.
Then there's a mid-series de-duplication of the grep config documentation. I ended up keeping the change to not needlessly pass "cb" around in grep_cmd_config(), but that's now also in its own patch.
1. https://lore.kernel.org/git/cover-0.8-00000000000-20211106T210711Z-avarab@gmail.com/
Ævar Arnfjörð Bjarmason (8): grep.h: remove unused "regex_t regexp" from grep_opt built-ins: trust the "prefix" from run_builtin() log tests: check if grep_config() is called by "log"-like cmds grep docs: de-duplicate configuration sections grep.c: don't pass along NULL callback value grep API: call grep_config() after grep_init() grep: simplify config parsing, change grep.<rx config> interaction grep: make "extendedRegexp=true" the same as "patternType=extended"
Documentation/config/grep.txt | 11 ++-- Documentation/git-grep.txt | 30 +-------- builtin/grep.c | 27 ++++---- builtin/log.c | 13 +++- builtin/ls-tree.c | 9 ++- git.c | 4 +- grep.c | 118 ++++------------------------------ grep.h | 35 ++++++---- revision.c | 4 +- t/t4202-log.sh | 16 +++++ t/t7810-grep.sh | 4 +- 11 files changed, 97 insertions(+), 174 deletions(-)
Range-diff against v1:
1: 412b8b65266 = 1: 1435db727ef grep.h: remove unused "regex_t regexp" from grep_opt
2: 244715e3497 < -: ----------- git.c & grep.c: assert that "prefix" is NULL or non-zero string
3: 3338cc95b81 < -: ----------- grep: remove unused "prefix_length" member
4: 78298657d69 < -: ----------- grep.c: move "prefix" out of "struct grep_opt"
-: ----------- > 2: 63cf2fe266d built-ins: trust the "prefix" from run_builtin()
5: ba9be0b9283 = 3: 41e38ebb32c log tests: check if grep_config() is called by "log"-like cmds
-: ----------- > 4: efe95397d72 grep docs: de-duplicate configuration sections
-: ----------- > 5: d0f0ac6c7ae grep.c: don't pass along NULL callback value
6: 933ac853bca ! 6: 917944f79a5 grep API: call grep_config() after grep_init()
@@ Commit message
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>
## builtin/grep.c ##
@@ builtin/grep.c: static int wait_all(void)
+
static int grep_cmd_config(const char *var, const char *value, void *cb)
{
- int st = grep_config(var, value, cb);
-- if (git_color_default_config(var, value, cb) < 0)
-+ if (git_color_default_config(var, value, NULL) < 0)
+- 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;
- if (!strcmp(var, "grep.threads")) {
@@ builtin/grep.c: int cmd_grep(int argc, const char **argv, const char *prefix)
- OPT_END()
};
+ grep_prefix = prefix;
- git_config(grep_cmd_config, NULL);
grep_init(&opt, the_repository);
+ git_config(grep_cmd_config, &opt);
- opt.caller_priv = &opt_cmd;
/*
+ * If there is no -- then the paths must exist in the working
## builtin/log.c ##
@@ builtin/log.c: static int git_log_config(const char *var, const char *value, void *cb)
@@ grep.c: int grep_config(const char *var, const char *value, void *cb)
## grep.h ##
@@ grep.h: struct grep_opt {
+ int show_hunk_mark;
+ int file_break;
+ int heading;
++ void *caller_priv;
+ void *priv;
+
+ void (*output)(struct grep_opt *opt, const void *data, size_t size);
void *output_priv;
};
7: 677a8f8520f ! 7: 140a7416223 grep: simplify config parsing, change grep.<rx config> interaction
@@ Commit message
but in a way that's consistent with how we parse other
configuration.
- Pedantically speaking we're probably breaking past promises here, but
- I doubt that this will impact anyone in practice. The reduction in
- complexity and resulting consistency with other default config
- behavior is worth it.
+ We are breaking past promises here, but I doubt that this will impact
+ anyone in practice. The reduction in complexity and resulting
+ consistency with other default config behavior is worth it.
When "grep.patternType" was introduced in 84befcd0a4a (grep: add a
grep.patternType configuration setting, 2012-08-03) we made two
@@ Commit message
# BRE grep
git -c grep.extendedRegexp=true -c grep.patternType=basic grep <pattern>
- But probably not for this to ignore the new "grep.patternType" option
- entirely, say if /etc/gitconfig was still setting
+ But probably not for this to ignore the favored "grep.patternType"
+ option entirely, say if /etc/gitconfig was still setting
"grep.extendedRegexp", but "~/.gitconfig" used the new
"grep.patternType" (and wanted to use the "default" value):
@@ Documentation/config/grep.txt: grep.patternType::
If set to true, enable `--extended-regexp` option by default. This
- option is ignored when the `grep.patternType` option is set to a value
- other than 'default'.
-+ option is ignored when the `grep.patternType` option is set.
-
- grep.threads::
- Number of grep worker threads to use.
-
- ## Documentation/git-grep.txt ##
-@@ Documentation/git-grep.txt: grep.patternType::
-
- grep.extendedRegexp::
- If set to true, enable `--extended-regexp` option by default. This
-- option is ignored when the `grep.patternType` option is set to a value
-- other than 'default'.
+ option is ignored when the `grep.patternType` option is set.
grep.threads::
8: dadd5dff77a ! 8: cc904d93b26 grep: make "extendedRegexp=true" the same as "patternType=extended"
@@ Documentation/config/grep.txt: grep.patternType::
grep.extendedRegexp::
- If set to true, enable `--extended-regexp` option by default. This
- option is ignored when the `grep.patternType` option is set.
-+ Deprecated synonym for 'grep.patternType=extended`.
-
- grep.threads::
- Number of grep worker threads to use.
-
- ## Documentation/git-grep.txt ##
-@@ Documentation/git-grep.txt: grep.patternType::
- value 'default' will return to the default matching behavior.
-
- grep.extendedRegexp::
-- If set to true, enable `--extended-regexp` option by default. This
-- option is ignored when the `grep.patternType` option is set.
+ Deprecated synonym for 'grep.patternType=extended`.
grep.threads::
@@ grep.h: struct grep_opt {
.colors = { \
[GREP_COLOR_CONTEXT] = "", \
[GREP_COLOR_FILENAME] = "", \
-@@ grep.h: struct grep_opt {
- [GREP_COLOR_SELECTED] = "", \
- [GREP_COLOR_SEP] = GIT_COLOR_CYAN, \
- }, \
-- .only_matching = 0, \
- .color = -1, \
- .output = std_output, \
- }
## t/t7810-grep.sh ##
@@ t/t7810-grep.sh: do-- 2.34.0.rc1.741.gab7bfd97031