summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrandon Williams <bmwill@google.com>2017-06-22 11:43:44 -0700
committerJunio C Hamano <gitster@pobox.com>2017-06-23 18:24:34 -0700
commitbf12fcdf5ec00e6b7d0978750df9e0146eb57c75 (patch)
tree5b71651780a3f276212c35f05e67c8a8c5c3358c
parent639e30b5b2214c68c042215a279ac1fbb372d73d (diff)
downloadgit-bf12fcdf5ec00e6b7d0978750df9e0146eb57c75.tar.gz
submodule-config: store the_submodule_cache in the_repository
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>
-rw-r--r--repository.c6
-rw-r--r--repository.h4
-rw-r--r--submodule-config.c70
-rw-r--r--submodule-config.h10
4 files changed, 72 insertions, 18 deletions
diff --git a/repository.c b/repository.c
index 6f6f4d91ef..358c175172 100644
--- a/repository.c
+++ b/repository.c
@@ -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);
diff --git a/repository.h b/repository.h
index 3a41568aa0..c40738ceb8 100644
--- a/repository.h
+++ b/repository.h
@@ -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'.
diff --git a/submodule-config.c b/submodule-config.c
index d8f8d5ea32..37cfcceb95 100644
--- a/submodule-config.c
+++ b/submodule-config.c
@@ -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);
}
diff --git a/submodule-config.h b/submodule-config.h
index d434ecdb45..bc45a25e85 100644
--- a/submodule-config.h
+++ b/submodule-config.h
@@ -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);