On Thu, Dec 8, 2016 at 8:46 AM, Stefan Beller <sbel...@google.com> wrote:
> Signed-off-by: Stefan Beller <sbel...@google.com>
> ---
>  worktree.c | 24 ++++++++++++++++++++++++
>  worktree.h |  7 +++++++
>  2 files changed, 31 insertions(+)
>
> diff --git a/worktree.c b/worktree.c
> index 75db689672..2559f33846 100644
> --- a/worktree.c
> +++ b/worktree.c
> @@ -406,3 +406,27 @@ const struct worktree *find_shared_symref(const char 
> *symref,
>
>         return existing;
>  }
> +
> +static int uses_worktree_internal(struct worktree **worktrees)
> +{
> +       int i;
> +       for (i = 0; worktrees[i]; i++)
> +               ; /* nothing */
> +
> +       free_worktrees(worktrees);


Ayy.. caller allocates, callee frees. This might become a new
maintenance nightmare. Elsewhere I believe we (Junio and me) discussed
the possibility of returning the number of worktrees from
get_worktrees() too. get_worktrees() would take an "int *", if not
NULL, we return the number of worktrees in that pointer.

It's probably a better approach, although I'm afraid it'll add a bit
more work on you.

Alternatively, we could add a new flag to get_worktrees() to tell it
to return all worktrees if there is a least one linked worktree, or
return NULL if there's only main worktree. I'm not sure if this is
clever or very stupid.

> +       return i > 1;
> +}
> +
> +int uses_worktrees(void)

"has" may be a better verb than "uses". maybe "has_linked_worktrees"
since we always have and use the main worktree.

> +{
> +       return uses_worktree_internal(get_worktrees(0));
> +}
> +
> +int submodule_uses_worktrees(const char *path)
> +{
> +       struct worktree **worktrees = get_submodule_worktrees(path, 0);
> +       if (!worktrees)
> +               return 0;
> +
> +       return uses_worktree_internal(worktrees);
> +}
> diff --git a/worktree.h b/worktree.h
> index 157fbc4a66..76027b1fd2 100644
> --- a/worktree.h
> +++ b/worktree.h
> @@ -33,6 +33,13 @@ extern struct worktree **get_worktrees(unsigned flags);
>  extern struct worktree **get_submodule_worktrees(const char *path,
>                                                  unsigned flags);
>
> +/*
> + * Returns 1 if more than one worktree exists.
> + * Returns 0 if only the main worktree exists.
> + */
> +extern int uses_worktrees(void);
> +extern int submodule_uses_worktrees(const char *path);
> +
>  /*
>   * Return git dir of the worktree. Note that the path may be relative.
>   * If wt is NULL, git dir of current worktree is returned.
> --
> 2.11.0.rc2.30.gc512cbd.dirty
>



-- 
Duy

Reply via email to