The "struct grep_opt" is a mixture of things that would be needed by all callers of the grep.c API, and quite a few things that only the builtin/grep.c needs. Since we got rid of "prefix_length" in the previous commit, let's move the "prefix" variable over to "builtin/grep.c" where it's used. To do this let's create a "struct grep_cmd_opt", which we'll have a pointer to in a new "caller_priv" member in "struct grep_opt" (the existing "priv" is used by the top-level "grep.c" itself). We might eventually need to have grep_opt_dup() learn about this new member, but since the prefix can be a "const char *const" (i.e. we never change it in any way) let's leave that aside for now, in any case "builtin/grep.c" is the only user of grep_opt_dup(), even though it lives in the top-level "grep.c". Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> --- builtin/grep.c | 17 ++++++++++++----- grep.c | 3 +-- grep.h | 4 ++-- revision.c | 2 +- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/builtin/grep.c b/builtin/grep.c index bd4d2107351..960c7aac123 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -37,6 +37,10 @@ static int num_threads; static pthread_t *threads; +struct grep_cmd_opt { + const char *const prefix; +}; + /* We use one producer thread and THREADS consumer * threads. The producer adds struct work_items to 'todo' and the * consumers pick work items from the same array. @@ -312,14 +316,15 @@ static int grep_cmd_config(const char *var, const char *value, void *cb) static void grep_source_name(struct grep_opt *opt, const char *filename, int tree_name_len, struct strbuf *out) { + struct grep_cmd_opt *opt_cmd = opt->caller_priv; strbuf_reset(out); if (opt->null_following_name) { - if (opt->relative && opt->prefix) { + if (opt->relative && opt_cmd->prefix) { struct strbuf rel_buf = STRBUF_INIT; const char *rel_name = relative_path(filename + tree_name_len, - opt->prefix, &rel_buf); + opt_cmd->prefix, &rel_buf); if (tree_name_len) strbuf_add(out, filename, tree_name_len); @@ -332,8 +337,8 @@ static void grep_source_name(struct grep_opt *opt, const char *filename, return; } - if (opt->relative && opt->prefix) - quote_path(filename + tree_name_len, opt->prefix, out, 0); + if (opt->relative && opt_cmd->prefix) + quote_path(filename + tree_name_len, opt_cmd->prefix, out, 0); else quote_c_style(filename + tree_name_len, out, NULL, 0); @@ -837,6 +842,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix) int external_grep_allowed__ignored; const char *show_in_pager = NULL, *default_pager = "dummy"; struct grep_opt opt; + struct grep_cmd_opt opt_cmd = { .prefix = prefix }; struct object_array list = OBJECT_ARRAY_INIT; struct pathspec pathspec; struct string_list path_list = STRING_LIST_INIT_DUP; @@ -964,7 +970,8 @@ int cmd_grep(int argc, const char **argv, const char *prefix) }; git_config(grep_cmd_config, NULL); - grep_init(&opt, the_repository, prefix); + grep_init(&opt, the_repository); + opt.caller_priv = &opt_cmd; /* * If there is no -- then the paths must exist in the working diff --git a/grep.c b/grep.c index 755afb5f96d..c9065254aeb 100644 --- a/grep.c +++ b/grep.c @@ -139,12 +139,11 @@ int grep_config(const char *var, const char *value, void *cb) * 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, struct repository *repo, const char *prefix) +void grep_init(struct grep_opt *opt, struct repository *repo) { *opt = grep_defaults; opt->repo = repo; - opt->prefix = prefix; opt->pattern_tail = &opt->pattern_list; opt->header_tail = &opt->header_list; } diff --git a/grep.h b/grep.h index 467d775b5a9..6b923d8599c 100644 --- a/grep.h +++ b/grep.h @@ -134,7 +134,6 @@ struct grep_opt { */ struct repository *repo; - const char *prefix; int linenum; int columnnum; int invert; @@ -172,6 +171,7 @@ struct grep_opt { int show_hunk_mark; int file_break; int heading; + void *caller_priv; void *priv; void (*output)(struct grep_opt *opt, const void *data, size_t size); @@ -179,7 +179,7 @@ struct grep_opt { }; int grep_config(const char *var, const char *value, void *); -void grep_init(struct grep_opt *, struct repository *repo, const char *prefix); +void grep_init(struct grep_opt *, struct repository *repo); void grep_commit_pattern_type(enum grep_pattern_type, struct grep_opt *opt); void append_grep_pat(struct grep_opt *opt, const char *pat, size_t patlen, const char *origin, int no, enum grep_pat_token t); diff --git a/revision.c b/revision.c index ab7c1358042..9f9b0d2429e 100644 --- a/revision.c +++ b/revision.c @@ -1833,7 +1833,7 @@ void repo_init_revisions(struct repository *r, revs->commit_format = CMIT_FMT_DEFAULT; revs->expand_tabs_in_log_default = 8; - grep_init(&revs->grep_filter, revs->repo, prefix); + grep_init(&revs->grep_filter, revs->repo); revs->grep_filter.status_only = 1; repo_diff_setup(revs->repo, &revs->diffopt); -- 2.34.0.rc1.741.gab7bfd97031