grep: move the configuration parsing logic to grep.[ch]
The configuration handling is a library-ish part of this program, that is not specific to "git grep" command. It should be reusable by "log" and others. Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
15fabd1bbd
commit
7687a0541e
131
builtin/grep.c
131
builtin/grep.c
@ -261,21 +261,6 @@ 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) {
|
||||
@ -308,122 +293,6 @@ static void grep_pattern_type_options(const int pattern_type, struct grep_opt *o
|
||||
}
|
||||
}
|
||||
|
||||
static struct grep_opt grep_defaults;
|
||||
|
||||
/*
|
||||
* Initialize the grep_defaults template with hardcoded defaults.
|
||||
* We could let the compiler do this, but without C99 initializers
|
||||
* the code gets unwieldy and unreadable, so...
|
||||
*/
|
||||
static void init_grep_defaults(void)
|
||||
{
|
||||
struct grep_opt *opt = &grep_defaults;
|
||||
|
||||
memset(opt, 0, sizeof(*opt));
|
||||
opt->relative = 1;
|
||||
opt->pathname = 1;
|
||||
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, "");
|
||||
strcpy(opt->color_function, "");
|
||||
strcpy(opt->color_lineno, "");
|
||||
strcpy(opt->color_match, GIT_COLOR_BOLD_RED);
|
||||
strcpy(opt->color_selected, "");
|
||||
strcpy(opt->color_sep, GIT_COLOR_CYAN);
|
||||
opt->color = -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read the configuration file once and store it in
|
||||
* the grep_defaults template.
|
||||
*/
|
||||
static int grep_config(const char *var, const char *value, void *cb)
|
||||
{
|
||||
struct grep_opt *opt = &grep_defaults;
|
||||
char *color = NULL;
|
||||
|
||||
if (userdiff_config(var, value) < 0)
|
||||
return -1;
|
||||
|
||||
if (!strcmp(var, "grep.extendedregexp")) {
|
||||
if (git_config_bool(var, value))
|
||||
opt->extended_regexp_option = 1;
|
||||
else
|
||||
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;
|
||||
}
|
||||
|
||||
if (!strcmp(var, "color.grep"))
|
||||
opt->color = git_config_colorbool(var, value);
|
||||
else if (!strcmp(var, "color.grep.context"))
|
||||
color = opt->color_context;
|
||||
else if (!strcmp(var, "color.grep.filename"))
|
||||
color = opt->color_filename;
|
||||
else if (!strcmp(var, "color.grep.function"))
|
||||
color = opt->color_function;
|
||||
else if (!strcmp(var, "color.grep.linenumber"))
|
||||
color = opt->color_lineno;
|
||||
else if (!strcmp(var, "color.grep.match"))
|
||||
color = opt->color_match;
|
||||
else if (!strcmp(var, "color.grep.selected"))
|
||||
color = opt->color_selected;
|
||||
else if (!strcmp(var, "color.grep.separator"))
|
||||
color = opt->color_sep;
|
||||
|
||||
if (color) {
|
||||
if (!value)
|
||||
return config_error_nonbool(var);
|
||||
color_parse(value, var, color);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize one instance of grep_opt and copy the
|
||||
* default values from the template we read the configuration
|
||||
* information in an earlier call to git_config(grep_config).
|
||||
*/
|
||||
static void grep_init(struct grep_opt *opt, const char *prefix)
|
||||
{
|
||||
struct grep_opt *def = &grep_defaults;
|
||||
|
||||
memset(opt, 0, sizeof(*opt));
|
||||
opt->prefix = prefix;
|
||||
opt->prefix_length = (prefix && *prefix) ? strlen(prefix) : 0;
|
||||
opt->pattern_tail = &opt->pattern_list;
|
||||
opt->header_tail = &opt->header_list;
|
||||
|
||||
opt->color = def->color;
|
||||
opt->extended_regexp_option = def->extended_regexp_option;
|
||||
opt->pattern_type_option = def->pattern_type_option;
|
||||
opt->linenum = def->linenum;
|
||||
opt->max_depth = def->max_depth;
|
||||
opt->pathname = def->pathname;
|
||||
opt->regflags = def->regflags;
|
||||
opt->relative = def->relative;
|
||||
|
||||
strcpy(opt->color_context, def->color_context);
|
||||
strcpy(opt->color_filename, def->color_filename);
|
||||
strcpy(opt->color_function, def->color_function);
|
||||
strcpy(opt->color_lineno, def->color_lineno);
|
||||
strcpy(opt->color_match, def->color_match);
|
||||
strcpy(opt->color_selected, def->color_selected);
|
||||
strcpy(opt->color_sep, def->color_sep);
|
||||
}
|
||||
|
||||
static int grep_cmd_config(const char *var, const char *value, void *cb)
|
||||
{
|
||||
int st = grep_config(var, value, cb);
|
||||
|
130
grep.c
130
grep.c
@ -6,6 +6,136 @@
|
||||
static int grep_source_load(struct grep_source *gs);
|
||||
static int grep_source_is_binary(struct grep_source *gs);
|
||||
|
||||
static struct grep_opt grep_defaults;
|
||||
|
||||
/*
|
||||
* Initialize the grep_defaults template with hardcoded defaults.
|
||||
* We could let the compiler do this, but without C99 initializers
|
||||
* the code gets unwieldy and unreadable, so...
|
||||
*/
|
||||
void init_grep_defaults(void)
|
||||
{
|
||||
struct grep_opt *opt = &grep_defaults;
|
||||
|
||||
memset(opt, 0, sizeof(*opt));
|
||||
opt->relative = 1;
|
||||
opt->pathname = 1;
|
||||
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, "");
|
||||
strcpy(opt->color_function, "");
|
||||
strcpy(opt->color_lineno, "");
|
||||
strcpy(opt->color_match, GIT_COLOR_BOLD_RED);
|
||||
strcpy(opt->color_selected, "");
|
||||
strcpy(opt->color_sep, GIT_COLOR_CYAN);
|
||||
opt->color = -1;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
/*
|
||||
* Read the configuration file once and store it in
|
||||
* the grep_defaults template.
|
||||
*/
|
||||
int grep_config(const char *var, const char *value, void *cb)
|
||||
{
|
||||
struct grep_opt *opt = &grep_defaults;
|
||||
char *color = NULL;
|
||||
|
||||
if (userdiff_config(var, value) < 0)
|
||||
return -1;
|
||||
|
||||
if (!strcmp(var, "grep.extendedregexp")) {
|
||||
if (git_config_bool(var, value))
|
||||
opt->extended_regexp_option = 1;
|
||||
else
|
||||
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;
|
||||
}
|
||||
|
||||
if (!strcmp(var, "color.grep"))
|
||||
opt->color = git_config_colorbool(var, value);
|
||||
else if (!strcmp(var, "color.grep.context"))
|
||||
color = opt->color_context;
|
||||
else if (!strcmp(var, "color.grep.filename"))
|
||||
color = opt->color_filename;
|
||||
else if (!strcmp(var, "color.grep.function"))
|
||||
color = opt->color_function;
|
||||
else if (!strcmp(var, "color.grep.linenumber"))
|
||||
color = opt->color_lineno;
|
||||
else if (!strcmp(var, "color.grep.match"))
|
||||
color = opt->color_match;
|
||||
else if (!strcmp(var, "color.grep.selected"))
|
||||
color = opt->color_selected;
|
||||
else if (!strcmp(var, "color.grep.separator"))
|
||||
color = opt->color_sep;
|
||||
|
||||
if (color) {
|
||||
if (!value)
|
||||
return config_error_nonbool(var);
|
||||
color_parse(value, var, color);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize one instance of grep_opt and copy the
|
||||
* default values from the template we read the configuration
|
||||
* information in an earlier call to git_config(grep_config).
|
||||
*/
|
||||
void grep_init(struct grep_opt *opt, const char *prefix)
|
||||
{
|
||||
struct grep_opt *def = &grep_defaults;
|
||||
|
||||
memset(opt, 0, sizeof(*opt));
|
||||
opt->prefix = prefix;
|
||||
opt->prefix_length = (prefix && *prefix) ? strlen(prefix) : 0;
|
||||
opt->pattern_tail = &opt->pattern_list;
|
||||
opt->header_tail = &opt->header_list;
|
||||
|
||||
opt->color = def->color;
|
||||
opt->extended_regexp_option = def->extended_regexp_option;
|
||||
opt->pattern_type_option = def->pattern_type_option;
|
||||
opt->linenum = def->linenum;
|
||||
opt->max_depth = def->max_depth;
|
||||
opt->pathname = def->pathname;
|
||||
opt->regflags = def->regflags;
|
||||
opt->relative = def->relative;
|
||||
|
||||
strcpy(opt->color_context, def->color_context);
|
||||
strcpy(opt->color_filename, def->color_filename);
|
||||
strcpy(opt->color_function, def->color_function);
|
||||
strcpy(opt->color_lineno, def->color_lineno);
|
||||
strcpy(opt->color_match, def->color_match);
|
||||
strcpy(opt->color_selected, def->color_selected);
|
||||
strcpy(opt->color_sep, def->color_sep);
|
||||
}
|
||||
|
||||
static struct grep_pat *create_grep_pat(const char *pat, size_t patlen,
|
||||
const char *origin, int no,
|
||||
|
4
grep.h
4
grep.h
@ -138,6 +138,10 @@ struct grep_opt {
|
||||
void *output_priv;
|
||||
};
|
||||
|
||||
extern void init_grep_defaults(void);
|
||||
extern int grep_config(const char *var, const char *value, void *);
|
||||
extern void grep_init(struct grep_opt *, const char *prefix);
|
||||
|
||||
extern void append_grep_pat(struct grep_opt *opt, const char *pat, size_t patlen, const char *origin, int no, enum grep_pat_token t);
|
||||
extern void append_grep_pattern(struct grep_opt *opt, const char *pat, const char *origin, int no, enum grep_pat_token t);
|
||||
extern void append_header_grep_pattern(struct grep_opt *, enum grep_header_field, const char *);
|
||||
|
Loading…
Reference in New Issue
Block a user