git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] git-bisect.sh: don't accidentally override existing branch "bisect"
@ 2008-04-30 16:46 Gerrit Pape
  2008-04-30 21:30 ` Christian Couder
  2008-05-02  8:22 ` [PATCH] " Karl Hasselström
  0 siblings, 2 replies; 11+ messages in thread
From: Gerrit Pape @ 2008-04-30 16:46 UTC (permalink / raw)
  To: git, Junio C Hamano

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>
---
 Documentation/git-bisect.txt |    2 +-
 git-bisect.sh                |   20 ++++++++++++++------
 t/t6030-bisect-porcelain.sh  |   18 ++++++++++++++++++
 3 files changed, 33 insertions(+), 7 deletions(-)

diff --git a/Documentation/git-bisect.txt b/Documentation/git-bisect.txt
index 698ffde..1c7e38d 100644
--- a/Documentation/git-bisect.txt
+++ b/Documentation/git-bisect.txt
@@ -85,7 +85,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 d8d9bfd..48d81d5 100755
--- a/git-bisect.sh
+++ b/git-bisect.sh
@@ -69,14 +69,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 bisect > /dev/null ||
+		    git show-ref new-bisect > /dev/null; 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)
@@ -329,7 +334,10 @@ bisect_next() {
 
 	echo "Bisecting: $bisect_nr revisions left to test after this"
 	git branch -f new-bisect "$bisect_rev"
-	git checkout -q new-bisect || exit
+	git checkout -q new-bisect || {
+		git branch -d new-bisect
+		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 5e3e544..05f1e15 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
-- 
1.5.5.1

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH] git-bisect.sh: don't accidentally override existing branch "bisect"
  2008-04-30 16:46 [PATCH] git-bisect.sh: don't accidentally override existing branch "bisect" Gerrit Pape
@ 2008-04-30 21:30 ` Christian Couder
  2008-05-01 12:15   ` Richard Quirk
  2008-05-02  8:56   ` [PATCH amend] " Gerrit Pape
  2008-05-02  8:22 ` [PATCH] " Karl Hasselström
  1 sibling, 2 replies; 11+ messages in thread
From: Christian Couder @ 2008-04-30 21:30 UTC (permalink / raw)
  To: Gerrit Pape; +Cc: git, Junio C Hamano

Le mercredi 30 avril 2008, Gerrit Pape a écrit :
> 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>
> ---
>  Documentation/git-bisect.txt |    2 +-
>  git-bisect.sh                |   20 ++++++++++++++------
>  t/t6030-bisect-porcelain.sh  |   18 ++++++++++++++++++
>  3 files changed, 33 insertions(+), 7 deletions(-)
>
> diff --git a/Documentation/git-bisect.txt b/Documentation/git-bisect.txt
> index 698ffde..1c7e38d 100644
> --- a/Documentation/git-bisect.txt
> +++ b/Documentation/git-bisect.txt
> @@ -85,7 +85,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 d8d9bfd..48d81d5 100755
> --- a/git-bisect.sh
> +++ b/git-bisect.sh
> @@ -69,14 +69,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 bisect > /dev/null ||
> +		    git show-ref new-bisect > /dev/null; then
> +			die 'The branches "bisect" and "new-bisect" must not exist.'
> +		fi

Minor nitpick: you may use:

git show-ref -q {new-,}bisect

instead of:

git show-ref bisect > /dev/null ||
	git show-ref new-bisect > /dev/null

That would give something like:

	test -s "$GIT_DIR/BISECT_START" ||
		git show-ref -q {new-,}bisect &&
			die 'The branches "bisect" and "new-bisect" must not exist.'

>  	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)
> @@ -329,7 +334,10 @@ bisect_next() {
>
>  	echo "Bisecting: $bisect_nr revisions left to test after this"
>  	git branch -f new-bisect "$bisect_rev"
> -	git checkout -q new-bisect || exit
> +	git checkout -q new-bisect || {
> +		git branch -d new-bisect
> +		exit

Here we "exit 0" if "git branch -d new-bisect" succeeds.
That seems wrong.

> +	}
>  	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 5e3e544..05f1e15 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

Otherwise the patch looks good.

Thanks,
Christian.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] git-bisect.sh: don't accidentally override existing branch "bisect"
  2008-04-30 21:30 ` Christian Couder
@ 2008-05-01 12:15   ` Richard Quirk
  2008-05-01 12:27     ` Christian Couder
  2008-05-02  8:56   ` [PATCH amend] " Gerrit Pape
  1 sibling, 1 reply; 11+ messages in thread
