зеркало из https://github.com/microsoft/git.git
branch: do not rename a branch under bisect or rebase
The branch name in that case could be saved in rebase's head_name or bisect's BISECT_START files. Ideally we should try to update them as well. But it's trickier (*). Let's play safe and see if the user complains about inconveniences before doing that. (*) If we do it, bisect and rebase need to provide an API to rename branches. We can't do it in worktree.c or builtin/branch.c because when other people change rebase/bisect code, they may not be aware of this code and accidentally break it (e.g. rename the branch file, or refer to the branch in new files). It's a lot more work. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
04a3dfb8b5
Коммит
14ace5b77b
|
@ -524,6 +524,29 @@ static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sortin
|
||||||
ref_array_clear(&array);
|
ref_array_clear(&array);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
static void rename_branch(const char *oldname, const char *newname, int force)
|
static void rename_branch(const char *oldname, const char *newname, int force)
|
||||||
{
|
{
|
||||||
struct strbuf oldref = STRBUF_INIT, newref = STRBUF_INIT, logmsg = STRBUF_INIT;
|
struct strbuf oldref = STRBUF_INIT, newref = STRBUF_INIT, logmsg = STRBUF_INIT;
|
||||||
|
@ -553,6 +576,8 @@ static void rename_branch(const char *oldname, const char *newname, int force)
|
||||||
|
|
||||||
validate_new_branchname(newname, &newref, force, clobber_head_ok);
|
validate_new_branchname(newname, &newref, force, clobber_head_ok);
|
||||||
|
|
||||||
|
reject_rebase_or_bisect_branch(oldref.buf);
|
||||||
|
|
||||||
strbuf_addf(&logmsg, "Branch: renamed %s to %s",
|
strbuf_addf(&logmsg, "Branch: renamed %s to %s",
|
||||||
oldref.buf, newref.buf);
|
oldref.buf, newref.buf);
|
||||||
|
|
||||||
|
|
|
@ -254,6 +254,10 @@ test_expect_success 'not allow to delete a branch under rebase' '
|
||||||
)
|
)
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'rename a branch under rebase not allowed' '
|
||||||
|
test_must_fail git branch -M under-rebase rebase-with-new-name
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_success 'check out from current worktree branch ok' '
|
test_expect_success 'check out from current worktree branch ok' '
|
||||||
(
|
(
|
||||||
cd under-rebase &&
|
cd under-rebase &&
|
||||||
|
@ -276,4 +280,8 @@ test_expect_success 'checkout a branch under bisect' '
|
||||||
)
|
)
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'rename a branch under bisect not allowed' '
|
||||||
|
test_must_fail git branch -M under-bisect bisect-with-new-name
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
|
|
@ -216,8 +216,8 @@ const char *get_worktree_git_dir(const struct worktree *wt)
|
||||||
return git_common_path("worktrees/%s", wt->id);
|
return git_common_path("worktrees/%s", wt->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int is_worktree_being_rebased(const struct worktree *wt,
|
int is_worktree_being_rebased(const struct worktree *wt,
|
||||||
const char *target)
|
const char *target)
|
||||||
{
|
{
|
||||||
struct wt_status_state state;
|
struct wt_status_state state;
|
||||||
int found_rebase;
|
int found_rebase;
|
||||||
|
@ -234,8 +234,8 @@ static int is_worktree_being_rebased(const struct worktree *wt,
|
||||||
return found_rebase;
|
return found_rebase;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int is_worktree_being_bisected(const struct worktree *wt,
|
int is_worktree_being_bisected(const struct worktree *wt,
|
||||||
const char *target)
|
const char *target)
|
||||||
{
|
{
|
||||||
struct wt_status_state state;
|
struct wt_status_state state;
|
||||||
int found_rebase;
|
int found_rebase;
|
||||||
|
|
|
@ -42,6 +42,9 @@ extern void free_worktrees(struct worktree **);
|
||||||
extern const struct worktree *find_shared_symref(const char *symref,
|
extern const struct worktree *find_shared_symref(const char *symref,
|
||||||
const char *target);
|
const char *target);
|
||||||
|
|
||||||
|
int is_worktree_being_rebased(const struct worktree *wt, const char *target);
|
||||||
|
int is_worktree_being_bisected(const struct worktree *wt, const char *target);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Similar to git_path() but can produce paths for a specified
|
* Similar to git_path() but can produce paths for a specified
|
||||||
* worktree instead of current one
|
* worktree instead of current one
|
||||||
|
|
Загрузка…
Ссылка в новой задаче