]> git.ipfire.org Git - thirdparty/git.git/commitdiff
submodule-config: store the_submodule_cache in the_repository
authorBrandon Williams <bmwill@google.com>
Thu, 22 Jun 2017 18:43:44 +0000 (11:43 -0700)
committerJunio C Hamano <gitster@pobox.com>
Sat, 24 Jun 2017 01:24:34 +0000 (18:24 -0700)
Refactor how 'the_submodule_cache' is handled so that it can be stored
inside of a repository object.  Also migrate 'the_submodule_cache' to be
stored in 'the_repository'.

Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
repository.c
repository.h
submodule-config.c
submodule-config.h

index 6f6f4d91ef511062d8a6980ca6c80f8593002637..358c175172e60023005fd617ba64e02d6e15f37c 100644 (file)
@@ -1,6 +1,7 @@
 #include "cache.h"
 #include "repository.h"
 #include "config.h"
+#include "submodule-config.h"
 
 /* The main repository */
 static struct repository the_repo;
@@ -164,6 +165,11 @@ void repo_clear(struct repository *repo)
                repo->config = NULL;
        }
 
+       if (repo->submodule_cache) {
+               submodule_cache_free(repo->submodule_cache);
+               repo->submodule_cache = NULL;
+       }
+
        if (repo->index) {
                discard_index(repo->index);
                free(repo->index);
index 3a41568aa06698cda7b4819d1a0110b9d95709f4..c40738ceb8c7b7c1ff81741c6c66ae09e31992e7 100644 (file)
@@ -3,6 +3,7 @@
 
 struct config_set;
 struct index_state;
+struct submodule_cache;
 
 struct repository {
        /* Environment */
@@ -50,6 +51,9 @@ struct repository {
         */
        struct config_set *config;
 
+       /* Repository's submodule config as defined by '.gitmodules' */
+       struct submodule_cache *submodule_cache;
+
        /*
         * Repository's in-memory index.
         * 'repo_read_index()' can be used to populate 'index'.
index d8f8d5ea3277d4dcfc8119e726e2f78c9aa881c9..37cfcceb950b1777b46abecd5415196c76e11826 100644 (file)
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "repository.h"
 #include "config.h"
 #include "submodule-config.h"
 #include "submodule.h"
@@ -15,6 +16,7 @@
 struct submodule_cache {
        struct hashmap for_path;
        struct hashmap for_name;
+       unsigned initialized:1;
 };
 
 /*
@@ -31,9 +33,6 @@ enum lookup_type {
        lookup_path
 };
 
-static struct submodule_cache the_submodule_cache;
-static int is_cache_init;
-
 static int config_path_cmp(const struct submodule_entry *a,
                           const struct submodule_entry *b,
                           const void *unused)
@@ -50,10 +49,16 @@ static int config_name_cmp(const struct submodule_entry *a,
               hashcmp(a->config->gitmodules_sha1, b->config->gitmodules_sha1);
 }
 
-static void cache_init(struct submodule_cache *cache)
+static struct submodule_cache *submodule_cache_alloc(void)
+{
+       return xcalloc(1, sizeof(struct submodule_cache));
+}
+
+static void submodule_cache_init(struct submodule_cache *cache)
 {
        hashmap_init(&cache->for_path, (hashmap_cmp_fn) config_path_cmp, 0);
        hashmap_init(&cache->for_name, (hashmap_cmp_fn) config_name_cmp, 0);
+       cache->initialized = 1;
 }
 
 static void free_one_config(struct submodule_entry *entry)
@@ -65,11 +70,14 @@ static void free_one_config(struct submodule_entry *entry)
        free(entry->config);
 }
 
-static void cache_free(struct submodule_cache *cache)
+static void submodule_cache_clear(struct submodule_cache *cache)
 {
        struct hashmap_iter iter;
        struct submodule_entry *entry;
 
+       if (!cache->initialized)
+               return;
+
        /*
         * We iterate over the name hash here to be symmetric with the
         * allocation of struct submodule entries. Each is allocated by
@@ -81,6 +89,13 @@ static void cache_free(struct submodule_cache *cache)
 
        hashmap_free(&cache->for_path, 1);
        hashmap_free(&cache->for_name, 1);
+       cache->initialized = 0;
+}
+
+void submodule_cache_free(struct submodule_cache *cache)
+{
+       submodule_cache_clear(cache);
+       free(cache);
 }
 
 static unsigned int hash_sha1_string(const unsigned char *sha1,
@@ -494,43 +509,62 @@ out:
        return submodule;
 }
 
-static void ensure_cache_init(void)
+static void submodule_cache_check_init(struct repository *repo)
 {
-       if (is_cache_init)
+       if (repo->submodule_cache && repo->submodule_cache->initialized)
                return;
 
-       cache_init(&the_submodule_cache);
-       is_cache_init = 1;
+       if (!repo->submodule_cache)
+               repo->submodule_cache = submodule_cache_alloc();
+
+       submodule_cache_init(repo->submodule_cache);
 }
 
-int parse_submodule_config_option(const char *var, const char *value)
+int submodule_config_option(struct repository *repo,
+                           const char *var, const char *value)
 {
        struct parse_config_parameter parameter;
-       parameter.cache = &the_submodule_cache;
+
+       submodule_cache_check_init(repo);
+
+       parameter.cache = repo->submodule_cache;
        parameter.treeish_name = NULL;
        parameter.gitmodules_sha1 = null_sha1;
        parameter.overwrite = 1;
 
-       ensure_cache_init();
        return parse_config(var, value, &parameter);
 }
 
+int parse_submodule_config_option(const char *var, const char *value)
+{
+       return submodule_config_option(the_repository, var, value);
+}
+
 const struct submodule *submodule_from_name(const unsigned char *treeish_name,
                const char *name)
 {
-       ensure_cache_init();
-       return config_from(&the_submodule_cache, treeish_name, name, lookup_name);
+       submodule_cache_check_init(the_repository);
+       return config_from(the_repository->submodule_cache, treeish_name, name, lookup_name);
 }
 
 const struct submodule *submodule_from_path(const unsigned char *treeish_name,
                const char *path)
 {
-       ensure_cache_init();
-       return config_from(&the_submodule_cache, treeish_name, path, lookup_path);
+       submodule_cache_check_init(the_repository);
+       return config_from(the_repository->submodule_cache, treeish_name, path, lookup_path);
+}
+
+const struct submodule *submodule_from_cache(struct repository *repo,
+                                            const unsigned char *treeish_name,
+                                            const char *key)
+{
+       submodule_cache_check_init(repo);
+       return config_from(repo->submodule_cache, treeish_name,
+                          key, lookup_path);
 }
 
 void submodule_free(void)
 {
-       cache_free(&the_submodule_cache);
-       is_cache_init = 0;
+       if (the_repository->submodule_cache)
+               submodule_cache_clear(the_repository->submodule_cache);
 }
index d434ecdb45c074dd386405f20ed73ac1c8b646bd..bc45a25e850eb600eb9883d83d1ec1d3fc08db4a 100644 (file)
@@ -22,14 +22,24 @@ struct submodule {
        int recommend_shallow;
 };
 
+struct submodule_cache;
+struct repository;
+
+extern void submodule_cache_free(struct submodule_cache *cache);
+
 extern int parse_fetch_recurse_submodules_arg(const char *opt, const char *arg);
 extern int parse_update_recurse_submodules_arg(const char *opt, const char *arg);
 extern int parse_push_recurse_submodules_arg(const char *opt, const char *arg);
 extern int parse_submodule_config_option(const char *var, const char *value);
+extern int submodule_config_option(struct repository *repo,
+                                  const char *var, const char *value);
 extern const struct submodule *submodule_from_name(
                const unsigned char *commit_or_tree, const char *name);
 extern const struct submodule *submodule_from_path(
                const unsigned char *commit_or_tree, const char *path);
+extern const struct submodule *submodule_from_cache(struct repository *repo,
+                                                   const unsigned char *treeish_name,
+                                                   const char *key);
 extern int gitmodule_sha1_from_commit(const unsigned char *commit_sha1,
                                      unsigned char *gitmodules_sha1,
                                      struct strbuf *rev);