git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jon Seymour <jon.seymour@gmail.com>
To: git@vger.kernel.org
Cc: chriscool@tuxfamily.org, gitster@pobox.com, j6t@kdbg.org,
	jnareb@gmail.com, Jon Seymour <jon.seymour@gmail.com>
Subject: [PATCH v8 4/7] bisect: introduce --no-checkout, --update-ref=<ref> support into porcelain.
Date: Sun, 31 Jul 2011 21:55:18 +1000	[thread overview]
Message-ID: <1312113321-28760-5-git-send-email-jon.seymour@gmail.com> (raw)
In-Reply-To: <1312113321-28760-1-git-send-email-jon.seymour@gmail.com>

git-bisect can now perform bisection of a history without performing
a checkout at each stage of the bisection process.

Instead, the reference specified by <ref> is updated. If <ref> is not
specified, HEAD is used instead.

One use-case for this function is allow git bisect to be used with
damaged repositories where git checkout would fail because the tree
referenced by the commit is damaged.

It can also be used in other cases where actual checkout of the tree
is not required to progress the bisection.

Improved-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Jon Seymour <jon.seymour@gmail.com>
---
 git-bisect.sh |   40 ++++++++++++++++++++++++++++++----------
 1 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/git-bisect.sh b/git-bisect.sh
index 20f6dd5..24ac859 100755
--- a/git-bisect.sh
+++ b/git-bisect.sh
@@ -3,7 +3,7 @@
 USAGE='[help|start|bad|good|skip|next|reset|visualize|replay|log|run]'
 LONG_USAGE='git bisect help
         print this long help message.
-git bisect start [<bad> [<good>...]] [--] [<pathspec>...]
+git bisect start [--no-checkout|--update-ref=<ref>] [<bad> [<good>...]] [--] [<pathspec>...]
         reset bisect state and start bisection.
 git bisect bad [<rev>]
         mark <rev> a known-bad revision.
@@ -34,6 +34,8 @@ require_work_tree
 _x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
 _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
 
+BISECT_UPDATE_REF=$(test -f "$GIT_DIR/BISECT_UPDATE_REF" && cat "$GIT_DIR/BISECT_UPDATE_REF")
+
 bisect_autostart() {
 	test -s "$GIT_DIR/BISECT_START" || {
 		(
@@ -69,13 +71,18 @@ bisect_start() {
 	orig_args=$(git rev-parse --sq-quote "$@")
 	bad_seen=0
 	eval=''
+	BISECT_UPDATE_REF=
 	while [ $# -gt 0 ]; do
 	    arg="$1"
 	    case "$arg" in
 	    --)
-		shift
-		break
-		;;
+		shift; break ;;
+	    --no-checkout)
+		BISECT_UPDATE_REF=HEAD; shift ;;
+	    --update-ref=*)
+		BISECT_UPDATE_REF=${arg#--update-ref=}; shift ;;
+	    --*)
+		die "$(eval_gettext "unrecognised option: '\$arg'")" ;;
 	    *)
 		rev=$(git rev-parse -q --verify "$arg^{commit}") || {
 		    test $has_double_dash -eq 1 &&
@@ -92,6 +99,10 @@ bisect_start() {
 	    esac
 	done
 
+	if test -n "$BISECT_UPDATE_REF"; then
+	    eval="$eval echo '$BISECT_UPDATE_REF' > '$GIT_DIR/BISECT_UPDATE_REF';"
+	fi
+
 	#
 	# Verify HEAD.
 	#
@@ -107,7 +118,11 @@ bisect_start() {
 	then
 		# Reset to the rev from where we started.
 		start_head=$(cat "$GIT_DIR/BISECT_START")
-		git checkout "$start_head" -- || exit
+		if test -z "$BISECT_UPDATE_REF"; then
+		    git checkout "$start_head" --
+		else
+		    git update-ref --no-deref "$BISECT_UPDATE_REF" "$start_head"
+		fi
 	else
 		# Get rev from where we start.
 		case "$head" in
@@ -291,7 +306,7 @@ bisect_next() {
 	bisect_next_check good
 
 	# Perform all bisection computation, display and checkout
-	git bisect--helper --next-all
+	git bisect--helper --next-all ${BISECT_UPDATE_REF:+--update-ref=}$BISECT_UPDATE_REF
 	res=$?
 
         # Check if we should exit because bisection is finished
@@ -340,11 +355,15 @@ bisect_reset() {
 	*)
 	    usage ;;
 	esac
-	if git checkout "$branch" -- ; then
-		bisect_clean_state
-	else
-		die "$(eval_gettext "Could not check out original HEAD '\$branch'.
+	if test -z "$BISECT_UPDATE_REF"; then
+		if git checkout "$branch" --; then
+			bisect_clean_state
+		else
+			die "$(eval_gettext "Could not check out original HEAD '\$branch'.
 Try 'git bisect reset <commit>'.")"
+		fi
+	else
+	    git symbolic-ref "$BISECT_UPDATE_REF" $(git rev-parse --symbolic-full-name "${branch}")
 	fi
 }
 
@@ -360,6 +379,7 @@ bisect_clean_state() {
 	rm -f "$GIT_DIR/BISECT_LOG" &&
 	rm -f "$GIT_DIR/BISECT_NAMES" &&
 	rm -f "$GIT_DIR/BISECT_RUN" &&
+	rm -f "$GIT_DIR/BISECT_UPDATE_REF" &&
 	# Cleanup head-name if it got left by an old version of git-bisect
 	rm -f "$GIT_DIR/head-name" &&
 
-- 
1.7.6.391.g168d0.dirty

  parent reply	other threads:[~2011-07-31 11:56 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-07-31 11:55 [PATCH v8 0/7] bisect: Add support for --no-checkout and --update-ref=<ref> options Jon Seymour
2011-07-31 11:55 ` [PATCH v8 1/7] bisect: move argument parsing before state modification Jon Seymour
2011-07-31 11:55 ` [PATCH v8 2/7] bisect: add tests to document expected behaviour in presence of broken trees Jon Seymour
2011-07-31 11:55 ` [PATCH v8 3/7] bisect: introduce support for --update-ref=<ref> option Jon Seymour
2011-07-31 11:55 ` Jon Seymour [this message]
2011-07-31 18:35   ` [PATCH v8 4/7] bisect: introduce --no-checkout, --update-ref=<ref> support into porcelain Christian Couder
2011-07-31 19:48     ` Jon Seymour
2011-07-31 20:05       ` Christian Couder
2011-07-31 19:21   ` Christian Couder
2011-07-31 19:40     ` Jon Seymour
2011-07-31 20:07       ` Christian Couder
2011-07-31 20:51         ` Christian Couder
2011-07-31 21:11         ` Jon Seymour
2011-07-31 11:55 ` [PATCH v8 5/7] bisect: add tests for the --no-checkout and --update-ref options Jon Seymour
2011-07-31 11:55 ` [PATCH v8 6/7] bisect: add documentation for --no-checkout and --update-ref=<ref> options Jon Seymour
2011-07-31 11:55 ` [PATCH v8 7/7] bisect: support --update-ref <ref> Jon Seymour
2011-07-31 13:26 ` [PATCH v8 0/7] bisect: Add support for --no-checkout and --update-ref=<ref> options Jon Seymour

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1312113321-28760-5-git-send-email-jon.seymour@gmail.com \
    --to=jon.seymour@gmail.com \
    --cc=chriscool@tuxfamily.org \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=j6t@kdbg.org \
    --cc=jnareb@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).