Remove support for v1 of the PCRE library

Remove support for using version 1 of the PCRE library. Its use has
been discouraged by upstream for a long time, and it's in a
bugfix-only state.

Anyone who was relying on v1 in particular got a nudge to move to v2
in e6c531b808 (Makefile: make USE_LIBPCRE=YesPlease mean v2, not v1,
2018-03-11), which was first released as part of v2.18.0.

With this the LIBPCRE2 test prerequisites is redundant to PCRE. But
I'm keeping it for self-documentation purposes, and to avoid conflict
with other in-flight PCRE patches.

I'm also not changing all of our own "pcre2" names to "pcre", i.e. the
inverse of 6d4b5747f0 (grep: change internal *pcre* variable &
function names to be *pcre1*, 2017-05-25). I don't see the point, and
it makes the history/blame harder to read. Maybe if there's ever a
PCRE v3...

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Ævar Arnfjörð Bjarmason 2021-01-24 02:58:33 +01:00 committed by Junio C Hamano
parent 0205bb13d0
commit 7599730b7e
7 changed files with 18 additions and 217 deletions

View file

@ -29,18 +29,11 @@ all::
# Perl-compatible regular expressions instead of standard or extended # Perl-compatible regular expressions instead of standard or extended
# POSIX regular expressions. # POSIX regular expressions.
# #
# USE_LIBPCRE is a synonym for USE_LIBPCRE2, define USE_LIBPCRE1 # Only libpcre version 2 is supported. USE_LIBPCRE2 is a synonym for
# instead if you'd like to use the legacy version 1 of the PCRE # USE_LIBPCRE, support for the old USE_LIBPCRE1 has been removed.
# library. Support for version 1 will likely be removed in some future
# release of Git, as upstream has all but abandoned it.
#
# When using USE_LIBPCRE1, define NO_LIBPCRE1_JIT if you want to
# disable JIT even if supported by your library.
# #
# Define LIBPCREDIR=/foo/bar if your PCRE header and library files are # Define LIBPCREDIR=/foo/bar if your PCRE header and library files are
# in /foo/bar/include and /foo/bar/lib directories. Which version of # in /foo/bar/include and /foo/bar/lib directories.
# PCRE this points to determined by the USE_LIBPCRE1 and USE_LIBPCRE2
# variables.
# #
# Define HAVE_ALLOCA_H if you have working alloca(3) defined in that header. # Define HAVE_ALLOCA_H if you have working alloca(3) defined in that header.
# #
@ -1359,26 +1352,17 @@ ifdef NO_LIBGEN_H
COMPAT_OBJS += compat/basename.o COMPAT_OBJS += compat/basename.o
endif endif
ifdef USE_LIBPCRE1
$(error The USE_LIBPCRE1 build option has been removed, use version 2 with USE_LIBPCRE)
endif
USE_LIBPCRE2 ?= $(USE_LIBPCRE) USE_LIBPCRE2 ?= $(USE_LIBPCRE)
ifneq (,$(USE_LIBPCRE2)) ifneq (,$(USE_LIBPCRE2))
ifdef USE_LIBPCRE1
$(error Only set USE_LIBPCRE2 (or its alias USE_LIBPCRE) or USE_LIBPCRE1, not both!)
endif
BASIC_CFLAGS += -DUSE_LIBPCRE2 BASIC_CFLAGS += -DUSE_LIBPCRE2
EXTLIBS += -lpcre2-8 EXTLIBS += -lpcre2-8
endif endif
ifdef USE_LIBPCRE1
BASIC_CFLAGS += -DUSE_LIBPCRE1
EXTLIBS += -lpcre
ifdef NO_LIBPCRE1_JIT
BASIC_CFLAGS += -DNO_LIBPCRE1_JIT
endif
endif
ifdef LIBPCREDIR ifdef LIBPCREDIR
BASIC_CFLAGS += -I$(LIBPCREDIR)/include BASIC_CFLAGS += -I$(LIBPCREDIR)/include
EXTLIBS += -L$(LIBPCREDIR)/$(lib) $(CC_LD_DYNPATH)$(LIBPCREDIR)/$(lib) EXTLIBS += -L$(LIBPCREDIR)/$(lib) $(CC_LD_DYNPATH)$(LIBPCREDIR)/$(lib)
@ -2726,9 +2710,7 @@ GIT-BUILD-OPTIONS: FORCE
@echo TAR=\''$(subst ','\'',$(subst ','\'',$(TAR)))'\' >>$@+ @echo TAR=\''$(subst ','\'',$(subst ','\'',$(TAR)))'\' >>$@+
@echo NO_CURL=\''$(subst ','\'',$(subst ','\'',$(NO_CURL)))'\' >>$@+ @echo NO_CURL=\''$(subst ','\'',$(subst ','\'',$(NO_CURL)))'\' >>$@+
@echo NO_EXPAT=\''$(subst ','\'',$(subst ','\'',$(NO_EXPAT)))'\' >>$@+ @echo NO_EXPAT=\''$(subst ','\'',$(subst ','\'',$(NO_EXPAT)))'\' >>$@+
@echo USE_LIBPCRE1=\''$(subst ','\'',$(subst ','\'',$(USE_LIBPCRE1)))'\' >>$@+
@echo USE_LIBPCRE2=\''$(subst ','\'',$(subst ','\'',$(USE_LIBPCRE2)))'\' >>$@+ @echo USE_LIBPCRE2=\''$(subst ','\'',$(subst ','\'',$(USE_LIBPCRE2)))'\' >>$@+
@echo NO_LIBPCRE1_JIT=\''$(subst ','\'',$(subst ','\'',$(NO_LIBPCRE1_JIT)))'\' >>$@+
@echo NO_PERL=\''$(subst ','\'',$(subst ','\'',$(NO_PERL)))'\' >>$@+ @echo NO_PERL=\''$(subst ','\'',$(subst ','\'',$(NO_PERL)))'\' >>$@+
@echo NO_PTHREADS=\''$(subst ','\'',$(subst ','\'',$(NO_PTHREADS)))'\' >>$@+ @echo NO_PTHREADS=\''$(subst ','\'',$(subst ','\'',$(NO_PTHREADS)))'\' >>$@+
@echo NO_PYTHON=\''$(subst ','\'',$(subst ','\'',$(NO_PYTHON)))'\' >>$@+ @echo NO_PYTHON=\''$(subst ','\'',$(subst ','\'',$(NO_PYTHON)))'\' >>$@+

