Skip to content

Commit

Permalink
Merge branch 'js/grep-patterntype-config'
Browse files Browse the repository at this point in the history
"grep" learned to use a non-standard pattern type by default if a
configuration variable tells it to.

* js/grep-patterntype-config:
  grep: add a grep.patternType configuration setting
  • Loading branch information
gitster committed Aug 27, 2012
2 parents 2df9988 + 84befcd commit 445d2c5
Show file tree
Hide file tree
Showing 5 changed files with 281 additions and 42 deletions.
10 changes: 9 additions & 1 deletion Documentation/config.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1210,8 +1210,16 @@ gitweb.snapshot::
grep.lineNumber::
If set to true, enable '-n' option by default.

grep.patternType::
Set the default matching behavior. Using a value of 'basic', 'extended',
'fixed', or 'perl' will enable the '--basic-regexp', '--extended-regexp',
'--fixed-strings', or '--perl-regexp' option accordingly, while the
value 'default' will return to the default matching behavior.

grep.extendedRegexp::
If set to true, enable '--extended-regexp' option by default.
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'.

gpg.program::
Use this custom program instead of "gpg" found on $PATH when
Expand Down
10 changes: 9 additions & 1 deletion Documentation/git-grep.txt
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,16 @@ CONFIGURATION
grep.lineNumber::
If set to true, enable '-n' option by default.

grep.patternType::
Set the default matching behavior. Using a value of 'basic', 'extended',
'fixed', or 'perl' will enable the '--basic-regexp', '--extended-regexp',
'--fixed-strings', or '--perl-regexp' option accordingly, while the
value 'default' will return to the default matching behavior.

grep.extendedRegexp::
If set to true, enable '--extended-regexp' option by default.
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'.


OPTIONS
Expand Down
112 changes: 72 additions & 40 deletions builtin/grep.c
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,53 @@ static int wait_all(void)
}
#endif

static int parse_pattern_type_arg(const char *opt, const char *arg)
{
if (!strcmp(arg, "default"))
return GREP_PATTERN_TYPE_UNSPECIFIED;
else if (!strcmp(arg, "basic"))
return GREP_PATTERN_TYPE_BRE;
else if (!strcmp(arg, "extended"))
return GREP_PATTERN_TYPE_ERE;
else if (!strcmp(arg, "fixed"))
return GREP_PATTERN_TYPE_FIXED;
else if (!strcmp(arg, "perl"))
return GREP_PATTERN_TYPE_PCRE;
die("bad %s argument: %s", opt, arg);
}

static void grep_pattern_type_options(const int pattern_type, struct grep_opt *opt)
{
switch (pattern_type) {
case GREP_PATTERN_TYPE_UNSPECIFIED:
/* fall through */

case GREP_PATTERN_TYPE_BRE:
opt->fixed = 0;
opt->pcre = 0;
opt->regflags &= ~REG_EXTENDED;
break;

case GREP_PATTERN_TYPE_ERE:
opt->fixed = 0;
opt->pcre = 0;
opt->regflags |= REG_EXTENDED;
break;

case GREP_PATTERN_TYPE_FIXED:
opt->fixed = 1;
opt->pcre = 0;
opt->regflags &= ~REG_EXTENDED;
break;

case GREP_PATTERN_TYPE_PCRE:
opt->fixed = 0;
opt->pcre = 1;
opt->regflags &= ~REG_EXTENDED;
break;
}
}

