Move the responsibility for registering the ref_store for a submodule from base_ref_store_init() to a new function, register_ref_store(). Call the latter from ref_store_init(). This means that base_ref_store_init() can lose its submodule argument, further weakening the 1:1 relationship between ref_stores and submodules. Signed-off-by: Michael Haggerty <mhagger@xxxxxxxxxxxx> --- refs.c | 19 +++++++++++++------ refs/files-backend.c | 2 +- refs/refs-internal.h | 15 ++++++++++----- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/refs.c b/refs.c index 723b4be..6012f67 100644 --- a/refs.c +++ b/refs.c @@ -1395,11 +1395,8 @@ static struct ref_store *main_ref_store; /* A hashmap of ref_stores, stored by submodule name: */ static struct hashmap submodule_ref_stores; -void base_ref_store_init(struct ref_store *refs, - const struct ref_storage_be *be, - const char *submodule) +void register_ref_store(struct ref_store *refs, const char *submodule) { - refs->be = be; if (!submodule) { if (main_ref_store) die("BUG: main_ref_store initialized twice"); @@ -1416,18 +1413,28 @@ void base_ref_store_init(struct ref_store *refs, } } +void base_ref_store_init(struct ref_store *refs, + const struct ref_storage_be *be) +{ + refs->be = be; +} + struct ref_store *ref_store_init(const char *submodule) { const char *be_name = "files"; struct ref_storage_be *be = find_ref_storage_backend(be_name); + struct ref_store *refs; if (!be) die("BUG: reference backend %s is unknown", be_name); if (!submodule || !*submodule) - return be->init(NULL); + refs = be->init(NULL); else - return be->init(submodule); + refs = be->init(submodule); + + register_ref_store(refs, submodule); + return refs; } struct ref_store *lookup_ref_store(const char *submodule) diff --git a/refs/files-backend.c b/refs/files-backend.c index 6ed7e13..794b88c 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -980,7 +980,7 @@ static struct ref_store *files_ref_store_create(const char *submodule) struct files_ref_store *refs = xcalloc(1, sizeof(*refs)); struct ref_store *ref_store = (struct ref_store *)refs; - base_ref_store_init(ref_store, &refs_be_files, submodule); + base_ref_store_init(ref_store, &refs_be_files); refs->submodule = submodule ? xstrdup(submodule) : ""; diff --git a/refs/refs-internal.h b/refs/refs-internal.h index 97f275b..73281f5 100644 --- a/refs/refs-internal.h +++ b/refs/refs-internal.h @@ -481,7 +481,7 @@ struct ref_store; * Initialize the ref_store for the specified submodule, or for the * main repository if submodule == NULL. These functions should call * base_ref_store_init() to initialize the shared part of the - * ref_store and to record the ref_store for later lookup. + * ref_store. */ typedef struct ref_store *ref_store_init_fn(const char *submodule); @@ -630,12 +630,17 @@ struct ref_store { }; /* - * Fill in the generic part of refs for the specified submodule and - * add it to our collection of reference stores. + * Register the specified ref_store to be the one that should be used + * for submodule (or the main repository if submodule is NULL). It is + * a fatal error to call this function twice for the same submodule. + */ +void register_ref_store(struct ref_store *refs, const char *submodule); + +/* + * Fill in the generic part of refs. */ void base_ref_store_init(struct ref_store *refs, - const struct ref_storage_be *be, - const char *submodule); + const struct ref_storage_be *be); /* * Create, record, and return a ref_store instance for the specified -- 2.9.3