View file

@ -252,16 +252,17 @@ GIT_PARSE_WITH([openssl]))
# Define USE_LIBPCRE if you have and want to use libpcre. Various # Define USE_LIBPCRE if you have and want to use libpcre. Various
# commands such as log and grep offer runtime options to use # commands such as log and grep offer runtime options to use
# Perl-compatible regular expressions instead of standard or extended # Perl-compatible regular expressions instead of standard or extended
# POSIX regular expressions. # POSIX regular expressions. Only libpcre version 2 is supported.
#
# USE_LIBPCRE is a synonym for USE_LIBPCRE2, define USE_LIBPCRE1
# instead if you'd like to use the legacy version 1 of the PCRE
# library. Support for version 1 will likely be removed in some future
# release of Git, as upstream has all but abandoned it.
# #
# Define LIBPCREDIR=/foo/bar if your PCRE header and library files are in # Define LIBPCREDIR=/foo/bar if your PCRE header and library files are in
# /foo/bar/include and /foo/bar/lib directories. # /foo/bar/include and /foo/bar/lib directories.
# #
AC_ARG_WITH(libpcre1,
AS_HELP_STRING([--with-libpcre1],[DEPRECATED]),
AC_MSG_ERROR([support for --with-libpcre1 has been removed. Use --with-libpcre2!])
)
AC_ARG_WITH(libpcre, AC_ARG_WITH(libpcre,
AS_HELP_STRING([--with-libpcre],[synonym for --with-libpcre2]), AS_HELP_STRING([--with-libpcre],[synonym for --with-libpcre2]),
if test "$withval" = "no"; then if test "$withval" = "no"; then
@ -277,22 +278,6 @@ AS_HELP_STRING([--with-libpcre],[synonym for --with-libpcre2]),
GIT_CONF_SUBST([LIBPCREDIR]) GIT_CONF_SUBST([LIBPCREDIR])
fi) fi)
AC_ARG_WITH(libpcre1,
AS_HELP_STRING([--with-libpcre1],[support Perl-compatible regexes via libpcre1 (default is NO)])
AS_HELP_STRING([], [ARG can be also prefix for libpcre library and headers]),
if test "$withval" = "no"; then
USE_LIBPCRE1=
elif test "$withval" = "yes"; then
USE_LIBPCRE1=YesPlease
else
USE_LIBPCRE1=YesPlease
LIBPCREDIR=$withval
AC_MSG_NOTICE([Setting LIBPCREDIR to $LIBPCREDIR])
dnl USE_LIBPCRE1 can still be modified below, so don't substitute
dnl it yet.
GIT_CONF_SUBST([LIBPCREDIR])
fi)
AC_ARG_WITH(libpcre2, AC_ARG_WITH(libpcre2,
AS_HELP_STRING([--with-libpcre2],[support Perl-compatible regexes via libpcre2 (default is NO)]) AS_HELP_STRING([--with-libpcre2],[support Perl-compatible regexes via libpcre2 (default is NO)])
AS_HELP_STRING([], [ARG can be also prefix for libpcre library and headers]), AS_HELP_STRING([], [ARG can be also prefix for libpcre library and headers]),
@ -300,10 +285,6 @@ AS_HELP_STRING([], [ARG can be also prefix for libpcre library and hea
AC_MSG_ERROR([Only supply one of --with-libpcre or its synonym --with-libpcre2!]) AC_MSG_ERROR([Only supply one of --with-libpcre or its synonym --with-libpcre2!])
fi fi
if test -n "$USE_LIBPCRE1"; then
AC_MSG_ERROR([Only supply one of --with-libpcre1 or --with-libpcre2!])
fi
if test "$withval" = "no"; then if test "$withval" = "no"; then
USE_LIBPCRE2= USE_LIBPCRE2=
elif test "$withval" = "yes"; then elif test "$withval" = "yes"; then
@ -554,25 +535,9 @@ GIT_CONF_SUBST([NEEDS_SSL_WITH_CRYPTO])
GIT_CONF_SUBST([NO_OPENSSL]) GIT_CONF_SUBST([NO_OPENSSL])
# #
# Handle the USE_LIBPCRE1 and USE_LIBPCRE2 options potentially set # Handle the USE_LIBPCRE options potentially set above.
# above.
# #
if test -n "$USE_LIBPCRE1"; then
GIT_STASH_FLAGS($LIBPCREDIR)
AC_CHECK_LIB([pcre], [pcre_version],
[USE_LIBPCRE1=YesPlease],
[USE_LIBPCRE1=])
GIT_UNSTASH_FLAGS($LIBPCREDIR)
GIT_CONF_SUBST([USE_LIBPCRE1])
fi
if test -n "$USE_LIBPCRE2"; then if test -n "$USE_LIBPCRE2"; then
GIT_STASH_FLAGS($LIBPCREDIR) GIT_STASH_FLAGS($LIBPCREDIR)

View file

@ -910,9 +910,7 @@ set(PYTHON_PATH /usr/bin/python)
set(TAR tar) set(TAR tar)
set(NO_CURL ) set(NO_CURL )
set(NO_EXPAT ) set(NO_EXPAT )
set(USE_LIBPCRE1 )
set(USE_LIBPCRE2 ) set(USE_LIBPCRE2 )
set(NO_LIBPCRE1_JIT )
set(NO_PERL ) set(NO_PERL )
set(NO_PTHREADS ) set(NO_PTHREADS )
set(NO_PYTHON ) set(NO_PYTHON )
@ -949,8 +947,6 @@ file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "PYTHON_PATH='${PYTHON_PATH}'\
file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "TAR='${TAR}'\n") file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "TAR='${TAR}'\n")
file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "NO_CURL='${NO_CURL}'\n") file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "NO_CURL='${NO_CURL}'\n")
file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "NO_EXPAT='${NO_EXPAT}'\n") file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "NO_EXPAT='${NO_EXPAT}'\n")
file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "USE_LIBPCRE1='${USE_LIBPCRE1}'\n")
file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "NO_LIBPCRE1_JIT='${NO_LIBPCRE1_JIT}'\n")
file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "NO_PERL='${NO_PERL}'\n") file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "NO_PERL='${NO_PERL}'\n")
file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "NO_PTHREADS='${NO_PTHREADS}'\n") file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "NO_PTHREADS='${NO_PTHREADS}'\n")
file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "NO_UNIX_SOCKETS='${NO_UNIX_SOCKETS}'\n") file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "NO_UNIX_SOCKETS='${NO_UNIX_SOCKETS}'\n")

