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 "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);
|
||||||
|
@ -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'.
|
||||||
|
@ -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 @@ out:
|
|||||||
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, ¶meter);
|
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 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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user