]> git.ipfire.org Git - thirdparty/git.git/commitdiff
grep: add repository to OID grep sources
authorJonathan Tan <jonathantanmy@google.com>
Mon, 16 Aug 2021 21:09:56 +0000 (14:09 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 8 Sep 2021 18:48:05 +0000 (11:48 -0700)
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>
builtin/grep.c
grep.c
grep.h

index fa7fd081506629946f6ee0773f5f9a9fccd26f19..51278b01fa273fbad1d01430dbb26c9c66fda41c 100644 (file)
@@ -349,7 +349,7 @@ static int grep_oid(struct grep_opt *opt, const struct object_id *oid,
        struct grep_source gs;
 
        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);
 
        if (num_threads > 1) {
@@ -462,14 +462,11 @@ static int grep_submodule(struct grep_opt *opt,
        repo_read_gitmodules(subrepo, 0);
 
        /*
-        * NEEDSWORK: This adds the submodule's object directory to the list of
-        * alternates for the single in-memory object store.  This has some bad
-        * consequences for memory (processed objects will never be freed) and
-        * performance (this increases the number of pack files git has to pay
-        * attention to, to the sum of the number of pack files in all the
-        * 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.
+        * All code paths tested by test code no longer need submodule ODBs to
+        * be added as alternates, but add it to the list just in case.
+        * Submodule ODBs added through add_submodule_odb_by_path() will be
+        * lazily registered as alternates when needed (and except in an
+        * unexpected code interaction, it won't be needed).
         */
        add_submodule_odb_by_path(subrepo->objects->odb->path);
        obj_read_unlock();
diff --git a/grep.c b/grep.c
index 8a8105c2ebce5af0709d317b49a07ac6e7ec453f..79598f245f2d65a28811f300879c7853836a4425 100644 (file)
--- a/grep.c
+++ b/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,
-                         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->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->driver = NULL;
        gs->identifier = oiddup(oid);
+       gs->repo = repo;
 }
 
 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;
 
-       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)
                return error(_("'%s': unable to read %s"),
                             gs->name,
diff --git a/grep.h b/grep.h
index 480b3f5bba611c59525ed7794a6da32a2eaf48f1..128007db655e4e2def53e17cfd2a0d0ee3fefa18 100644 (file)
--- a/grep.h
+++ b/grep.h
@@ -120,7 +120,20 @@ struct grep_opt {
        struct grep_pat *header_list;
        struct grep_pat **header_tail;
        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;
+
        const char *prefix;
        int prefix_length;
        regex_t regexp;
@@ -187,6 +200,7 @@ struct grep_source {
                GREP_SOURCE_BUF,
        } type;
        void *identifier;
+       struct repository *repo; /* if GREP_SOURCE_OID */
 
        char *buf;
        unsigned long size;
@@ -198,7 +212,8 @@ struct grep_source {
 void grep_source_init_file(struct grep_source *gs, const char *name,
                           const char *path);
 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(struct grep_source *gs);
 void grep_source_load_driver(struct grep_source *gs,