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 коммит произвёл Junio C Hamano
Родитель 6233a5210e
Коммит ee831f7ddf
3 изменённых файлов: 31 добавлений и 8 удалений

Просмотреть файл

@ -78,7 +78,7 @@ Oh, and then after you want to reset to the original head, do a
$ git bisect reset $ 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, bisection branches ("git bisect start" will do that for you too,
actually: it will reset the bisection state, and before it does that actually: it will reset the bisection state, and before it does that
it checks that you're not using some old bisection branch). it checks that you're not using some old bisection branch).

Просмотреть файл

@ -65,14 +65,19 @@ bisect_start() {
head=$(GIT_DIR="$GIT_DIR" git symbolic-ref -q HEAD) || head=$(GIT_DIR="$GIT_DIR" git symbolic-ref -q HEAD) ||
head=$(GIT_DIR="$GIT_DIR" git rev-parse --verify HEAD) || head=$(GIT_DIR="$GIT_DIR" git rev-parse --verify HEAD) ||
die "Bad HEAD - I need a 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='' start_head=''
case "$head" in case "$head" in
refs/heads/bisect) refs/heads/bisect)
if [ -s "$GIT_DIR/BISECT_START" ]; then branch=`cat "$GIT_DIR/BISECT_START"`
branch=`cat "$GIT_DIR/BISECT_START"`
else
branch=master
fi
git checkout $branch || exit git checkout $branch || exit
;; ;;
refs/heads/*|$_x40) refs/heads/*|$_x40)
@ -324,8 +329,8 @@ bisect_next() {
exit_if_skipped_commits "$bisect_rev" exit_if_skipped_commits "$bisect_rev"
echo "Bisecting: $bisect_nr revisions left to test after this" echo "Bisecting: $bisect_nr revisions left to test after this"
git branch -f new-bisect "$bisect_rev" git branch -D new-bisect 2> /dev/null
git checkout -q new-bisect || exit git checkout -q -b new-bisect "$bisect_rev" || exit
git branch -M new-bisect bisect git branch -M new-bisect bisect
git show-branch "$bisect_rev" git show-branch "$bisect_rev"
} }

Просмотреть файл

@ -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 test_done