Thread (19 messages) 19 messages, 3 authors, 2022-01-12

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.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help