A repository object will have its own submodule cache so lay the ground
work for allowing multiple submodule cache structs.

Signed-off-by: Brandon Williams <[email protected]>
---
 submodule-config.c | 40 ++++++++++++++++++++++++++++++++--------
 submodule-config.h | 10 ++++++++++
 2 files changed, 42 insertions(+), 8 deletions(-)

diff --git a/submodule-config.c b/submodule-config.c
index 4f58491dd..666643d52 100644
--- a/submodule-config.c
+++ b/submodule-config.c
@@ -30,7 +30,7 @@ enum lookup_type {
        lookup_path
 };
 
-static struct submodule_cache the_submodule_cache;
+struct submodule_cache the_submodule_cache;
 static int is_cache_init;
 
 static int config_path_cmp(const struct submodule_entry *a,
@@ -49,7 +49,12 @@ 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)
+struct submodule_cache *submodule_cache_alloc(void)
+{
+       return xcalloc(1, sizeof(struct submodule_cache));
+}
+
+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);
@@ -64,7 +69,7 @@ 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;
@@ -82,6 +87,12 @@ static void cache_free(struct submodule_cache *cache)
        hashmap_free(&cache->for_name, 1);
 }
 
+void submodule_cache_free(struct submodule_cache *cache)
+{
+       submodule_cache_clear(cache);
+       free(cache);
+}
+
 static unsigned int hash_sha1_string(const unsigned char *sha1,
                                     const char *string)
 {
@@ -493,27 +504,40 @@ static const struct submodule *config_from(struct 
submodule_cache *cache,
        return submodule;
 }
 
+const struct submodule *
+submodule_from_cache(struct submodule_cache *cache,
+                    const unsigned char *treeish_name,
+                    const char *key)
+{
+       return config_from(cache, treeish_name, key, lookup_path);
+}
+
 static void ensure_cache_init(void)
 {
        if (is_cache_init)
                return;
 
-       cache_init(&the_submodule_cache);
+       submodule_cache_init(&the_submodule_cache);
        is_cache_init = 1;
 }
 
-int parse_submodule_config_option(const char *var, const char *value)
+int parse_submodule_config_option_cache(struct submodule_cache *cache, const 
char *var, const char *value)
 {
        struct parse_config_parameter parameter;
-       parameter.cache = &the_submodule_cache;
+       parameter.cache = 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)
+{
+       ensure_cache_init();
+       return parse_submodule_config_option_cache(&the_submodule_cache, var, 
value);
+}
+
 const struct submodule *submodule_from_name(const unsigned char *treeish_name,
                const char *name)
 {
@@ -530,6 +554,6 @@ const struct submodule *submodule_from_path(const unsigned 
char *treeish_name,
 
 void submodule_free(void)
 {
-       cache_free(&the_submodule_cache);
+       submodule_cache_clear(&the_submodule_cache);
        is_cache_init = 0;
 }
diff --git a/submodule-config.h b/submodule-config.h
index d434ecdb4..ed598aadd 100644
--- a/submodule-config.h
+++ b/submodule-config.h
@@ -22,14 +22,24 @@ struct submodule {
        int recommend_shallow;
 };
 
+struct submodule_cache;
+
+extern struct submodule_cache *submodule_cache_alloc(void);
+extern void submodule_cache_init(struct submodule_cache *cache);
+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 parse_submodule_config_option_cache(struct submodule_cache *cache, 
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 submodule_cache 
*cache,
+                                                   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);
-- 
2.13.0.303.g4ebf302169-goog

Reply via email to