Subject: [RFC/PATCH] grep: allow scripts to ignore configured pattern type

From: Junio C Hamano <[email-masked]>
Date: Fri, 24 Dec 2021 16:19:13 -0800

We made a mistake to add grep.extendedRegexp configuration variable
long time ago, and made things even worse by introducing an even
more generalized grep.patternType configuration variable.

This was mostly because interactive users were lazy and wanted a way
to declare "I do not live in the ancient age, and my regexps are
always extended" and write "git grep" without having to type three
more letters " -E" on the command line.

But this in turn forces script writers to always specify what kind
of patterns they are writing, because without such command line
override, the interpretation of the patterns they write in their
scripts will be affected by the configuration variables of the user
who is running their script.

Introduce GIT_DISABLE_GREP_PATTERN_CONFIG environment variable that
script writers can set to "true" and export at the very beginning of
their script to defeat grep.extendedRegexp and grep.patternType
configuration variables.

Signed-off-by: Junio C Hamano <[email-masked]>
---

 * This is merely a weather balloon without proper documentation and
   test.  It might be even better idea to make such an environment
   variable to _specify_ what kind of pattern the script uses,
   instead of "we defeat end-user configuration and now we are
   forced to write in basic or have to write -E/-P etc.", which is
   what this patch does.

 grep.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/grep.c b/grep.c
index fe847a0111..0cfb698b51 100644
--- a/grep.c
+++ b/grep.c
@@ -77,10 +77,15 @@ int grep_config(const char *var, const char *value, void *cb)
 {
 	struct grep_opt *opt = &grep_defaults;
 	const char *slot;
+	static int disable_pattern_type_config = -1;
 
 	if (userdiff_config(var, value) < 0)
 		return -1;
 
+	if (disable_pattern_type_config < 0)
+		disable_pattern_type_config =
+			git_env_bool("GIT_DISABLE_GREP_PATTERN_CONFIG", 0);
+
 	/*
 	 * The instance of grep_opt that we set up here is copied by
 	 * grep_init() to be used by each individual invocation.
@@ -90,12 +95,14 @@ int grep_config(const char *var, const char *value, void *cb)
 	 */
 
 	if (!strcmp(var, "grep.extendedregexp")) {
-		opt->extended_regexp_option = git_config_bool(var, value);
+		if (!disable_pattern_type_config)
+			opt->extended_regexp_option = git_config_bool(var, value);
 		return 0;
 	}
 
 	if (!strcmp(var, "grep.patterntype")) {
-		opt->pattern_type_option = parse_pattern_type_arg(var, value);
+		if (!disable_pattern_type_config)
+			opt->pattern_type_option = parse_pattern_type_arg(var, value);
 		return 0;
 	}
 
-- 
2.34.1-563-g3368a7891b