119
grep.c
View file

@ -166,11 +166,6 @@ void grep_init(struct grep_opt *opt, struct repository *repo, const char *prefix
pcre2_malloc, pcre2_free, NULL); pcre2_malloc, pcre2_free, NULL);
#endif #endif
#ifdef USE_LIBPCRE1
pcre_malloc = malloc;
pcre_free = free;
#endif
*opt = grep_defaults; *opt = grep_defaults;
opt->repo = repo; opt->repo = repo;
@ -223,17 +218,7 @@ static void grep_set_pattern_type_option(enum grep_pattern_type pattern_type, st
break; break;
case GREP_PATTERN_TYPE_PCRE: case GREP_PATTERN_TYPE_PCRE:
#ifdef USE_LIBPCRE2
opt->pcre2 = 1; opt->pcre2 = 1;
#else
/*
* It's important that pcre1 always be assigned to
* even when there's no USE_LIBPCRE* defined. We still
* call the PCRE stub function, it just dies with
* "cannot use Perl-compatible regexes[...]".
*/
opt->pcre1 = 1;
#endif
break; break;
} }
} }
@ -377,92 +362,6 @@ static int is_fixed(const char *s, size_t len)
return 1; return 1;
} }
#ifdef USE_LIBPCRE1
static void compile_pcre1_regexp(struct grep_pat *p, const struct grep_opt *opt)
{
const char *error;
int erroffset;
int options = PCRE_MULTILINE;
int study_options = 0;
if (opt->ignore_case) {
if (!opt->ignore_locale && has_non_ascii(p->pattern))
p->pcre1_tables = pcre_maketables();
options |= PCRE_CASELESS;
}
if (!opt->ignore_locale && is_utf8_locale() && has_non_ascii(p->pattern))
options |= PCRE_UTF8;
p->pcre1_regexp = pcre_compile(p->pattern, options, &error, &erroffset,
p->pcre1_tables);
if (!p->pcre1_regexp)
compile_regexp_failed(p, error);
#if defined(PCRE_CONFIG_JIT) && !defined(NO_LIBPCRE1_JIT)
pcre_config(PCRE_CONFIG_JIT, &p->pcre1_jit_on);
if (opt->debug)
fprintf(stderr, "pcre1_jit_on=%d\n", p->pcre1_jit_on);
if (p->pcre1_jit_on)
study_options = PCRE_STUDY_JIT_COMPILE;
#endif
p->pcre1_extra_info = pcre_study(p->pcre1_regexp, study_options, &error);
if (!p->pcre1_extra_info && error)
die("%s", error);
}
static int pcre1match(struct grep_pat *p, const char *line, const char *eol,
regmatch_t *match, int eflags)
{
int ovector[30], ret, flags = PCRE_NO_UTF8_CHECK;
if (eflags & REG_NOTBOL)
flags |= PCRE_NOTBOL;
ret = pcre_exec(p->pcre1_regexp, p->pcre1_extra_info, line,
eol - line, 0, flags, ovector,
ARRAY_SIZE(ovector));
if (ret < 0 && ret != PCRE_ERROR_NOMATCH)
die("pcre_exec failed with error code %d", ret);
if (ret > 0) {
ret = 0;
match->rm_so = ovector[0];
match->rm_eo = ovector[1];
}
return ret;
}
static void free_pcre1_regexp(struct grep_pat *p)
{
pcre_free(p->pcre1_regexp);
#ifdef PCRE_CONFIG_JIT
if (p->pcre1_jit_on)
pcre_free_study(p->pcre1_extra_info);
else
#endif
pcre_free(p->pcre1_extra_info);
pcre_free((void *)p->pcre1_tables);
}
#else /* !USE_LIBPCRE1 */
static void compile_pcre1_regexp(struct grep_pat *p, const struct grep_opt *opt)
{
die("cannot use Perl-compatible regexes when not compiled with USE_LIBPCRE");
}
static int pcre1match(struct grep_pat *p, const char *line, const char *eol,
regmatch_t *match, int eflags)
{
return 1;
}
static void free_pcre1_regexp(struct grep_pat *p)
{
}
#endif /* !USE_LIBPCRE1 */
#ifdef USE_LIBPCRE2 #ifdef USE_LIBPCRE2
static void compile_pcre2_pattern(struct grep_pat *p, const struct grep_opt *opt) static void compile_pcre2_pattern(struct grep_pat *p, const struct grep_opt *opt)
{ {
@ -588,11 +487,6 @@ static void free_pcre2_pattern(struct grep_pat *p)
#else /* !USE_LIBPCRE2 */ #else /* !USE_LIBPCRE2 */
static void compile_pcre2_pattern(struct grep_pat *p, const struct grep_opt *opt) static void compile_pcre2_pattern(struct grep_pat *p, const struct grep_opt *opt)
{ {
/*
* Unreachable until USE_LIBPCRE2 becomes synonymous with
* USE_LIBPCRE. See the sibling comment in
* grep_set_pattern_type_option().
*/
die("cannot use Perl-compatible regexes when not compiled with USE_LIBPCRE"); die("cannot use Perl-compatible regexes when not compiled with USE_LIBPCRE");
} }
@ -693,11 +587,6 @@ static void compile_regexp(struct grep_pat *p, struct grep_opt *opt)
return; return;
} }
if (opt->pcre1) {
compile_pcre1_regexp(p, opt);
return;
}
if (p->ignore_case) if (p->ignore_case)
regflags |= REG_ICASE; regflags |= REG_ICASE;
if (opt->extended_regexp_option) if (opt->extended_regexp_option)
@ -1051,9 +940,7 @@ void free_grep_patterns(struct grep_opt *opt)
case GREP_PATTERN: /* atom */ case GREP_PATTERN: /* atom */
case GREP_PATTERN_HEAD: case GREP_PATTERN_HEAD:
case GREP_PATTERN_BODY: case GREP_PATTERN_BODY:
if (p->pcre1_regexp) if (p->pcre2_pattern)
free_pcre1_regexp(p);
else if (p->pcre2_pattern)
free_pcre2_pattern(p); free_pcre2_pattern(p);
else else
regfree(&p->regexp); regfree(&p->regexp);
@ -1116,9 +1003,7 @@ static int patmatch(struct grep_pat *p, char *line, char *eol,
{ {
int hit; int hit;
if (p->pcre1_regexp) if (p->pcre2_pattern)
hit = !pcre1match(p, line, eol, match, eflags);
else if (p->pcre2_pattern)
hit = !pcre2match(p, line, eol, match, eflags); hit = !pcre2match(p, line, eol, match, eflags);
else else
hit = !regexec_buf(&p->regexp, line, eol - line, 1, match, hit = !regexec_buf(&p->regexp, line, eol - line, 1, match,

14
grep.h
View file

@ -1,15 +1,6 @@
#ifndef GREP_H #ifndef GREP_H
#define GREP_H #define GREP_H
#include "color.h" #include "color.h"
#ifdef USE_LIBPCRE1
#include <pcre.h>
#ifndef PCRE_NO_UTF8_CHECK
#define PCRE_NO_UTF8_CHECK 0
#endif
#else
typedef int pcre;
typedef int pcre_extra;
#endif
#ifdef USE_LIBPCRE2 #ifdef USE_LIBPCRE2
#define PCRE2_CODE_UNIT_WIDTH 8 #define PCRE2_CODE_UNIT_WIDTH 8
#include <pcre2.h> #include <pcre2.h>
@ -71,10 +62,6 @@ struct grep_pat {
size_t patternlen; size_t patternlen;
enum grep_header_field field; enum grep_header_field field;
regex_t regexp; regex_t regexp;
pcre *pcre1_regexp;
pcre_extra *pcre1_extra_info;
const unsigned char *pcre1_tables;
int pcre1_jit_on;
pcre2_code *pcre2_pattern; pcre2_code *pcre2_pattern;
pcre2_match_data *pcre2_match_data; pcre2_match_data *pcre2_match_data;
pcre2_compile_context *pcre2_compile_context; pcre2_compile_context *pcre2_compile_context;
@ -144,7 +131,6 @@ struct grep_opt {
int allow_textconv; int allow_textconv;
int extended; int extended;
int use_reflog_filter; int use_reflog_filter;
int pcre1;
int pcre2; int pcre2;
int relative; int relative;
int pathname; int pathname;

View file

@ -1104,18 +1104,6 @@ use these, and "test_set_prereq" for how to define your own.
Git was compiled with support for PCRE. Wrap any tests Git was compiled with support for PCRE. Wrap any tests
that use git-grep --perl-regexp or git-grep -P in these. that use git-grep --perl-regexp or git-grep -P in these.
- LIBPCRE1
Git was compiled with PCRE v1 support via
USE_LIBPCRE1=YesPlease. Wrap any PCRE using tests that for some
reason need v1 of the PCRE library instead of v2 in these.
- LIBPCRE2
Git was compiled with PCRE v2 support via
USE_LIBPCRE2=YesPlease. Wrap any PCRE using tests that for some
reason need v2 of the PCRE library instead of v1 in these.
- CASE_INSENSITIVE_FS - CASE_INSENSITIVE_FS
Test is run on a case insensitive file system. Test is run on a case insensitive file system.

View file

@ -1524,8 +1524,7 @@ esac
test -z "$NO_PERL" && test_set_prereq PERL test -z "$NO_PERL" && test_set_prereq PERL
test -z "$NO_PTHREADS" && test_set_prereq PTHREADS test -z "$NO_PTHREADS" && test_set_prereq PTHREADS
test -z "$NO_PYTHON" && test_set_prereq PYTHON test -z "$NO_PYTHON" && test_set_prereq PYTHON
test -n "$USE_LIBPCRE1$USE_LIBPCRE2" && test_set_prereq PCRE test -n "$USE_LIBPCRE2" && test_set_prereq PCRE
test -n "$USE_LIBPCRE1" && test_set_prereq LIBPCRE1
test -n "$USE_LIBPCRE2" && test_set_prereq LIBPCRE2 test -n "$USE_LIBPCRE2" && test_set_prereq LIBPCRE2
test -z "$NO_GETTEXT" && test_set_prereq GETTEXT test -z "$NO_GETTEXT" && test_set_prereq GETTEXT