Re: [PATCH v7 5/8] fetch: protect branches checked out in all worktrees
- From
Eric Sunshine <sunshine@sunshineco.com>
- Date
- Dec 2, 2021, 02:51 UTC
- Message-ID
- <CAPig+cQudoq3QrF29W8p511s1rPtgZajtk1Rjm+N2SgoLY-Ltw@mail.gmail.com>
- In-Reply-To
- <20211201221547.1796213-6-andersk@mit.edu>
On Wed, Dec 1, 2021 at 5:16 PM Anders Kaseorg <andersk@mit.edu> wrote:
Show 20 quoted lines
> Refuse to fetch into the currently checked out branch of any working
> tree, not just the current one.
> [...]
> Signed-off-by: Anders Kaseorg <andersk@mit.edu>
> ---
> diff --git a/builtin/fetch.c b/builtin/fetch.c
> @@ -868,16 +868,17 @@ static int update_local_ref(struct ref *ref,
> + if (!update_head_ok &&
> + (wt = find_shared_symref(worktrees, "HEAD", ref->name)) &&
> + !wt->is_bare && !is_null_oid(&ref->old_oid)) {
> /*
> * If this is the head, and it's not okay to update
> * the head, and the old value of the head isn't empty...
> */
> format_display(display, '!', _("[rejected]"),
> - _("can't fetch in current branch"),
> + wt->is_current ?
> + _("can't fetch in current branch") :
> + _("checked out in another worktree"),
> remote, pretty_ref, summary_width);Minor observation: The "checked out in another worktree" message would be much more helpful if it mentioned the worktree itself...
Show 13 quoted lines
> @@ -1385,19 +1388,18 @@ static int prune_refs(struct refspec *rs, struct ref *ref_map,
> - if (ref_map->peer_ref && !strcmp(current_branch->refname,
> - ref_map->peer_ref->name))
> - die(_("refusing to fetch into current branch %s "
> - "of non-bare repository"),
> - current_branch->refname);
> + if (ref_map->peer_ref &&
> + (wt = find_shared_symref(worktrees, "HEAD",
> + ref_map->peer_ref->name)) &&
> + !wt->is_bare)
> + die(_("refusing to fetch into branch '%s' "
> + "checked out at '%s'"),
> + ref_map->peer_ref->name, wt->path);... much like this message has been updated to mention the worktree.
However, I didn't look to see how much work it would be to improve the earlier message; such an improvement could always be done atop this series later on by someone.