git-bisect.sh: don't accidentally override existing branch "bisect"

If a branch named "bisect" or "new-bisect" already was created in the
repo by other means than git bisect, doing a git bisect used to override
the branch without a warning.  Now if the branch "bisect" or
"new-bisect" already exists, and it was not created by git bisect itself,
git bisect start fails with an appropriate error message.  Additionally,
if checking out a new bisect state fails due to a merge problem, git
bisect cleans up the temporary branch "new-bisect".

The accidental override has been noticed by Andres Salomon, reported
through
 http://bugs.debian.org/478647

Signed-off-by: Gerrit Pape <pape@smarden.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Gerrit Pape 2008-05-05 07:43:00 +00:00 committed by Junio C Hamano
parent 6233a5210e
commit ee831f7ddf
3 changed files with 31 additions and 8 deletions

View file

@ -78,7 +78,7 @@ Oh, and then after you want to reset to the original head, do a
$ git bisect reset
------------------------------------------------
to get back to the master branch, instead of being in one of the
to get back to the original branch, instead of being in one of the
bisection branches ("git bisect start" will do that for you too,
actually: it will reset the bisection state, and before it does that
it checks that you're not using some old bisection branch).

View file

@ -65,14 +65,19 @@ bisect_start() {
head=$(GIT_DIR="$GIT_DIR" git symbolic-ref -q HEAD) ||
head=$(GIT_DIR="$GIT_DIR" git rev-parse --verify HEAD) ||
die "Bad HEAD - I need a HEAD"
#
# Check that we either already have BISECT_START, or that the
# branches bisect, new-bisect don't exist, to not override them.
#
test -s "$GIT_DIR/BISECT_START" ||
if git show-ref --verify -q refs/heads/bisect ||
git show-ref --verify -q refs/heads/new-bisect; then
die 'The branches "bisect" and "new-bisect" must not exist.'
fi
start_head=''
case "$head" in
refs/heads/bisect)
if [ -s "$GIT_DIR/BISECT_START" ]; then
branch=`cat "$GIT_DIR/BISECT_START"`
else
branch=master
fi
branch=`cat "$GIT_DIR/BISECT_START"`
git checkout $branch || exit
;;
refs/heads/*|$_x40)
@ -324,8 +329,8 @@ bisect_next() {
exit_if_skipped_commits "$bisect_rev"
echo "Bisecting: $bisect_nr revisions left to test after this"
git branch -f new-bisect "$bisect_rev"
git checkout -q new-bisect || exit
git branch -D new-bisect 2> /dev/null
git checkout -q -b new-bisect "$bisect_rev" || exit
git branch -M new-bisect bisect
git show-branch "$bisect_rev"
}

View file

@ -284,6 +284,24 @@ test_expect_success 'bisect starting with a detached HEAD' '
'
test_expect_success 'bisect refuses to start if branch bisect exists' '
git bisect reset &&
git branch bisect &&
test_must_fail git bisect start &&
git branch -d bisect &&
git checkout -b bisect &&
test_must_fail git bisect start &&
git checkout master &&
git branch -d bisect
'
test_expect_success 'bisect refuses to start if branch new-bisect exists' '
git bisect reset &&
git branch new-bisect &&
test_must_fail git bisect start &&
git branch -d new-bisect
'
#
#
test_done