/* * note: this function should be able to detect shared symref even if * HEAD is temporarily detached (e.g. in the middle of rebase or * bisect). New commands that do similar things should update this * function as well. */ const struct worktree *find_shared_symref(const char *symref, const char *target) { const struct worktree *existing = NULL; struct strbuf path = STRBUF_INIT; struct strbuf sb = STRBUF_INIT; static struct worktree **worktrees; int i = 0; if (worktrees) free_worktrees(worktrees); worktrees = get_worktrees(); for (i = 0; worktrees[i]; i++) { struct worktree *wt = worktrees[i]; if (wt->is_bare) continue; if (wt->is_detached && !strcmp(symref, "HEAD")) { if (is_worktree_being_rebased(wt, target)) { existing = wt; break; } if (is_worktree_being_bisected(wt, target)) { existing = wt; break; } } strbuf_reset(&path); strbuf_reset(&sb); strbuf_addf(&path, "%s/%s", get_worktree_git_dir(wt), symref); if (parse_ref(path.buf, &sb, NULL)) { continue; } if (!strcmp(sb.buf, target)) { existing = wt; break; } } strbuf_release(&path); strbuf_release(&sb); return existing; }
/* * note: this function should be able to detect shared symref even if * HEAD is temporarily detached (e.g. in the middle of rebase or * bisect). New commands that do similar things should update this * function as well. */ const struct worktree *find_shared_symref(const char *symref, const char *target) { const struct worktree *existing = NULL; static struct worktree **worktrees; int i = 0; if (worktrees) free_worktrees(worktrees); worktrees = get_worktrees(0); for (i = 0; worktrees[i]; i++) { struct worktree *wt = worktrees[i]; const char *symref_target; struct ref_store *refs; int flags; if (wt->is_bare) continue; if (wt->is_detached && !strcmp(symref, "HEAD")) { if (is_worktree_being_rebased(wt, target)) { existing = wt; break; } if (is_worktree_being_bisected(wt, target)) { existing = wt; break; } } refs = get_worktree_ref_store(wt); symref_target = refs_resolve_ref_unsafe(refs, symref, 0, NULL, &flags); if ((flags & REF_ISSYMREF) && symref_target && !strcmp(symref_target, target)) { existing = wt; break; } } return existing; }
static void reject_rebase_or_bisect_branch(const char *target) { struct worktree **worktrees = get_worktrees(); int i; for (i = 0; worktrees[i]; i++) { struct worktree *wt = worktrees[i]; if (!wt->is_detached) continue; if (is_worktree_being_rebased(wt, target)) die(_("Branch %s is being rebased at %s"), target, wt->path); if (is_worktree_being_bisected(wt, target)) die(_("Branch %s is being bisected at %s"), target, wt->path); } free_worktrees(worktrees); }