Skip to content

Commit

Permalink
Merge branch 'gp/bisect-fix' into maint
Browse files Browse the repository at this point in the history
* gp/bisect-fix:
  bisect: print an error message when "git rev-list --bisect-vars" fails
  git-bisect.sh: don't accidentally override existing branch "bisect"
  • Loading branch information
Junio C Hamano committed May 27, 2008
2 parents df2740b + 42ba5ee commit 109440c
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 10 deletions.
2 changes: 1 addition & 1 deletion Documentation/git-bisect.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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).
Expand Down
38 changes: 29 additions & 9 deletions git-bisect.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -215,18 +220,33 @@ bisect_auto_next() {
bisect_next_check && bisect_next || :
}

eval_rev_list() {
_eval="$1"

eval $_eval
res=$?

if [ $res -ne 0 ]; then
echo >&2 "'git rev-list --bisect-vars' failed:"
echo >&2 "maybe you mistake good and bad revs?"
exit $res
fi

return $res
}

filter_skipped() {
_eval="$1"
_skip="$2"

if [ -z "$_skip" ]; then
eval $_eval
eval_rev_list "$_eval"
return
fi

# Let's parse the output of:
# "git rev-list --bisect-vars --bisect-all ..."
eval $_eval | while read hash line
eval_rev_list "$_eval" | while read hash line
do
case "$VARS,$FOUND,$TRIED,$hash" in
# We display some vars.
Expand Down Expand Up @@ -324,8 +344,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"
}
Expand Down
25 changes: 25 additions & 0 deletions t/t6030-bisect-porcelain.sh
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,31 @@ 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_expect_success 'bisect errors out if bad and good are mistaken' '
git bisect reset &&
test_must_fail git bisect start $HASH2 $HASH4 2> rev_list_error &&
grep "mistake good and bad" rev_list_error &&
git bisect reset
'

#
#
test_done

0 comments on commit 109440c

Please sign in to comment.