On 02/22/2017 03:04 PM, Nguyễn Thái Ngọc Duy wrote: > This is the last function in this code (besides public API) that takes > submodule argument and handles both main/submodule cases. Break it down, > move main store registration in get_main_ref_store() and keep the rest > in register_submodule_ref_store(). > > Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> > --- > refs.c | 50 ++++++++++++++++++++++++++------------------------ > 1 file changed, 26 insertions(+), 24 deletions(-) > > diff --git a/refs.c b/refs.c > index c284cb4f4..6adc38e42 100644 > --- a/refs.c > +++ b/refs.c > @@ -1412,29 +1412,6 @@ static struct ref_store *lookup_submodule_ref_store(const char *submodule) > } > > /* > - * 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. > - */ > -static void register_ref_store(struct ref_store *refs, const char *submodule) > -{ > - if (!submodule) { > - if (main_ref_store) > - die("BUG: main_ref_store initialized twice"); > - > - main_ref_store = refs; > - } else { > - if (!submodule_ref_stores.tablesize) > - hashmap_init(&submodule_ref_stores, submodule_hash_cmp, 0); > - > - if (hashmap_put(&submodule_ref_stores, > - alloc_submodule_hash_entry(submodule, refs))) > - die("BUG: ref_store for submodule '%s' initialized twice", > - submodule); > - } > -} > - > -/* > * Create, record, and return a ref_store instance for the specified > * submodule (or the main repository if submodule is NULL). > */ > @@ -1448,7 +1425,6 @@ static struct ref_store *ref_store_init(const char *submodule) > die("BUG: reference backend %s is unknown", be_name); > > refs = be->init(submodule); > - register_ref_store(refs, submodule); > return refs; > } > > @@ -1460,9 +1436,32 @@ static struct ref_store *get_main_ref_store(void) > return main_ref_store; > > refs = ref_store_init(NULL); > + if (refs) { > + if (main_ref_store) > + die("BUG: main_ref_store initialized twice"); > + > + main_ref_store = refs; > + } > return refs; Superfluous test: I don't think `ref_store_init()` ever returns NULL. This also implies that you could check `main_ref_store` before calling `ref_store_init()`, and eliminate a temporary. > } > > +/* > + * Register the specified ref_store to be the one that should be used > + * for submodule. It is a fatal error to call this function twice for > + * the same submodule. > + */ > +static void register_submodule_ref_store(struct ref_store *refs, > + const char *submodule) > +{ > + if (!submodule_ref_stores.tablesize) > + hashmap_init(&submodule_ref_stores, submodule_hash_cmp, 0); > + > + if (hashmap_put(&submodule_ref_stores, > + alloc_submodule_hash_entry(submodule, refs))) > + die("BUG: ref_store for submodule '%s' initialized twice", > + submodule); > +} > + > struct ref_store *get_ref_store(const char *submodule) > { > struct strbuf submodule_sb = STRBUF_INIT; > @@ -1480,6 +1479,9 @@ struct ref_store *get_ref_store(const char *submodule) > if (is_nonbare_repository_dir(&submodule_sb)) > refs = ref_store_init(submodule); > strbuf_release(&submodule_sb); > + > + if (refs) I think `refs` should always be non-NULL here for the same reason. > + register_submodule_ref_store(refs, submodule); > return refs; > } Michael