Re: [PATCH v3 0/2] worktree: Support `--orphan` when creating new worktrees
- From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- Date
- Nov 22, 2022, 23:55 UTC
- Message-ID
- <221123.86a64ia6bx.gmgdl@evledraar.gmail.com>
- In-Reply-To
- <20221122232647.2jdsp5kioq7muymb@phi>
On Tue, Nov 22 2022, Jacob Abel wrote:
Show 58 quoted lines
> On 22/11/22 12:16AM, Eric Sunshine wrote:
>> On Sat, Nov 19, 2022 at 6:49 AM Ævar Arnfjörð Bjarmason
>> <avarab@gmail.com> wrote:
>> > On Sat, Nov 19 2022, Jacob Abel wrote:
>> > > I'd support adding an `advise()` for at least the basic case where you try to
>> > > create a worktree and no branches currently exist in the repository.
>> > > i.e. something like this:
>> > >
>> > > % git -C foo.git worktree add foobar/
>> > > hint: If you meant to create a new initial branch for this repository,
>> > > hint: e.g. 'main', you can do so using the --orphan option:
>> > > hint:
>> > > hint: git worktree add --orphan main main/
>> > > hint:
>> > > fatal: invalid reference: 'foobar'
>> > > and
>> > > % git -C foo.git worktree add -b foobar foobardir/
>> > > hint: If you meant to create a new initial branch for this repository,
>> > > hint: e.g. 'main', you can do so using the --orphan option:
>> > > hint:
>> > > hint: git worktree add --orphan main main/
>> > > hint:
>> > > fatal: invalid reference: 'foobar'
>> >
>> > I think those would make sense, yes.
>>
>> Yes, this sort of advice could go a long way toward addressing my
>> discoverability concerns. (I think, too, we should be able to
>> dynamically customize the advice to mention "foobar" rather than
>> "main" in order to more directly help the user.) Along with that,
>> explaining this use-case in the git-worktree documentation would also
>> be valuable for improving discoverability.
>
> Perfect. I think I've got this working already on my end using more or less
> the following:
>
> diff --git a/builtin/worktree.c b/builtin/worktree.c
> index 71786b72f6..f65b63d9d2 100644
> --- a/builtin/worktree.c
> +++ b/builtin/worktree.c
> @@ -736,7 +736,21 @@ static int add(int ac, const char **av, const char *prefix)
> if (!opts.quiet)
> print_preparing_worktree_line(opts.detach, branch, new_branch, !!new_branch_force);
>
> - if (new_branch && !opts.orphan_branch) {
> + if (opts.orphan_branch) {
> + branch = new_branch;
> + } else if (!lookup_commit_reference_by_name("head")) {
> + /*
> + * if head does not reference a valid commit, only worktrees
> + * based on orphan branches can be created.
> + */
> + advise("if you meant to create a new orphan branch for this repository,\n"
> + "e.g. '%s', you can do so using the --orphan option:\n"
> + "\n"
> + " git worktree add --orphan %s %s\n"
> + "\n",
> + new_branch, new_branch, path);We don't consistently check for this, unfortunately (but I have some local patches for it), but to add an advice you should:
* Add it to Documentation/config/advice.txt (in sorted order) * Add the corresponding enum to advice.h * And to the advice.c listing * Then use advise_if_enabled(<that new enum>, ...) in cases such as this one. * End your message with a suggstion about how to disable the advice: git grep -W -F 'git config advice.' -- '*.c'
That's rather tedious, sorry, but that's the extent of the current boilerplate...