All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] bisect: make "start", "good" and "skip" succeed or fail atomically
@ 2008-04-14  3:41 Christian Couder
  0 siblings, 0 replies; only message in thread
From: Christian Couder @ 2008-04-14  3:41 UTC (permalink / raw
  To: Junio Hamano, Ingo Molnar; +Cc: git

Before this patch, when "git bisect start", "git bisect good" or
"git bisect skip" were called with many revisions, they could fail
after having already marked some revisions as "good", "bad" or
"skip".

This could be especilally bad for "git bisect start" because as
the file ".git/BISECT_NAMES" would not have been written, there
would have been no attempt to clear the marked revisions on a
"git bisect reset". That's because if there is no
".git/BISECT_NAMES" file, nothing is done to clean things up, as
the bisect session is not supposed to have started.

While at it, let's also create the ".git/BISECT_START" file, only
after ".git/BISECT_NAMES" as been created.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
 git-bisect.sh               |   14 ++++++++++----
 t/t6030-bisect-porcelain.sh |    7 ++++++-
 2 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/git-bisect.sh b/git-bisect.sh
index 408775a..6b43461 100755
--- a/git-bisect.sh
+++ b/git-bisect.sh
@@ -69,6 +69,7 @@ bisect_start() {
 	head=$(GIT_DIR="$GIT_DIR" git symbolic-ref HEAD) ||
 	head=$(GIT_DIR="$GIT_DIR" git rev-parse --verify HEAD) ||
 	die "Bad HEAD - I need a HEAD"
+	start_head=''
 	case "$head" in
 	refs/heads/bisect)
 		if [ -s "$GIT_DIR/BISECT_START" ]; then
@@ -82,7 +83,7 @@ bisect_start() {
 		# This error message should only be triggered by cogito usage,
 		# and cogito users should understand it relates to cg-seek.
 		[ -s "$GIT_DIR/head-name" ] && die "won't bisect on seeked tree"
-		echo "${head#refs/heads/}" >"$GIT_DIR/BISECT_START"
+		start_head="${head#refs/heads/}"
 		;;
 	*)
 		die "Bad HEAD - strange symbolic ref"
@@ -103,6 +104,7 @@ bisect_start() {
 	done
 	orig_args=$(sq "$@")
 	bad_seen=0
+	eval=''
 	while [ $# -gt 0 ]; do
 	    arg="$1"
 	    case "$arg" in
@@ -120,13 +122,15 @@ bisect_start() {
 		0) state='bad' ; bad_seen=1 ;;
 		*) state='good' ;;
 		esac
-		bisect_write "$state" "$rev" 'nolog'
+		eval="$eval bisect_write '$state' '$rev' 'nolog'; "
 		shift
 		;;
 	    esac
 	done
 
 	sq "$@" >"$GIT_DIR/BISECT_NAMES"
+	test -n "$start_head" && echo "$start_head" >"$GIT_DIR/BISECT_START"
+	eval "$eval"
 	echo "git-bisect start$orig_args" >>"$GIT_DIR/BISECT_LOG"
 	bisect_auto_next
 }
@@ -157,12 +161,14 @@ bisect_state() {
 		bisect_write "$state" "$rev" ;;
 	2,bad|*,good|*,skip)
 		shift
+		eval=''
 		for rev in "$@"
 		do
 			sha=$(git rev-parse --verify "$rev^{commit}") ||
 				die "Bad rev input: $rev"
-			bisect_write "$state" "$sha"
-		done ;;
+			eval="$eval bisect_write '$state' '$sha'; "
+		done
+		eval "$eval" ;;
 	*,bad)
 		die "'git bisect bad' can take only one argument." ;;
 	*)
diff --git a/t/t6030-bisect-porcelain.sh b/t/t6030-bisect-porcelain.sh
index 32d6118..5e3e544 100755
--- a/t/t6030-bisect-porcelain.sh
+++ b/t/t6030-bisect-porcelain.sh
@@ -71,8 +71,12 @@ test_expect_success 'bisect start with one bad and good' '
 	git bisect next
 '
 
-test_expect_success 'bisect good and bad fails if not given only revs' '
+test_expect_success 'bisect fails if given any junk instead of revs' '
 	git bisect reset &&
+	test_must_fail git bisect start foo $HASH1 -- &&
+	test_must_fail git bisect start $HASH4 $HASH1 bar -- &&
+	test -z "$(git for-each-ref "refs/bisect/*")" &&
+	test_must_fail ls .git/BISECT_* &&
 	git bisect start &&
 	test_must_fail git bisect good foo $HASH1 &&
 	test_must_fail git bisect good $HASH1 bar &&
@@ -80,6 +84,7 @@ test_expect_success 'bisect good and bad fails if not given only revs' '
 	test_must_fail git bisect bad $HASH3 $HASH4 &&
 	test_must_fail git bisect skip bar $HASH3 &&
 	test_must_fail git bisect skip $HASH1 foo &&
+	test -z "$(git for-each-ref "refs/bisect/*")" &&
 	git bisect good $HASH1 &&
 	git bisect bad $HASH4
 '
-- 
1.5.5.50.ge6e82.dirty

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2008-04-14  3:37 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-04-14  3:41 [PATCH 1/2] bisect: make "start", "good" and "skip" succeed or fail atomically Christian Couder

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.