From: Richard Quirk @ 2008-05-01 12:15 UTC (permalink / raw)
  To: Christian Couder; +Cc: Gerrit Pape, git, Junio C Hamano

On Wed, Apr 30, 2008 at 11:30 PM, Christian Couder
<chriscool@tuxfamily.org> wrote:

>  Minor nitpick: you may use:
>
>  git show-ref -q {new-,}bisect
>
>  instead of:
>
>
>  git show-ref bisect > /dev/null ||
>         git show-ref new-bisect > /dev/null

Careful with that - it's a bashism and would fail if /bin/sh is dash.
ie it would say that a branch called literally "{new-,}bisect" does
not exist, even if new-bisect and bisect do.

(this time reply-all instead of just to Christian!)

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] git-bisect.sh: don't accidentally override existing branch "bisect"
  2008-05-01 12:15   ` Richard Quirk
@ 2008-05-01 12:27     ` Christian Couder
  0 siblings, 0 replies; 11+ messages in thread
From: Christian Couder @ 2008-05-01 12:27 UTC (permalink / raw)
  To: Richard Quirk; +Cc: Gerrit Pape, git, Junio C Hamano

Le jeudi 1 mai 2008, Richard Quirk a écrit :
> On Wed, Apr 30, 2008 at 11:30 PM, Christian Couder
>
> <chriscool@tuxfamily.org> wrote:
> >  Minor nitpick: you may use:
> >
> >  git show-ref -q {new-,}bisect
> >
> >  instead of:
> >
> >
> >  git show-ref bisect > /dev/null ||
> >         git show-ref new-bisect > /dev/null
>
> Careful with that - it's a bashism and would fail if /bin/sh is dash.
> ie it would say that a branch called literally "{new-,}bisect" does
> not exist, even if new-bisect and bisect do.

You are right. Thanks.
So what about a plain:

git show-ref -q bisect new-bisect

Regards,
Christian.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] git-bisect.sh: don't accidentally override existing branch "bisect"
  2008-04-30 16:46 [PATCH] git-bisect.sh: don't accidentally override existing branch "bisect" Gerrit Pape
  2008-04-30 21:30 ` Christian Couder
@ 2008-05-02  8:22 ` Karl Hasselström
  2008-05-02 17:38   ` Junio C Hamano
  1 sibling, 1 reply; 11+ messages in thread
From: Karl Hasselström @ 2008-05-02  8:22 UTC (permalink / raw)
  To: Gerrit Pape; +Cc: git, Junio C Hamano

On 2008-04-30 16:46:13 +0000, Gerrit Pape wrote:

> 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".

Makes me wonder why bisect has to use a branch at all, and not just a
detached HEAD ... I seem to recall this having been discussed before,
but I can't find it now.

-- 
Karl Hasselström, kha@treskal.com
      www.treskal.com/kalle

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH amend] git-bisect.sh: don't accidentally override existing branch "bisect"
  2008-04-30 21:30 ` Christian Couder
  2008-05-01 12:15   ` Richard Quirk
@ 2008-05-02  8:56   ` Gerrit Pape
  2008-05-03  8:42     ` Christian Couder
  1 sibling, 1 reply; 11+ messages in thread
From: Gerrit Pape @ 2008-05-02  8:56 UTC (permalink / raw)
  To: Christian Couder; +Cc: git, Junio C Hamano

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

On Wed, Apr 30, 2008 at 11:30:18PM +0200, Christian Couder wrote:
> >     echo "Bisecting: $bisect_nr revisions left to test after this"
> >     git branch -f new-bisect "$bisect_rev"
> > -   git checkout -q new-bisect || exit
> > +   git checkout -q new-bisect || {
> > +           git branch -d new-bisect
> > +           exit
>
> Here we "exit 0" if "git branch -d new-bisect" succeeds.
> That seems wrong.

Thanks, I changed it to first delete the new-bisect branch, and then use
git checkout to create the branch and do the checkout.  So we have the
exit code from git branch if it fails.

On Thu, May 01, 2008 at 02:27:22PM +0200, Christian Couder wrote:
> Le jeudi 1 mai 2008, Richard Quirk a écrit :
> > Careful with that - it's a bashism and would fail if /bin/sh is
> > dash.
> > ie it would say that a branch called literally "{new-,}bisect" does
> > not exist, even if new-bisect and bisect do.
>
> You are right. Thanks.
> So what about a plain:
>
> git show-ref -q bisect new-bisect

I'm not sure we can rely on this, the exit code of that command if one
of the branches exists, but not the other, isn't documented.  The patch
now uses --verify -q on each branch, which is documented and should be
reliable.


 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 698ffde..1c7e38d 100644
--- a/Documentation/git-bisect.txt
+++ b/Documentation/git-bisect.txt
@@ -85,7 +85,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 d8d9bfd..f8c411a 100755
--- a/git-bisect.sh
+++ b/git-bisect.sh
@@ -69,14 +69,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)
@@ -328,8 +333,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
+	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 5e3e544..05f1e15 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
-- 
1.5.5.1

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH] git-bisect.sh: don't accidentally override existing branch "bisect"
  2008-05-02  8:22 ` [PATCH] " Karl Hasselström
