grep: use grep_opt->repo instead of explict repo argument
PATCH 1/1 grep: use grep_opt->repo instead of explict repo argument
This command is probably the first one that operates on a repository other than the_repository, in f9ee2fcdfa (grep: recurse in-process using 'struct repository' - 2017-08-02). An explicit 'struct repository *' was added in that commit to pass around the repository that we're supposed to grep from.
Since 38bbc2ea39 (grep.c: remove implicit dependency on the_index - 2018-09-21). 'struct grep_opt *' carries in itself a repository parameter for grepping. We should now be able to reuse grep_opt to hold the submodule repo instead of a separate argument, which is just room for mistakes.
While at there, use the right reference instead of the_repository and the_index in this code. I was a bit careless in my attempt to kick the_repository / the_index out of library code. It's normally safe to just stick the_repository / the_index in bultin/ code, but it's not the case for grep.
--- builtin/grep.c | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-)
builtin/grep.c +24 -17
@@ -408,18 +408,20 @@ static void run_pager(struct grep_opt *opt, const char *prefix)exit (status); } -static int grep_cache (struct grep_opt *opt,struct repository *repo, +static int grep_cache (struct grep_opt *opt,const struct pathspec *pathspec,int cached);static int grep_tree (struct grep_opt *opt,const struct pathspec *pathspec,struct tree_desc *tree,struct strbuf *base,int tn_len, -int check_attr,struct repository *repo); +int check_attr); -static int grep_submodule (struct grep_opt *opt,struct repository *superproject, +static int grep_submodule (struct grep_opt *opt,const struct pathspec *pathspec,const struct object_id *oid,const char *filename,const char *path) { +struct repository *superproject = opt->repo;struct repository submodule; +struct grep_opt subopt;int hit;/*
@@ -455,6 +457,9 @@ static int grep_submodule(struct grep_opt *opt, struct repository *superproject,add_to_alternates_memory (submodule.objects->objectdir);grep_read_unlock (); +memcpy (&subopt, opt,sizeof (subopt)); + subopt.repo = &submodule; +if (oid) {struct object *object;struct tree_desc tree;
@@ -476,21 +481,22 @@ static int grep_submodule(struct grep_opt *opt, struct repository *superproject,strbuf_addch (&base,'/' );init_tree_desc (&tree, data, size); - hit =grep_tree (opt, pathspec, &tree, &base, base.len, - object->type ==OBJ_COMMIT , &submodule); + hit =grep_tree (&subopt, pathspec, &tree, &base, base.len, + object->type ==OBJ_COMMIT );strbuf_release (&base);free (data); }else { - hit =grep_cache (opt, &submodule, pathspec,1 ); + hit =grep_cache (&subopt, pathspec,1 ); }repo_clear (&submodule);return hit; } -static int grep_cache (struct grep_opt *opt,struct repository *repo, +static int grep_cache (struct grep_opt *opt,const struct pathspec *pathspec,int cached) { +struct repository *repo = opt->repo;int hit =0 ;int nr;struct strbuf name =STRBUF_INIT ;
@@ -528,7 +534,7 @@ static int grep_cache(struct grep_opt *opt, struct repository *repo, } }else if (recurse_submodules &&S_ISGITLINK (ce->ce_mode) &&submodule_path_match (repo->index, pathspec, name.buf,NULL )) { - hit |=grep_submodule (opt, repo, pathspec,NULL , ce->name, ce->name); + hit |=grep_submodule (opt, pathspec,NULL , ce->name, ce->name); }else {continue ; }
@@ -550,8 +556,9 @@ static int grep_cache(struct grep_opt *opt, struct repository *repo,static int grep_tree (struct grep_opt *opt,const struct pathspec *pathspec,struct tree_desc *tree,struct strbuf *base,int tn_len, -int check_attr,struct repository *repo) +int check_attr) { +struct repository *repo = opt->repo;int hit =0 ;enum interesting match = entry_not_interesting;struct name_entry entry;
@@ -597,10 +604,10 @@ static int grep_tree(struct grep_opt *opt, const struct pathspec *pathspec,strbuf_addch (base,'/' );init_tree_desc (&sub, data, size); hit |=grep_tree (opt, pathspec, &sub, base, tn_len, - check_attr, repo); + check_attr);free (data); }else if (recurse_submodules &&S_ISGITLINK (entry.mode)) { - hit |=grep_submodule (opt, repo, pathspec, entry.oid, + hit |=grep_submodule (opt, pathspec, entry.oid, base->buf, base->buf + tn_len); }
@@ -642,7 +649,7 @@ static int grep_object(struct grep_opt *opt, const struct pathspec *pathspec, }init_tree_desc (&tree, data, size); hit =grep_tree (opt, pathspec, &tree, &base, base.len, - obj->type ==OBJ_COMMIT , the_repository); + obj->type ==OBJ_COMMIT );strbuf_release (&base);free (data);return hit;
@@ -659,12 +666,12 @@ static int grep_objects(struct grep_opt *opt, const struct pathspec *pathspec,for (i =0 ; i < nr; i++) {struct object *real_obj; - real_obj =deref_tag (the_repository, list->objects[i].item, + real_obj =deref_tag (opt->repo, list->objects[i].item,NULL ,0 );/* load the gitmodules file for this rev */ if (recurse_submodules) { -submodule_free (the_repository); +submodule_free (opt->repo);gitmodules_config_oid (&real_obj->oid); } if (grep_object(opt, pathspec, real_obj, list->objects[i].name,
@@ -689,9 +696,9 @@ static int grep_directory(struct grep_opt *opt, const struct pathspec *pathspec,if (exc_std)setup_standard_excludes (&dir); -fill_directory (&dir, &the_index, pathspec); +fill_directory (&dir, opt->repo->index, pathspec);for (i =0 ; i < dir.nr; i++) { -if (!dir_path_match (&the_index, dir.entries[i], pathspec,0 ,NULL )) +if (!dir_path_match (opt->repo->index, dir.entries[i], pathspec,0 ,NULL ))continue ; hit |=grep_file (opt, dir.entries[i]->name);if (hit && opt->status_only)
@@ -1124,7 +1131,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix)if (!cached)setup_work_tree (); - hit =grep_cache (&opt, the_repository, &pathspec, cached); + hit =grep_cache (&opt, &pathspec, cached); }else {if (cached)die (_ ("both --cached and trees are given" ));
Signature · 1 line
2.19.1.1327.g328c130451.dirty
Quoted 7 lines · Nguyễn Thái Ngọc Duy
This command is probably the first one that operates on a repository other than
the_repository, inf9ee2fcdfa(grep: recurse in-process using 'struct repository' - 2017-08-02). An explicit 'struct repository *' was added in that commit to pass around the repository that we're supposed to grep from.
Quoted 5 lines
Since
38bbc2ea39(grep.c: remove implicit dependency onthe_index- 2018-09-21). 'structgrep_opt*' carries in itself a repository parameter for grepping. We should now be able to reusegrep_optto hold the submodule repo instead of a separate argument, which is just room for mistakes.
That makes sense. Assuming we did not make a mistake yet, the test suite would not need changes (further assuming we do test for it, but we do as we have explicit submodule grep tests).
Quoted 6 lines
While at there, use the right reference instead of
the_repositoryandthe_indexin this code. I was a bit careless in my attempt to kickthe_repository/the_indexout of library code. It's normally safe to just stickthe_repository/the_indexin bultin/ code, but it's not the case for grep.
Quoted 1 line
Signed-off-by Nguyễn Thái Ngọc Duy <[email protected]>