From ee831f7ddfc40e9144208c93e24d20ff0ad69194 Mon Sep 17 00:00:00 2001 From: Gerrit Pape Date: Mon, 5 May 2008 07:43:00 +0000 Subject: 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 Signed-off-by: Junio C Hamano --- Documentation/git-bisect.txt | 2 +- git-bisect.sh | 19 ++++++++++++------- t/t6030-bisect-porcelain.sh | 18 ++++++++++++++++++ 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/Documentation/git-bisect.txt b/Documentation/git-bisect.txt index 96585ae8d9..0855b98b28 100644 --- a/Documentation/git-bisect.txt +++ b/Documentation/git-bisect.txt @@ -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). diff --git a/git-bisect.sh b/git-bisect.sh index 8e57e9a75d..54bfd71dad 100755 --- a/git-bisect.sh +++ b/git-bisect.sh @@ -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" } diff --git a/t/t6030-bisect-porcelain.sh b/t/t6030-bisect-porcelain.sh index 5e3e5445c7..05f1e15c34 100755 --- a/t/t6030-bisect-porcelain.sh +++ b/t/t6030-bisect-porcelain.sh @@ -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 -- cgit v1.2.3 From 42ba5ee776c00369ca72b76537ae622611a7b545 Mon Sep 17 00:00:00 2001 From: Christian Couder Date: Wed, 7 May 2008 23:54:28 +0200 Subject: bisect: print an error message when "git rev-list --bisect-vars" fails Before this patch no error was printed when "git rev-list --bisect-vars" failed. This can happen when bad and good revs are mistaken. This patch prints an error message on stderr that describe the likely failure cause. Signed-off-by: Christian Couder Signed-off-by: Junio C Hamano --- git-bisect.sh | 19 +++++++++++++++++-- t/t6030-bisect-porcelain.sh | 7 +++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/git-bisect.sh b/git-bisect.sh index 54bfd71dad..b1800edaf7 100755 --- a/git-bisect.sh +++ b/git-bisect.sh @@ -220,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. diff --git a/t/t6030-bisect-porcelain.sh b/t/t6030-bisect-porcelain.sh index 05f1e15c34..933f567983 100755 --- a/t/t6030-bisect-porcelain.sh +++ b/t/t6030-bisect-porcelain.sh @@ -302,6 +302,13 @@ test_expect_success 'bisect refuses to start if branch new-bisect exists' ' 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 -- cgit v1.2.3