static int grep_config(const char *var, const char *value, void *cb)
{
struct grep_opt *opt = cb;
Expand All @@ -270,12 +317,17 @@ static int grep_config(const char *var, const char *value, void *cb)

if (!strcmp(var, "grep.extendedregexp")) {
if (git_config_bool(var, value))
opt->regflags |= REG_EXTENDED;
opt->extended_regexp_option = 1;
else
opt->regflags &= ~REG_EXTENDED;
opt->extended_regexp_option = 0;
return 0;
}

if (!strcmp(var, "grep.patterntype")) {
opt->pattern_type_option = parse_pattern_type_arg(var, value);
return 0;
}

if (!strcmp(var, "grep.linenumber")) {
opt->linenum = git_config_bool(var, value);
return 0;
Expand Down Expand Up @@ -669,14 +721,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
int i;
int dummy;
int use_index = 1;
enum {
pattern_type_unspecified = 0,
pattern_type_bre,
pattern_type_ere,
pattern_type_fixed,
pattern_type_pcre,
};
int pattern_type = pattern_type_unspecified;
int pattern_type_arg = GREP_PATTERN_TYPE_UNSPECIFIED;

struct option options[] = {
OPT_BOOLEAN(0, "cached", &cached,
Expand All @@ -703,18 +748,18 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
"descend at most <depth> levels", PARSE_OPT_NONEG,
NULL, 1 },
OPT_GROUP(""),
OPT_SET_INT('E', "extended-regexp", &pattern_type,
OPT_SET_INT('E', "extended-regexp", &pattern_type_arg,
"use extended POSIX regular expressions",
pattern_type_ere),
OPT_SET_INT('G', "basic-regexp", &pattern_type,
GREP_PATTERN_TYPE_ERE),
OPT_SET_INT('G', "basic-regexp", &pattern_type_arg,
"use basic POSIX regular expressions (default)",
pattern_type_bre),
OPT_SET_INT('F', "fixed-strings", &pattern_type,
GREP_PATTERN_TYPE_BRE),
OPT_SET_INT('F', "fixed-strings", &pattern_type_arg,
"interpret patterns as fixed strings",
pattern_type_fixed),
OPT_SET_INT('P', "perl-regexp", &pattern_type,
GREP_PATTERN_TYPE_FIXED),
OPT_SET_INT('P', "perl-regexp", &pattern_type_arg,
"use Perl-compatible regular expressions",
pattern_type_pcre),
GREP_PATTERN_TYPE_PCRE),
OPT_GROUP(""),
OPT_BOOLEAN('n', "line-number", &opt.linenum, "show line numbers"),
OPT_NEGBIT('h', NULL, &opt.pathname, "don't show filenames", 1),
Expand Down Expand Up @@ -799,6 +844,8 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
opt.header_tail = &opt.header_list;
opt.regflags = REG_NEWLINE;
opt.max_depth = -1;
opt.pattern_type_option = GREP_PATTERN_TYPE_UNSPECIFIED;
opt.extended_regexp_option = 0;

strcpy(opt.color_context, "");
strcpy(opt.color_filename, "");
Expand All @@ -824,28 +871,13 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
PARSE_OPT_KEEP_DASHDASH |
PARSE_OPT_STOP_AT_NON_OPTION |
PARSE_OPT_NO_INTERNAL_HELP);
switch (pattern_type) {
case pattern_type_fixed:
opt.fixed = 1;
opt.pcre = 0;
break;
case pattern_type_bre:
opt.fixed = 0;
opt.pcre = 0;
opt.regflags &= ~REG_EXTENDED;
break;
case pattern_type_ere:
opt.fixed = 0;
opt.pcre = 0;
opt.regflags |= REG_EXTENDED;
break;
case pattern_type_pcre:
opt.fixed = 0;
opt.pcre = 1;
break;
default:
break; /* nothing */
}

if (pattern_type_arg != GREP_PATTERN_TYPE_UNSPECIFIED)
grep_pattern_type_options(pattern_type_arg, &opt);
else if (opt.pattern_type_option != GREP_PATTERN_TYPE_UNSPECIFIED)
grep_pattern_type_options(opt.pattern_type_option, &opt);
else if (opt.extended_regexp_option)
grep_pattern_type_options(GREP_PATTERN_TYPE_ERE, &opt);

if (use_index && !startup_info->have_repository)
/* die the same way as if we did it at the beginning */
Expand Down
10 changes: 10 additions & 0 deletions grep.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,14 @@ enum grep_expr_node {
GREP_NODE_OR
};

enum grep_pattern_type {
GREP_PATTERN_TYPE_UNSPECIFIED = 0,
GREP_PATTERN_TYPE_BRE,
GREP_PATTERN_TYPE_ERE,
GREP_PATTERN_TYPE_FIXED,
GREP_PATTERN_TYPE_PCRE
};

struct grep_expr {
enum grep_expr_node node;
unsigned hit;
Expand Down Expand Up @@ -103,6 +111,8 @@ struct grep_opt {
int max_depth;
int funcname;
int funcbody;
int extended_regexp_option;
int pattern_type_option;
char color_context[COLOR_MAXLEN];
char color_filename[COLOR_MAXLEN];
char color_function[COLOR_MAXLEN];
Expand Down
Loading

0 comments on commit 445d2c5

Please sign in to comment.