On Tue, 20 Jun 2017 12:19:50 -0700
Brandon Williams <bmw...@google.com> wrote:

> Introduce 'repo_submodule_init()' which performs initialization of a
> 'struct repository' as a submodule of another 'struct repository'.
> 
> The resulting submodule can be in one of three states:
> 
>   1. The submodule is initialized and has a worktree.
> 
>   2. The submodule is initialized but does not have a worktree.  This
>      would occur when the submodule's gitdir is present in the
>      superproject's 'gitdir/modules/' directory yet the submodule has not
>      been checked out in superproject's worktree.

In a recent proposal [1] to update the submodule documentation, an
"initialized submodule" is one that has a working directory, which seems
to have a different meaning of "initialized" (to the paragraphs above).

Or did you mean the "struct repository" is initialized etc.? In which
case, it does not seem strange to me that a repository is initialized
but does not have a worktree, since bare repositories are like that too.

[1] https://public-inbox.org/git/20170621173756.4444-1-sbel...@google.com/

>   3. The submodule remains uninitialized due to an error in the
>      initialization process or there is no matching submodule at the
>      provided path in the superproject.
> 
> Signed-off-by: Brandon Williams <bmw...@google.com>

[snip]

> +/*
> + * Initialize 'submodule' as the submodule given by 'path' in parent 
> repository
> + * 'superproject'.
> + * Return 0 upon success and a non-zero value upon failure.
> + */
> +int repo_submodule_init(struct repository *submodule,
> +                     struct repository *superproject,
> +                     const char *path)
> +{
> +     const struct submodule *sub;
> +     struct strbuf submodule_path = STRBUF_INIT;
> +     int ret = 0;
> +
> +     sub = submodule_from_cache(superproject, null_sha1, path);
> +     if (!sub) {
> +             ret = -1;
> +             goto out;
> +     }
> +
> +     strbuf_repo_worktree_path(&submodule_path, superproject, "%s", path);
> +
> +     if (repo_init(submodule, submodule_path.buf, submodule_path.buf)) {

This works because the 2nd parameter (git_dir) can take in either the
Git directory itself or its parent, but it does make the call site look
strange. Would it be a good idea to make it mandatory to specify the Git
directory? That would make call sites clearer but require more code
there.

> +             strbuf_reset(&submodule_path);
> +             strbuf_repo_git_path(&submodule_path, superproject,
> +                                  "modules/%s", sub->name);
> +
> +             if (repo_init(submodule, submodule_path.buf, NULL)) {
> +                     ret = -1;
> +                     goto out;
> +             }
> +     }
> +
> +     submodule->submodule_prefix = xstrfmt("%s%s/",
> +                                           superproject->submodule_prefix ?
> +                                           superproject->submodule_prefix :
> +                                           "", path);
> +
> +out:
> +     strbuf_release(&submodule_path);
> +     return ret;
> +}

Reply via email to