Re: [PATCH v7 5/8] fetch: protect branches checked out in all worktrees
From: Eric Sunshine <hidden>
Date: 2021-12-02 02:52:08
On Wed, Dec 1, 2021 at 5:16 PM Anders Kaseorg [off-list ref] wrote:
quoted hunk ↗ jump to hunk
Refuse to fetch into the currently checked out branch of any working tree, not just the current one. [...] Signed-off-by: Anders Kaseorg <redacted> ---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...
quoted hunk ↗ jump to hunk
@@ -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.