mirror of
https://github.com/git/git.git
synced 2024-11-24 02:17:02 +08:00
Merge branch 'ma/grep-init-default'
Code clean-up. * ma/grep-init-default: MyFirstObjectWalk: drop `init_walken_defaults()` grep: copy struct in one fell swoop grep: use designated initializers for `grep_defaults` grep: don't set up a "default" repo for grep
This commit is contained in:
commit
5dfb976460
@ -182,30 +182,6 @@ its `init_log_defaults()` sets its own state (`decoration_style`) and asks
|
||||
`grep` and `diff` to initialize themselves by calling each of their
|
||||
initialization functions.
|
||||
|
||||
For our first example within `git walken`, we don't intend to use any other
|
||||
components within Git, and we don't have any configuration to do. However, we
|
||||
may want to add some later, so for now, we can add an empty placeholder. Create
|
||||
a new function in `builtin/walken.c`:
|
||||
|
||||
----
|
||||
static void init_walken_defaults(void)
|
||||
{
|
||||
/*
|
||||
* We don't actually need the same components `git log` does; leave this
|
||||
* empty for now.
|
||||
*/
|
||||
}
|
||||
----
|
||||
|
||||
Make sure to add a line invoking it inside of `cmd_walken()`.
|
||||
|
||||
----
|
||||
int cmd_walken(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
init_walken_defaults();
|
||||
}
|
||||
----
|
||||
|
||||
==== Configuring From `.gitconfig`
|
||||
|
||||
Next, we should have a look at any relevant configuration settings (i.e.,
|
||||
@ -388,17 +364,9 @@ Next, let's try to filter the commits we see based on their author. This is
|
||||
equivalent to running `git log --author=<pattern>`. We can add a filter by
|
||||
modifying `rev_info.grep_filter`, which is a `struct grep_opt`.
|
||||
|
||||
First some setup. Add `init_grep_defaults()` to `init_walken_defaults()` and add
|
||||
`grep_config()` to `git_walken_config()`:
|
||||
First some setup. Add `grep_config()` to `git_walken_config()`:
|
||||
|
||||
----
|
||||
static void init_walken_defaults(void)
|
||||
{
|
||||
init_grep_defaults(the_repository);
|
||||
}
|
||||
|
||||
...
|
||||
|
||||
static int git_walken_config(const char *var, const char *value, void *cb)
|
||||
{
|
||||
grep_config(var, value, cb);
|
||||
|
@ -950,7 +950,6 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
|
||||
OPT_END()
|
||||
};
|
||||
|
||||
init_grep_defaults(the_repository);
|
||||
git_config(grep_cmd_config, NULL);
|
||||
grep_init(&opt, the_repository, prefix);
|
||||
|
||||
|
@ -133,7 +133,6 @@ static int log_line_range_callback(const struct option *option, const char *arg,
|
||||
|
||||
static void init_log_defaults(void)
|
||||
{
|
||||
init_grep_defaults(the_repository);
|
||||
init_diff_ui_defaults();
|
||||
|
||||
decoration_style = auto_decoration_style();
|
||||
|
98
grep.c
98
grep.c
@ -14,7 +14,31 @@ static int grep_source_load(struct grep_source *gs);
|
||||
static int grep_source_is_binary(struct grep_source *gs,
|
||||
struct index_state *istate);
|
||||
|
||||
static struct grep_opt grep_defaults;
|
||||
static void std_output(struct grep_opt *opt, const void *buf, size_t size)
|
||||
{
|
||||
fwrite(buf, size, 1, stdout);
|
||||
}
|
||||
|
||||
static struct grep_opt grep_defaults = {
|
||||
.relative = 1,
|
||||
.pathname = 1,
|
||||
.max_depth = -1,
|
||||
.pattern_type_option = GREP_PATTERN_TYPE_UNSPECIFIED,
|
||||
.colors = {
|
||||
[GREP_COLOR_CONTEXT] = "",
|
||||
[GREP_COLOR_FILENAME] = "",
|
||||
[GREP_COLOR_FUNCTION] = "",
|
||||
[GREP_COLOR_LINENO] = "",
|
||||
[GREP_COLOR_COLUMNNO] = "",
|
||||
[GREP_COLOR_MATCH_CONTEXT] = GIT_COLOR_BOLD_RED,
|
||||
[GREP_COLOR_MATCH_SELECTED] = GIT_COLOR_BOLD_RED,
|
||||
[GREP_COLOR_SELECTED] = "",
|
||||
[GREP_COLOR_SEP] = GIT_COLOR_CYAN,
|
||||
},
|
||||
.only_matching = 0,
|
||||
.color = -1,
|
||||
.output = std_output,
|
||||
};
|
||||
|
||||
#ifdef USE_LIBPCRE2
|
||||
static pcre2_general_context *pcre2_global_context;
|
||||
@ -42,50 +66,6 @@ static const char *color_grep_slots[] = {
|
||||
[GREP_COLOR_SEP] = "separator",
|
||||
};
|
||||
|
||||
static void std_output(struct grep_opt *opt, const void *buf, size_t size)
|
||||
{
|
||||
fwrite(buf, size, 1, stdout);
|
||||
}
|
||||
|
||||
static void color_set(char *dst, const char *color_bytes)
|
||||
{
|
||||
xsnprintf(dst, COLOR_MAXLEN, "%s", color_bytes);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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(struct repository *repo)
|
||||
{
|
||||
struct grep_opt *opt = &grep_defaults;
|
||||
static int run_once;
|
||||
|
||||
if (run_once)
|
||||
return;
|
||||
run_once++;
|
||||
|
||||
memset(opt, 0, sizeof(*opt));
|
||||
opt->repo = repo;
|
||||
opt->relative = 1;
|
||||
opt->pathname = 1;
|
||||
opt->max_depth = -1;
|
||||
opt->pattern_type_option = GREP_PATTERN_TYPE_UNSPECIFIED;
|
||||
color_set(opt->colors[GREP_COLOR_CONTEXT], "");
|
||||
color_set(opt->colors[GREP_COLOR_FILENAME], "");
|
||||
color_set(opt->colors[GREP_COLOR_FUNCTION], "");
|
||||
color_set(opt->colors[GREP_COLOR_LINENO], "");
|
||||
color_set(opt->colors[GREP_COLOR_COLUMNNO], "");
|
||||
color_set(opt->colors[GREP_COLOR_MATCH_CONTEXT], GIT_COLOR_BOLD_RED);
|
||||
color_set(opt->colors[GREP_COLOR_MATCH_SELECTED], GIT_COLOR_BOLD_RED);
|
||||
color_set(opt->colors[GREP_COLOR_SELECTED], "");
|
||||
color_set(opt->colors[GREP_COLOR_SEP], GIT_COLOR_CYAN);
|
||||
opt->only_matching = 0;
|
||||
opt->color = -1;
|
||||
opt->output = std_output;
|
||||
}
|
||||
|
||||
static int parse_pattern_type_arg(const char *opt, const char *arg)
|
||||
{
|
||||
if (!strcmp(arg, "default"))
|
||||
@ -115,6 +95,14 @@ int grep_config(const char *var, const char *value, void *cb)
|
||||
if (userdiff_config(var, value) < 0)
|
||||
return -1;
|
||||
|
||||
/*
|
||||
* The instance of grep_opt that we set up here is copied by
|
||||
* grep_init() to be used by each individual invocation.
|
||||
* When populating a new field of this structure here, be
|
||||
* sure to think about ownership -- e.g., you might need to
|
||||
* override the shallow copy in grep_init() with a deep copy.
|
||||
*/
|
||||
|
||||
if (!strcmp(var, "grep.extendedregexp")) {
|
||||
opt->extended_regexp_option = git_config_bool(var, value);
|
||||
return 0;
|
||||
@ -172,9 +160,6 @@ int grep_config(const char *var, const char *value, void *cb)
|
||||
*/
|
||||
void grep_init(struct grep_opt *opt, struct repository *repo, const char *prefix)
|
||||
{
|
||||
struct grep_opt *def = &grep_defaults;
|
||||
int i;
|
||||
|
||||
#if defined(USE_LIBPCRE2)
|
||||
if (!pcre2_global_context)
|
||||
pcre2_global_context = pcre2_general_context_create(
|
||||
@ -186,26 +171,13 @@ void grep_init(struct grep_opt *opt, struct repository *repo, const char *prefix
|
||||
pcre_free = free;
|
||||
#endif
|
||||
|
||||
memset(opt, 0, sizeof(*opt));
|
||||
*opt = grep_defaults;
|
||||
|
||||
opt->repo = repo;
|
||||
opt->prefix = prefix;
|
||||
opt->prefix_length = (prefix && *prefix) ? strlen(prefix) : 0;
|
||||
opt->pattern_tail = &opt->pattern_list;
|
||||
opt->header_tail = &opt->header_list;
|
||||
|
||||
opt->only_matching = def->only_matching;
|
||||
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->columnnum = def->columnnum;
|
||||
opt->max_depth = def->max_depth;
|
||||
opt->pathname = def->pathname;
|
||||
opt->relative = def->relative;
|
||||
opt->output = def->output;
|
||||
|
||||
for (i = 0; i < NR_GREP_COLORS; i++)
|
||||
color_set(opt->colors[i], def->colors[i]);
|
||||
}
|
||||
|
||||
void grep_destroy(void)
|
||||
|
1
grep.h
1
grep.h
@ -170,7 +170,6 @@ struct grep_opt {
|
||||
void *output_priv;
|
||||
};
|
||||
|
||||
void init_grep_defaults(struct repository *);
|
||||
int grep_config(const char *var, const char *value, void *);
|
||||
void grep_init(struct grep_opt *, struct repository *repo, const char *prefix);
|
||||
void grep_destroy(void);
|
||||
|
@ -1827,7 +1827,6 @@ void repo_init_revisions(struct repository *r,
|
||||
revs->commit_format = CMIT_FMT_DEFAULT;
|
||||
revs->expand_tabs_in_log_default = 8;
|
||||
|
||||
init_grep_defaults(revs->repo);
|
||||
grep_init(&revs->grep_filter, revs->repo, prefix);
|
||||
revs->grep_filter.status_only = 1;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user