@ 2008-05-02 17:38   ` Junio C Hamano
  2008-05-03 12:48     ` Johannes Schindelin
  0 siblings, 1 reply; 11+ messages in thread
From: Junio C Hamano @ 2008-05-02 17:38 UTC (permalink / raw)
  To: Karl Hasselström; +Cc: Gerrit Pape, git

Karl Hasselström <kha@treskal.com> writes:

> On 2008-04-30 16:46:13 +0000, Gerrit Pape wrote:
>
>> 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".
>
> Makes me wonder why bisect has to use a branch at all, and not just a
> detached HEAD ... I seem to recall this having been discussed before,
> but I can't find it now.

Only because the mechanism predates detached HEAD and no other reason.
Whoever wants to update it to use detached HEAD needs to design what
should happen when the bisection was started while the HEAD is detached
(should we come back to the same HEAD?  how? ...), but other than that I
do not offhand see fundamental difficulties.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH amend] git-bisect.sh: don't accidentally override existing branch "bisect"
  2008-05-02  8:56   ` [PATCH amend] " Gerrit Pape
@ 2008-05-03  8:42     ` Christian Couder
  2008-05-05  7:43       ` Gerrit Pape
  0 siblings, 1 reply; 11+ messages in thread
From: Christian Couder @ 2008-05-03  8:42 UTC (permalink / raw)
  To: Gerrit Pape; +Cc: git, Junio C Hamano

Le vendredi 2 mai 2008, Gerrit Pape a écrit :

[...]
> @@ -328,8 +333,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

Doesn't this output an error if the branch "new-bisect" does not exists ?

$ git branch -D new-bisect
error: branch 'new-bisect' not found.

> +	git checkout -q -b new-bisect "$bisect_rev" || exit
>  	git branch -M new-bisect bisect
>  	git show-branch "$bisect_rev"
>  }

Thanks,
Christian.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] git-bisect.sh: don't accidentally override existing branch "bisect"
  2008-05-02 17:38   ` Junio C Hamano
@ 2008-05-03 12:48     ` Johannes Schindelin
  0 siblings, 0 replies; 11+ messages in thread
From: Johannes Schindelin @ 2008-05-03 12:48 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Karl Hasselström, Gerrit Pape, git

[-- Attachment #1: Type: TEXT/PLAIN, Size: 1362 bytes --]

Hi,

On Fri, 2 May 2008, Junio C Hamano wrote:

> Karl Hasselström <kha@treskal.com> writes:
> 
> > On 2008-04-30 16:46:13 +0000, Gerrit Pape wrote:
> >
> >> 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".
> >
> > Makes me wonder why bisect has to use a branch at all, and not just a 
> > detached HEAD ... I seem to recall this having been discussed before, 
> > but I can't find it now.
> 
> Only because the mechanism predates detached HEAD and no other reason. 
> Whoever wants to update it to use detached HEAD needs to design what 
> should happen when the bisection was started while the HEAD is detached 
> (should we come back to the same HEAD?  how? ...), but other than that I 
> do not offhand see fundamental difficulties.

IMO it should behave as the rebase machinery does: record $(git rev-parse 
HEAD) in the case of a detached HEAD, and go back to that.  It is dead 
easy.

Ciao,
Dscho

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH amend] git-bisect.sh: don't accidentally override existing branch "bisect"
  2008-05-03  8:42     ` Christian Couder
