Re: [PATCHv6 5/7] worktree: add function to check if worktrees are in use
- From
Duy Nguyen <pclouds@gmail.com>
- Date
- Dec 8, 2016, 10:40 UTC
- Message-ID
- <CACsJy8ANNz6FsJ4_5MOhj2Qqd+wHHu5UpVOAobqEiHU2KM26eg@mail.gmail.com>
- In-Reply-To
- <20161208014623.7588-6-sbeller@google.com>
On Thu, Dec 8, 2016 at 8:46 AM, Stefan Beller <sbeller@google.com> wrote:
Show 22 quoted lines
> Signed-off-by: Stefan Beller <sbeller@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.
Show 33 quoted lines
> +{
> + 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