On 03/18/2017 03:03 AM, Nguyễn Thái Ngọc Duy wrote:
> Keep repo-related path handling in one place. This will make it easier
> to add submodule/multiworktree support later.
> 
> This automatically adds the "if submodule then use the submodule version
> of git_path" to other call sites too. But it does not mean those
> operations are submodule-ready. Not yet.

Maybe `files_loose_ref_path()` would be a more descriptive name for the
new function. But I can live with it either way.

> Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@gmail.com>
> ---
>  refs/files-backend.c | 47 +++++++++++++++++++++++------------------------
>  1 file changed, 23 insertions(+), 24 deletions(-)
> 
> diff --git a/refs/files-backend.c b/refs/files-backend.c
> index 64d1ab3fe8..1a13fb5e2b 100644
> --- a/refs/files-backend.c
> +++ b/refs/files-backend.c
> @@ -1180,6 +1180,18 @@ static void files_reflog_path(struct files_ref_store 
> *refs,
>       strbuf_git_path(sb, "logs/%s", refname);
>  }
>  
> +static void files_refname_path(struct files_ref_store *refs,
> +                            struct strbuf *sb,
> +                            const char *refname)
> +{
> +     if (refs->submodule) {
> +             strbuf_git_path_submodule(sb, refs->submodule, "%s", refname);
> +             return;
> +     }
> +
> +     strbuf_git_path(sb, "%s", refname);
> +}
> +
>  /*
>   * Get the packed_ref_cache for the specified files_ref_store,
>   * creating it if necessary.
> @@ -1249,19 +1261,10 @@ static void read_loose_refs(const char *dirname, 
> struct ref_dir *dir)
>       struct strbuf refname;
>       struct strbuf path = STRBUF_INIT;
>       size_t path_baselen;
> -     int err = 0;
>  
> -     if (refs->submodule)
> -             err = strbuf_git_path_submodule(&path, refs->submodule, "%s", 
> dirname);
> -     else
> -             strbuf_git_path(&path, "%s", dirname);
> +     files_refname_path(refs, &path, dirname);
>       path_baselen = path.len;
>  
> -     if (err) {
> -             strbuf_release(&path);
> -             return;
> -     }
> -
>       d = opendir(path.buf);
>       if (!d) {
>               strbuf_release(&path);

The old code in the hunk above went to the trouble of handling errors
from `strbuf_git_path_submodule()`, which I think can happen if the
submodule path doesn't actually point at a directory that looks like a
Git repository. Your new code doesn't handle such an error.

It seems clear that `read_loose_refs()` is to late a place to be dealing
with such errors, and indeed it seems like the check
`is_nonbare_repository_dir()` in `get_ref_store()` should make such
errors impossible, so I think your change is OK. If you agree, it might
be appropriate to mention that reasoning in the commit message.

> [...]

Michael

Reply via email to