Re: [PATCH/RFC] grep: add a perlRegexp configuration option

2 messages, 2 authors, 2016-06-15 · open the first message on its own page

Re: [PATCH/RFC] grep: add a perlRegexp configuration option

From: Junio C Hamano <hidden>
Date: 2016-06-15 22:54:23

J Smith [off-list ref] writes:
Enables the -P flag for perl regexps by default. When both the
perlRegexp and extendedRegexp options are enabled, the last enabled
option wins.
Turning "grep.extendedregexp" from boolean to an extended boolean to
allow "grep.extendedregexp = perl" might be a better alternative.
That way, the user wouldn't have to worry about 7 variants of
grep.fooRegexp variables twenty years down the road, even though the
set of possible values given to "grep.extendedregexp" may have grown
over time by then.
quoted hunk
---
 Documentation/config.txt   |  6 ++++++
 Documentation/git-grep.txt |  6 ++++++
 builtin/grep.c             | 17 +++++++++++++++--
 t/t7810-grep.sh            | 34 ++++++++++++++++++++++++++++++++++
 4 files changed, 61 insertions(+), 2 deletions(-)
diff --git a/Documentation/config.txt b/Documentation/config.txt
index a95e5a4..ff3019b 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -1213,6 +1213,12 @@ grep.lineNumber::
 grep.extendedRegexp::
 	If set to true, enable '--extended-regexp' option by default.

+grep.perlRegexp::
+	If set to true, enable '--perl-regexp' option by default.
+
+When both the 'grep.extendedRegexp' and 'grep.perlRegexp' options
+are used, the last enabled option wins.
+
 gpg.program::
 	Use this custom program instead of "gpg" found on $PATH when
 	making or verifying a PGP signature. The program must support the
diff --git a/Documentation/git-grep.txt b/Documentation/git-grep.txt
index 3bec036..8816968 100644
--- a/Documentation/git-grep.txt
+++ b/Documentation/git-grep.txt
@@ -45,6 +45,12 @@ grep.lineNumber::
 grep.extendedRegexp::
 	If set to true, enable '--extended-regexp' option by default.

+grep.perlRegexp::
+	If set to true, enable '--perl-regexp' option by default.
+
+When both the 'grep.extendedRegexp' and 'grep.perlRegexp' options
+are used, the last enabled option wins.
+

 OPTIONS
 -------
diff --git a/builtin/grep.c b/builtin/grep.c
index 29adb0a..b4475e6 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -268,11 +268,24 @@ static int grep_config(const char *var, const char *value, void *cb)
 	if (userdiff_config(var, value) < 0)
 		return -1;

+	if (!strcmp(var, "grep.perlregexp")) {
+		if (git_config_bool(var, value)) {
+			opt->fixed = 0;
+			opt->pcre = 1;
+		} else {
+			opt->pcre = 0;
+		}
+		return 0;
+	}
+
 	if (!strcmp(var, "grep.extendedregexp")) {
-		if (git_config_bool(var, value))
+		if (git_config_bool(var, value)) {
 			opt->regflags |= REG_EXTENDED;
-		else
+			opt->pcre = 0;
+			opt->fixed = 0;
+		} else {
 			opt->regflags &= ~REG_EXTENDED;
+		}
 		return 0;
 	}
diff --git a/t/t7810-grep.sh b/t/t7810-grep.sh
index 24e9b19..5479dc9 100755
--- a/t/t7810-grep.sh
+++ b/t/t7810-grep.sh
@@ -729,6 +729,40 @@ test_expect_success LIBPCRE 'grep -P pattern' '
 	test_cmp expected actual
 '

+test_expect_success LIBPCRE 'grep pattern with grep.perlRegexp=true' '
+	git \
+		-c grep.perlregexp=true \
+		grep "\p{Ps}.*?\p{Pe}" hello.c >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success LIBPCRE 'grep pattern with grep.perlRegexp=true and then grep.extendedRegexp=true' '
+	test_must_fail git \
+		-c grep.perlregexp=true \
+		-c grep.extendedregexp=true \
+		grep "\p{Ps}.*?\p{Pe}" hello.c
+'
+
+test_expect_success LIBPCRE 'grep pattern with grep.extendedRegexp=true and then grep.perlRegexp=true' '
+	git \
+		-c grep.extendedregexp=true \
+		-c grep.perlregexp=true \
+		grep "\p{Ps}.*?\p{Pe}" hello.c >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success LIBPCRE 'grep -E pattern with grep.perlRegexp=true' '
+	test_must_fail git \
+		-c grep.perlregexp=true \
+		grep -E "\p{Ps}.*?\p{Pe}" hello.c
+'
+
+test_expect_success LIBPCRE 'grep -G pattern with grep.perlRegexp=true' '
+	test_must_fail git \
+		-c grep.perlregexp=true \
+		grep -G "\p{Ps}.*?\p{Pe}" hello.c
+'
+
 test_expect_success 'grep pattern with grep.extendedRegexp=true' '
 	>empty &&
 	test_must_fail git -c grep.extendedregexp=true \
--
1.7.11.3

Re: [PATCH/RFC] grep: add a perlRegexp configuration option

From: J Smith <hidden>
Date: 2016-06-15 22:54:23

On Tue, Jul 31, 2012 at 2:04 PM, Junio C Hamano [off-list ref] wrote:
Turning "grep.extendedregexp" from boolean to an extended boolean to
allow "grep.extendedregexp = perl" might be a better alternative.
That way, the user wouldn't have to worry about 7 variants of
grep.fooRegexp variables twenty years down the road, even though the
set of possible values given to "grep.extendedregexp" may have grown
over time by then.
Yeah, that sounds good. I've re-written the patch to accommodate the
change allowing for the current boolean settings of true/false as well
as "perl". For the sake of completeness (verbosity? pedantry?) I also
included a setting for "extended" which is equivalent to true.

With this sort of change, would a more generic "grep.regexpMode",
"grep.patternType" or something similar perhaps be more descriptive,
with "grep.extendedRegexp" being aliased for backwards compatibility
purposes? I could also add that functionality if desired.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help