From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jon Seymour Subject: [PATCH v13 5/8] bisect: introduce --no-checkout support into porcelain. Date: Tue, 2 Aug 2011 21:29:02 +1000 Message-ID: <1312284545-2426-6-git-send-email-jon.seymour@gmail.com> References: <1312284545-2426-1-git-send-email-jon.seymour@gmail.com> Cc: chriscool@tuxfamily.org, gitster@pobox.com, j6t@kdbg.org, jnareb@gmail.com, Jon Seymour To: git@vger.kernel.org X-From: git-owner@vger.kernel.org Tue Aug 02 13:30:33 2011 Return-path: Envelope-to: gcvg-git-2@lo.gmane.org Received: from vger.kernel.org ([209.132.180.67]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1QoDBA-0004bt-2g for gcvg-git-2@lo.gmane.org; Tue, 02 Aug 2011 13:30:32 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754010Ab1HBLaR (ORCPT ); Tue, 2 Aug 2011 07:30:17 -0400 Received: from mail-yi0-f46.google.com ([209.85.218.46]:34372 "EHLO mail-yi0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754002Ab1HBLaP (ORCPT ); Tue, 2 Aug 2011 07:30:15 -0400 Received: by yia27 with SMTP id 27so3993103yia.19 for ; Tue, 02 Aug 2011 04:30:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; bh=AyiYujq/c2bp3KMEaFHd46MIE+7TgsxG3KJl+FzuF7s=; b=nn4XO4vtH4TRlXdCoxFrBY80ohXHctizgVBCIvM6VotubX8/irXJRWSgfd961sffYp SDuUt4y0M5LnQ9W3I8EsOu3XShld8NBQXmW+/M0fwUjOpwDaqMF71wQ0xo9aVzS1rTHj 4hIpYmXr5VL+UXmlE2w4Hrf1qt6N3arnogqrs= Received: by 10.142.149.18 with SMTP id w18mr3833961wfd.162.1312284614084; Tue, 02 Aug 2011 04:30:14 -0700 (PDT) Received: from localhost.localdomain ([120.16.93.94]) by mx.google.com with ESMTPS id t20sm3715018wfe.12.2011.08.02.04.30.09 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 02 Aug 2011 04:30:13 -0700 (PDT) X-Mailer: git-send-email 1.7.6.353.g3461 In-Reply-To: <1312284545-2426-1-git-send-email-jon.seymour@gmail.com> Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Archived-At: git-bisect can now perform bisection of a history without performing a checkout at each stage of the bisection process. Instead, HEAD is updated. 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 Signed-off-by: Jon Seymour --- git-bisect.sh | 32 +++++++++++++++++++++++++------- 1 files changed, 25 insertions(+), 7 deletions(-) diff --git a/git-bisect.sh b/git-bisect.sh index a44ffe1..5f3c2c4 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 [ [...]] [--] [...] +git bisect start [--no-checkout] [ [...]] [--] [...] reset bisect state and start bisection. git bisect bad [] mark 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_MODE=$(test -f "$GIT_DIR/BISECT_MODE" && cat "$GIT_DIR/BISECT_MODE") + bisect_autostart() { test -s "$GIT_DIR/BISECT_START" || { ( @@ -69,6 +71,7 @@ bisect_start() { orig_args=$(git rev-parse --sq-quote "$@") bad_seen=0 eval='' + BISECT_MODE=checkout while [ $# -gt 0 ]; do arg="$1" case "$arg" in @@ -76,6 +79,11 @@ bisect_start() { shift break ;; + --no-checkout) + BISECT_MODE=update-ref; + shift ;; + --*) + die "$(eval_gettext "unrecognised option: '\$arg'")" ;; *) rev=$(git rev-parse -q --verify "$arg^{commit}") || { test $has_double_dash -eq 1 && @@ -107,7 +115,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 "$BISECT_MODE" = "update-ref"; then + git update-ref --no-deref HEAD "$start_head" + else + git checkout "$start_head" -- + fi else # Get rev from where we start. case "$head" in @@ -144,7 +156,8 @@ bisect_start() { # Write new start state. # echo "$start_head" >"$GIT_DIR/BISECT_START" && - git rev-parse --sq-quote "$@" >"$GIT_DIR/BISECT_NAMES" && + git rev-parse --sq-quote "$@" >"$GIT_DIR/BISECT_NAMES" + echo "$BISECT_MODE" > "$GIT_DIR/BISECT_MODE" && eval "$eval true" && echo "git bisect start$orig_args" >>"$GIT_DIR/BISECT_LOG" || exit # @@ -291,7 +304,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_MODE:+--bisect-mode=}${BISECT_MODE} res=$? # Check if we should exit because bisection is finished @@ -340,11 +353,15 @@ bisect_reset() { *) usage ;; esac - if git checkout "$branch" -- ; then - bisect_clean_state + if test "$BISECT_MODE" = "update-ref"; then + git symbolic-ref HEAD $(git rev-parse --symbolic-full-name "${branch}") else - die "$(eval_gettext "Could not check out original HEAD '\$branch'. + if git checkout "$branch" --; then + bisect_clean_state + else + die "$(eval_gettext "Could not check out original HEAD '\$branch'. Try 'git bisect reset '.")" + fi fi } @@ -360,6 +377,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_MODE" && # Cleanup head-name if it got left by an old version of git-bisect rm -f "$GIT_DIR/head-name" && -- 1.7.6.353.g3461