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 <pclo...@gmail.com>
> ---
>  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

Reply via email to