Subject: [WIP/RFC 20/23] submodule-config: refactor to allow for multiple submodule_cache's

From: Brandon Williams <[email-masked]>
Date: Thu, 18 May 2017 16:21:31 -0700

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-masked]>
---
 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