]> git.ipfire.org Git - thirdparty/git.git/commitdiff
submodule-config: add skip_if_read option to repo_read_gitmodules()
authorMatheus Tavares <matheus.bernardino@usp.br>
Thu, 16 Jan 2020 02:39:55 +0000 (23:39 -0300)
committerJunio C Hamano <gitster@pobox.com>
Fri, 17 Jan 2020 21:52:14 +0000 (13:52 -0800)
Currently, submodule-config.c doesn't have an externally accessible
function to read gitmodules only if it wasn't already read. But this
exact behavior is internally implemented by gitmodules_read_check(), to
perform a lazy load. Let's merge this function with
repo_read_gitmodules() adding a 'skip_if_read' which allows 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.bernardino@usp.br>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/grep.c
submodule-config.c
submodule-config.h
unpack-trees.c

index 4a436d6c993d0b169c0f6043d36bd8ac82bd8d97..d3ed05c1daf08c4d6e17588228a5985e5778c268 100644 (file)
@@ -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
index 85064810b20adc7dc02e1d7a776b58437e9595c6..bd5e14ab20aea2684c889dfe564a667b38ef286f 100644 (file)
@@ -674,10 +674,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;
 
@@ -703,20 +706,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);
 }
 
@@ -724,7 +718,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);
 }
 
index 42918b55e88e4855ffffa0a35eaa1994db91cb14..c11e22cf509ad1be7531c1740f4701578e6db723 100644 (file)
@@ -61,7 +61,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);
 
 /**
index 2399b6818be6ddb9a6f4103cec667b2e2a9c24d0..f5a805180351753d8d17823d8a5d28b1cade5b6e 100644 (file)
@@ -291,11 +291,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);
                }
        }
 }