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>
This commit is contained in:
Brandon Williams 2017-06-22 11:43:44 -07:00 committed by Junio C Hamano
parent 639e30b5b2
commit bf12fcdf5e
4 changed files with 72 additions and 18 deletions

View file

@ -1,6 +1,7 @@
#include "cache.h" #include "cache.h"
#include "repository.h" #include "repository.h"
#include "config.h" #include "config.h"
#include "submodule-config.h"
/* The main repository */ /* The main repository */
static struct repository the_repo; static struct repository the_repo;
@ -164,6 +165,11 @@ void repo_clear(struct repository *repo)
repo->config = NULL; repo->config = NULL;
} }
if (repo->submodule_cache) {
submodule_cache_free(repo->submodule_cache);
repo->submodule_cache = NULL;
}
if (repo->index) { if (repo->index) {
discard_index(repo->index); discard_index(repo->index);
free(repo->index); free(repo->index);

View file

@ -3,6 +3,7 @@
struct config_set; struct config_set;
struct index_state; struct index_state;
struct submodule_cache;
struct repository { struct repository {
/* Environment */ /* Environment */
@ -50,6 +51,9 @@ struct repository {
*/ */
struct config_set *config; struct config_set *config;
/* Repository's submodule config as defined by '.gitmodules' */
struct submodule_cache *submodule_cache;
/* /*
* Repository's in-memory index. * Repository's in-memory index.
* 'repo_read_index()' can be used to populate 'index'. * 'repo_read_index()' can be used to populate 'index'.

View file

@ -1,4 +1,5 @@
#include "cache.h" #include "cache.h"
#include "repository.h"
#include "config.h" #include "config.h"
#include "submodule-config.h" #include "submodule-config.h"
#include "submodule.h" #include "submodule.h"
@ -15,6 +16,7 @@
struct submodule_cache { struct submodule_cache {
struct hashmap for_path; struct hashmap for_path;
struct hashmap for_name; struct hashmap for_name;
unsigned initialized:1;
}; };
/* /*
@ -31,9 +33,6 @@ enum lookup_type {
lookup_path lookup_path
}; };
static struct submodule_cache the_submodule_cache;
static int is_cache_init;
static int config_path_cmp(const struct submodule_entry *a, static int config_path_cmp(const struct submodule_entry *a,
const struct submodule_entry *b, const struct submodule_entry *b,
const void *unused) 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); 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_path, (hashmap_cmp_fn) config_path_cmp, 0);
hashmap_init(&cache->for_name, (hashmap_cmp_fn) config_name_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) 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); 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 hashmap_iter iter;
struct submodule_entry *entry; struct submodule_entry *entry;
if (!cache->initialized)
return;
/* /*
* We iterate over the name hash here to be symmetric with the * We iterate over the name hash here to be symmetric with the
* allocation of struct submodule entries. Each is allocated by * 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_path, 1);
hashmap_free(&cache->for_name, 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, static unsigned int hash_sha1_string(const unsigned char *sha1,
@ -494,43 +509,62 @@ static const struct submodule *config_from(struct submodule_cache *cache,
return submodule; 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; return;
cache_init(&the_submodule_cache); if (!repo->submodule_cache)
is_cache_init = 1; 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; 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.treeish_name = NULL;
parameter.gitmodules_sha1 = null_sha1; parameter.gitmodules_sha1 = null_sha1;
parameter.overwrite = 1; parameter.overwrite = 1;
ensure_cache_init();
return parse_config(var, value, &parameter); 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 struct submodule *submodule_from_name(const unsigned char *treeish_name,
const char *name) const char *name)
{ {
ensure_cache_init(); submodule_cache_check_init(the_repository);
return config_from(&the_submodule_cache, treeish_name, name, lookup_name); return config_from(the_repository->submodule_cache, treeish_name, name, lookup_name);
} }
const struct submodule *submodule_from_path(const unsigned char *treeish_name, const struct submodule *submodule_from_path(const unsigned char *treeish_name,
const char *path) const char *path)
{ {
ensure_cache_init(); submodule_cache_check_init(the_repository);
return config_from(&the_submodule_cache, treeish_name, path, lookup_path); 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) void submodule_free(void)
{ {
cache_free(&the_submodule_cache); if (the_repository->submodule_cache)
is_cache_init = 0; submodule_cache_clear(the_repository->submodule_cache);
} }

View file

@ -22,14 +22,24 @@ struct submodule {
int recommend_shallow; 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_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_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_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(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( extern const struct submodule *submodule_from_name(
const unsigned char *commit_or_tree, const char *name); const unsigned char *commit_or_tree, const char *name);
extern const struct submodule *submodule_from_path( extern const struct submodule *submodule_from_path(
const unsigned char *commit_or_tree, const char *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, extern int gitmodule_sha1_from_commit(const unsigned char *commit_sha1,
unsigned char *gitmodules_sha1, unsigned char *gitmodules_sha1,
struct strbuf *rev); struct strbuf *rev);