grep: add repository to OID grep sources
Record the repository whenever an OID grep source is created, and teach the worker threads to explicitly provide the repository when accessing objects. Signed-off-by: Jonathan Tan <jonathantanmy@google.com> Reviewed-by: Matheus Tavares <matheus.bernardino@usp.br> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
dd45471a37
commit
0693806bf8
@ -349,7 +349,7 @@ static int grep_oid(struct grep_opt *opt, const struct object_id *oid,
|
|||||||
struct grep_source gs;
|
struct grep_source gs;
|
||||||
|
|
||||||
grep_source_name(opt, filename, tree_name_len, &pathbuf);
|
grep_source_name(opt, filename, tree_name_len, &pathbuf);
|
||||||
grep_source_init_oid(&gs, pathbuf.buf, path, oid);
|
grep_source_init_oid(&gs, pathbuf.buf, path, oid, opt->repo);
|
||||||
strbuf_release(&pathbuf);
|
strbuf_release(&pathbuf);
|
||||||
|
|
||||||
if (num_threads > 1) {
|
if (num_threads > 1) {
|
||||||
@ -462,14 +462,11 @@ static int grep_submodule(struct grep_opt *opt,
|
|||||||
repo_read_gitmodules(subrepo, 0);
|
repo_read_gitmodules(subrepo, 0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NEEDSWORK: This adds the submodule's object directory to the list of
|
* All code paths tested by test code no longer need submodule ODBs to
|
||||||
* alternates for the single in-memory object store. This has some bad
|
* be added as alternates, but add it to the list just in case.
|
||||||
* consequences for memory (processed objects will never be freed) and
|
* Submodule ODBs added through add_submodule_odb_by_path() will be
|
||||||
* performance (this increases the number of pack files git has to pay
|
* lazily registered as alternates when needed (and except in an
|
||||||
* attention to, to the sum of the number of pack files in all the
|
* unexpected code interaction, it won't be needed).
|
||||||
* repositories processed so far). This can be removed once the object
|
|
||||||
* store is no longer global and instead is a member of the repository
|
|
||||||
* object.
|
|
||||||
*/
|
*/
|
||||||
add_submodule_odb_by_path(subrepo->objects->odb->path);
|
add_submodule_odb_by_path(subrepo->objects->odb->path);
|
||||||
obj_read_unlock();
|
obj_read_unlock();
|
||||||
|
7
grep.c
7
grep.c
@ -1863,7 +1863,8 @@ void grep_source_init_file(struct grep_source *gs, const char *name,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void grep_source_init_oid(struct grep_source *gs, const char *name,
|
void grep_source_init_oid(struct grep_source *gs, const char *name,
|
||||||
const char *path, const struct object_id *oid)
|
const char *path, const struct object_id *oid,
|
||||||
|
struct repository *repo)
|
||||||
{
|
{
|
||||||
gs->type = GREP_SOURCE_OID;
|
gs->type = GREP_SOURCE_OID;
|
||||||
gs->name = xstrdup_or_null(name);
|
gs->name = xstrdup_or_null(name);
|
||||||
@ -1872,6 +1873,7 @@ void grep_source_init_oid(struct grep_source *gs, const char *name,
|
|||||||
gs->size = 0;
|
gs->size = 0;
|
||||||
gs->driver = NULL;
|
gs->driver = NULL;
|
||||||
gs->identifier = oiddup(oid);
|
gs->identifier = oiddup(oid);
|
||||||
|
gs->repo = repo;
|
||||||
}
|
}
|
||||||
|
|
||||||
void grep_source_clear(struct grep_source *gs)
|
void grep_source_clear(struct grep_source *gs)
|
||||||
@ -1900,7 +1902,8 @@ static int grep_source_load_oid(struct grep_source *gs)
|
|||||||
{
|
{
|
||||||
enum object_type type;
|
enum object_type type;
|
||||||
|
|
||||||
gs->buf = read_object_file(gs->identifier, &type, &gs->size);
|
gs->buf = repo_read_object_file(gs->repo, gs->identifier, &type,
|
||||||
|
&gs->size);
|
||||||
if (!gs->buf)
|
if (!gs->buf)
|
||||||
return error(_("'%s': unable to read %s"),
|
return error(_("'%s': unable to read %s"),
|
||||||
gs->name,
|
gs->name,
|
||||||
|
17
grep.h
17
grep.h
@ -120,7 +120,20 @@ struct grep_opt {
|
|||||||
struct grep_pat *header_list;
|
struct grep_pat *header_list;
|
||||||
struct grep_pat **header_tail;
|
struct grep_pat **header_tail;
|
||||||
struct grep_expr *pattern_expression;
|
struct grep_expr *pattern_expression;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NEEDSWORK: See if we can remove this field, because the repository
|
||||||
|
* should probably be per-source. That is, grep.c functions using this
|
||||||
|
* field should probably start using "repo" in "struct grep_source"
|
||||||
|
* instead.
|
||||||
|
*
|
||||||
|
* This is potentially the cause of at least one bug - "git grep"
|
||||||
|
* ignoring the textconv attributes from submodules. See [1] for more
|
||||||
|
* information.
|
||||||
|
* [1] https://lore.kernel.org/git/CAHd-oW5iEQarYVxEXoTG-ua2zdoybTrSjCBKtO0YT292fm0NQQ@mail.gmail.com/
|
||||||
|
*/
|
||||||
struct repository *repo;
|
struct repository *repo;
|
||||||
|
|
||||||
const char *prefix;
|
const char *prefix;
|
||||||
int prefix_length;
|
int prefix_length;
|
||||||
regex_t regexp;
|
regex_t regexp;
|
||||||
@ -187,6 +200,7 @@ struct grep_source {
|
|||||||
GREP_SOURCE_BUF,
|
GREP_SOURCE_BUF,
|
||||||
} type;
|
} type;
|
||||||
void *identifier;
|
void *identifier;
|
||||||
|
struct repository *repo; /* if GREP_SOURCE_OID */
|
||||||
|
|
||||||
char *buf;
|
char *buf;
|
||||||
unsigned long size;
|
unsigned long size;
|
||||||
@ -198,7 +212,8 @@ struct grep_source {
|
|||||||
void grep_source_init_file(struct grep_source *gs, const char *name,
|
void grep_source_init_file(struct grep_source *gs, const char *name,
|
||||||
const char *path);
|
const char *path);
|
||||||
void grep_source_init_oid(struct grep_source *gs, const char *name,
|
void grep_source_init_oid(struct grep_source *gs, const char *name,
|
||||||
const char *path, const struct object_id *oid);
|
const char *path, const struct object_id *oid,
|
||||||
|
struct repository *repo);
|
||||||
void grep_source_clear_data(struct grep_source *gs);
|
void grep_source_clear_data(struct grep_source *gs);
|
||||||
void grep_source_clear(struct grep_source *gs);
|
void grep_source_clear(struct grep_source *gs);
|
||||||
void grep_source_load_driver(struct grep_source *gs,
|
void grep_source_load_driver(struct grep_source *gs,
|
||||||
|
Loading…
Reference in New Issue
Block a user