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:
parent
639e30b5b2
commit
bf12fcdf5e
@ -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);
|
||||
|
@ -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'.
|
||||
|
@ -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, ¶meter);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user