@ 2008-05-05  7:43       ` Gerrit Pape
  2008-05-06  6:20         ` Christian Couder
  0 siblings, 1 reply; 11+ messages in thread
From: Gerrit Pape @ 2008-05-05  7:43 UTC (permalink / raw)
  To: Christian Couder; +Cc: git, Junio C Hamano

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

On Sat, May 03, 2008 at 10:42:31AM +0200, Christian Couder wrote:
> Le vendredi 2 mai 2008, Gerrit Pape a ?crit :
> > -   git branch -f new-bisect "$bisect_rev"
> > -   git checkout -q new-bisect || exit
> > +   git branch -D new-bisect
> 
> Doesn't this output an error if the branch "new-bisect" does not
> exists ?

It does, thanks.  Another amend, direct stderr to /dev/null.


 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 698ffde..1c7e38d 100644
--- a/Documentation/git-bisect.txt
+++ b/Documentation/git-bisect.txt
@@ -85,7 +85,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 d8d9bfd..b5171c9 100755
--- a/git-bisect.sh
+++ b/git-bisect.sh
@@ -69,14 +69,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)
@@ -328,8 +333,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 5e3e544..05f1e15 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
-- 
1.5.5.1

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH amend] git-bisect.sh: don't accidentally override existing branch "bisect"
  2008-05-05  7:43       ` Gerrit Pape
@ 2008-05-06  6:20         ` Christian Couder
  0 siblings, 0 replies; 11+ messages in thread
From: Christian Couder @ 2008-05-06  6:20 UTC (permalink / raw)
  To: Gerrit Pape; +Cc: git, Junio C Hamano

Le lundi 5 mai 2008, Gerrit Pape a écrit :
> 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>

Tested-by: Christian Couder <chriscool@tuxfamily.org>

This one looks good to me.

Thanks,
Christian.

> ---
>
> On Sat, May 03, 2008 at 10:42:31AM +0200, Christian Couder wrote:
> > Le vendredi 2 mai 2008, Gerrit Pape a ?crit :
> > > -   git branch -f new-bisect "$bisect_rev"
> > > -   git checkout -q new-bisect || exit
> > > +   git branch -D new-bisect
> >
> > Doesn't this output an error if the branch "new-bisect" does not
> > exists ?
>
> It does, thanks.  Another amend, direct stderr to /dev/null.
>
>
>  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 698ffde..1c7e38d 100644
> --- a/Documentation/git-bisect.txt
> +++ b/Documentation/git-bisect.txt
> @@ -85,7 +85,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 d8d9bfd..b5171c9 100755
> --- a/git-bisect.sh
> +++ b/git-bisect.sh
> @@ -69,14 +69,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)
> @@ -328,8 +333,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 5e3e544..05f1e15 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

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2008-05-06  6:17 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-04-30 16:46 [PATCH] git-bisect.sh: don't accidentally override existing branch "bisect" Gerrit Pape
2008-04-30 21:30 ` Christian Couder
2008-05-01 12:15   ` Richard Quirk
2008-05-01 12:27     ` Christian Couder
2008-05-02  8:56   ` [PATCH amend] " Gerrit Pape
2008-05-03  8:42     ` Christian Couder
2008-05-05  7:43       ` Gerrit Pape
2008-05-06  6:20         ` Christian Couder
2008-05-02  8:22 ` [PATCH] " Karl Hasselström
2008-05-02 17:38   ` Junio C Hamano
2008-05-03 12:48     ` Johannes Schindelin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).