diff options
author | Nguyễn Thái Ngọc Duy <pclouds@gmail.com> | 2016-04-22 20:01:36 +0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2016-04-22 14:09:39 -0700 |
commit | 14ace5b77b493506a1f8ffde96a2f49cc7bc4db0 (patch) | |
tree | 50c5dee66f1f65027675b1d2e187fc418f2831e6 | |
parent | worktree.c: check whether branch is bisected in another worktree (diff) | |
download | tgif-14ace5b77b493506a1f8ffde96a2f49cc7bc4db0.tar.xz |
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>
-rw-r--r-- | builtin/branch.c | 25 | ||||
-rwxr-xr-x | t/t2025-worktree-add.sh | 8 | ||||
-rw-r--r-- | worktree.c | 8 | ||||
-rw-r--r-- | worktree.h | 3 |
4 files changed, 40 insertions, 4 deletions
diff --git a/builtin/branch.c b/builtin/branch.c index bcde87d8e7..b488c3fb3c 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -524,6 +524,29 @@ static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sortin 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) { 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); + reject_rebase_or_bisect_branch(oldref.buf); + strbuf_addf(&logmsg, "Branch: renamed %s to %s", oldref.buf, newref.buf); diff --git a/t/t2025-worktree-add.sh b/t/t2025-worktree-add.sh index 8f53944cb2..3a22fc55fc 100755 --- a/t/t2025-worktree-add.sh +++ b/t/t2025-worktree-add.sh @@ -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' ' ( 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 diff --git a/worktree.c b/worktree.c index aab4b9552e..4817d60055 100644 --- a/worktree.c +++ b/worktree.c @@ -216,8 +216,8 @@ const char *get_worktree_git_dir(const struct worktree *wt) return git_common_path("worktrees/%s", wt->id); } -static int is_worktree_being_rebased(const struct worktree *wt, - const char *target) +int is_worktree_being_rebased(const struct worktree *wt, + const char *target) { struct wt_status_state state; int found_rebase; @@ -234,8 +234,8 @@ static int is_worktree_being_rebased(const struct worktree *wt, return found_rebase; } -static int is_worktree_being_bisected(const struct worktree *wt, - const char *target) +int is_worktree_being_bisected(const struct worktree *wt, + const char *target) { struct wt_status_state state; int found_rebase; diff --git a/worktree.h b/worktree.h index 0da8c1f2bd..13949093cc 100644 --- a/worktree.h +++ b/worktree.h @@ -42,6 +42,9 @@ extern void free_worktrees(struct worktree **); extern const struct worktree *find_shared_symref(const char *symref, 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 * worktree instead of current one |