@@ -385,6 +385,7 @@ static void prepare_checked_out_branches(void)
worktrees = get_worktrees();
while (worktrees[i]) {
+ struct wt_status_state state = { 0 };
struct worktree *wt = worktrees[i++];
if (wt->is_bare)
@@ -394,6 +395,29 @@ static void prepare_checked_out_branches(void)
strmap_put(¤t_checked_out_branches,
wt->head_ref,
xstrdup(wt->path));
+
+ if (wt_status_check_rebase(wt, &state) &&
+ (state.rebase_in_progress || state.rebase_interactive_in_progress) &&
+ state.branch) {
+ struct strbuf ref = STRBUF_INIT;
+ strbuf_addf(&ref, "refs/heads/%s", state.branch);
+ strmap_put(¤t_checked_out_branches,
+ ref.buf,
+ xstrdup(wt->path));
+ strbuf_release(&ref);
+ }
+ wt_status_state_free_buffers(&state);
+
+ if (wt_status_check_bisect(wt, &state) &&
+ state.branch) {
+ struct strbuf ref = STRBUF_INIT;
+ strbuf_addf(&ref, "refs/heads/%s", state.branch);
+ strmap_put(¤t_checked_out_branches,
+ ref.buf,
+ xstrdup(wt->path));
+ strbuf_release(&ref);
+ }
+ wt_status_state_free_buffers(&state);
}
free_worktrees(worktrees);
@@ -413,9 +437,7 @@ const char *branch_checked_out(const char *refname)
*/
int validate_new_branchname(const char *name, struct strbuf *ref, int force)
{
- struct worktree **worktrees;
- const struct worktree *wt;
-
+ const char *path;
if (!validate_branchname(name, ref))
return 0;
@@ -423,13 +445,10 @@ int validate_new_branchname(const char *name, struct strbuf *ref, int force)
die(_("a branch named '%s' already exists"),
ref->buf + strlen("refs/heads/"));
- worktrees = get_worktrees();
- wt = find_shared_symref(worktrees, "HEAD", ref->buf);
- if (wt && !wt->is_bare)
+ if ((path = branch_checked_out(ref->buf)))
die(_("cannot force update the branch '%s' "
"checked out at '%s'"),
- ref->buf + strlen("refs/heads/"), wt->path);
- free_worktrees(worktrees);
+ ref->buf + strlen("refs/heads/"), path);
return 1;
}
@@ -26,4 +26,26 @@ test_expect_success 'refuse to overwrite: checked out in worktree' '
done
'
+test_expect_success 'refuse to overwrite: worktree in bisect' '
+ test_when_finished rm -rf .git/worktrees/wt-*/BISECT_* &&
+
+ touch .git/worktrees/wt-4/BISECT_LOG &&
+ echo refs/heads/fake-2 >.git/worktrees/wt-4/BISECT_START &&
+
+ test_must_fail git branch -f fake-2 HEAD 2>err &&
+ grep "cannot force update the branch '\''fake-2'\'' checked out at.*wt-4" err
+'
+
+test_expect_success 'refuse to overwrite: worktree in rebase' '
+ test_when_finished rm -rf .git/worktrees/wt-*/rebase-merge &&
+
+ mkdir -p .git/worktrees/wt-3/rebase-merge &&
+ touch .git/worktrees/wt-3/rebase-merge/interactive &&
+ echo refs/heads/fake-1 >.git/worktrees/wt-3/rebase-merge/head-name &&
+ echo refs/heads/fake-2 >.git/worktrees/wt-3/rebase-merge/onto &&
+
+ test_must_fail git branch -f fake-1 HEAD 2>err &&
+ grep "cannot force update the branch '\''fake-1'\'' checked out at.*wt-3" err
+'
+
test_done