Currently, submodule-config.c doesn't have an externally acessible
function to read gitmodules only if it wasn't already read. But this
exactly behavior is internally implemented by gitmodules_read_check(),
to perform a lazy load. Let's merge this function with
repo_read_gitmodules() adding an 'skip_if_read' which allow both
internal and external callers to access this functionality. This
simplifies a little the code. The added option will also be used in the
following patch.

Signed-off-by: Matheus Tavares <matheus.bernard...@usp.br>
---
 builtin/grep.c     |  2 +-
 submodule-config.c | 18 ++++++------------
 submodule-config.h |  2 +-
 unpack-trees.c     |  4 ++--
 4 files changed, 10 insertions(+), 16 deletions(-)

diff --git a/builtin/grep.c b/builtin/grep.c
index 5a404ee1db..1c4ff4a75f 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -420,7 +420,7 @@ static int grep_submodule(struct grep_opt *opt,
                return 0;
        }
 
-       repo_read_gitmodules(&subrepo);
+       repo_read_gitmodules(&subrepo, 0);
 
        /*
         * NEEDSWORK: This adds the submodule's object directory to the list of
diff --git a/submodule-config.c b/submodule-config.c
index 4264ee216f..8c4333120a 100644
--- a/submodule-config.c
+++ b/submodule-config.c
@@ -660,10 +660,13 @@ static int gitmodules_cb(const char *var, const char 
*value, void *data)
        return parse_config(var, value, &parameter);
 }
 
-void repo_read_gitmodules(struct repository *repo)
+void repo_read_gitmodules(struct repository *repo, int skip_if_read)
 {
        submodule_cache_check_init(repo);
 
+       if (repo->submodule_cache->gitmodules_read && skip_if_read)
+               return;
+
        if (repo_read_index(repo) < 0)
                return;
 
@@ -689,20 +692,11 @@ void gitmodules_config_oid(const struct object_id 
*commit_oid)
        the_repository->submodule_cache->gitmodules_read = 1;
 }
 
-static void gitmodules_read_check(struct repository *repo)
-{
-       submodule_cache_check_init(repo);
-
-       /* read the repo's .gitmodules file if it hasn't been already */
-       if (!repo->submodule_cache->gitmodules_read)
-               repo_read_gitmodules(repo);
-}
-
 const struct submodule *submodule_from_name(struct repository *r,
                                            const struct object_id 
*treeish_name,
                const char *name)
 {
-       gitmodules_read_check(r);
+       repo_read_gitmodules(r, 1);
        return config_from(r->submodule_cache, treeish_name, name, lookup_name);
 }
 
@@ -710,7 +704,7 @@ const struct submodule *submodule_from_path(struct 
repository *r,
                                            const struct object_id 
*treeish_name,
                const char *path)
 {
-       gitmodules_read_check(r);
+       repo_read_gitmodules(r, 1);
        return config_from(r->submodule_cache, treeish_name, path, lookup_path);
 }
 
diff --git a/submodule-config.h b/submodule-config.h
index 1b4e2da658..7a76ef8cd8 100644
--- a/submodule-config.h
+++ b/submodule-config.h
@@ -39,7 +39,7 @@ int option_fetch_parse_recurse_submodules(const struct option 
*opt,
                                          const char *arg, int unset);
 int parse_update_recurse_submodules_arg(const char *opt, const char *arg);
 int parse_push_recurse_submodules_arg(const char *opt, const char *arg);
-void repo_read_gitmodules(struct repository *repo);
+void repo_read_gitmodules(struct repository *repo, int skip_if_read);
 void gitmodules_config_oid(const struct object_id *commit_oid);
 const struct submodule *submodule_from_name(struct repository *r,
                                            const struct object_id 
*commit_or_tree,
diff --git a/unpack-trees.c b/unpack-trees.c
index 9c25126aec..689575944c 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -292,11 +292,11 @@ static void load_gitmodules_file(struct index_state 
*index,
        if (pos >= 0) {
                struct cache_entry *ce = index->cache[pos];
                if (!state && ce->ce_flags & CE_WT_REMOVE) {
-                       repo_read_gitmodules(the_repository);
+                       repo_read_gitmodules(the_repository, 0);
                } else if (state && (ce->ce_flags & CE_UPDATE)) {
                        submodule_free(the_repository);
                        checkout_entry(ce, state, NULL, NULL);
-                       repo_read_gitmodules(the_repository);
+                       repo_read_gitmodules(the_repository, 0);
                }
        }
 }
-- 
2.23.0

Reply via email to