All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Harald Nordgren via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Johannes Sixt <j6t@kdbg.org>, Harald Nordgren <haraldnordgren@gmail.com>
Subject: [PATCH v4 0/2] bisect: add --reset-when-found to leave when done
Date: Sat, 01 Aug 2026 09:44:03 +0000	[thread overview]
Message-ID: <pull.2335.v4.git.git.1785577445.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.2335.v3.git.git.1784538619.gitgitgadget@gmail.com>

Add a --reset-when-found option to git bisect that resets the bisect session
when culprit is found.

Changes in v4:

 * Simplify translation calls.
 * Avoid git subshell calls in tests, that can bury errors.

Changes in v3:

 * Rename --auto-reset to --reset-when-found, including internal names.
 * Defer git bisect run cleanup until captured output is printed and
   BISECT_RUN is closed. Drop the open-descriptor preparatory change,
   retaining the existing filename-based output handling.

Changes in v2:

 * Add option --auto-reset[=<where>] with option to go to final commit as
   well as original.
 * Refactored tests.

Harald Nordgren (2):
  bisect: let bisect_reset() optionally check out quietly
  bisect: add --reset-when-found to leave when done

 Documentation/git-bisect.adoc |  14 +++-
 bisect.c                      |   2 +
 builtin/bisect.c              | 148 +++++++++++++++++++++++++++++-----
 t/t6030-bisect-porcelain.sh   | 121 +++++++++++++++++++++++++++
 4 files changed, 264 insertions(+), 21 deletions(-)


base-commit: a97fcc37c2bc6340a8d7ce78dedf227aac4e9aa7
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-2335%2FHaraldNordgren%2Fbisect-auto-reset-v4
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-2335/HaraldNordgren/bisect-auto-reset-v4
Pull-Request: https://github.com/git/git/pull/2335

Range-diff vs v3:

 1:  59920c51ae = 1:  e39670edf4 bisect: let bisect_reset() optionally check out quietly
 2:  542f4b2c80 ! 2:  f5f370df1b bisect: add --reset-when-found to leave when done
     @@ builtin/bisect.c: static enum bisect_error bisect_start(struct bisect_terms *ter
       		}
       	}
      +	if (reset_when_found != RESET_WHEN_FOUND_NONE && no_checkout) {
     -+		res = error(_("'--reset-when-found' cannot be used with '--no-checkout'"));
     ++		res = error(_("options '%s' and '%s' cannot be used together"),
     ++			    "--reset-when-found", "--no-checkout");
      +		goto finish;
      +	}
       	pathspec_pos = i;
     @@ builtin/bisect.c: static int bisect_run(struct bisect_terms *terms, int argc, co
      +
      +	if (reset_when_found != RESET_WHEN_FOUND_NONE) {
      +		if (refs_ref_exists(get_main_ref_store(the_repository), "BISECT_HEAD"))
     -+			return error(_("'--reset-when-found' cannot be used with '--no-checkout'"));
     ++			return error(_("options '%s' and '%s' cannot be used together"),
     ++				     "--reset-when-found", "--no-checkout");
      +		write_file(git_path_bisect_reset_when_found(), "%s\n",
      +			   reset_when_found_mode_name(reset_when_found));
      +		argc--;
     @@ t/t6030-bisect-porcelain.sh: test_bisect_usage () {
       }
       
      +test_bisect_state_file () {
     -+	test_path_is_file "$(git rev-parse --git-path "$1")"
     ++	local file &&
     ++	file=$(git rev-parse --git-path "$1") &&
     ++	test_path_is_file "$file"
      +}
      +
      +test_bisect_state_missing () {
     -+	test_path_is_missing "$(git rev-parse --git-path "$1")"
     ++	local file &&
     ++	file=$(git rev-parse --git-path "$1") &&
     ++	test_path_is_missing "$file"
      +}
      +
      +bisect_start_and_finish () {
     @@ t/t6030-bisect-porcelain.sh: test_expect_success '"git bisect run" simple case'
       '
       
      +test_expect_success '"git bisect start --reset-when-found" defaults to original' '
     -+	test_when_finished "git bisect reset; git checkout main" &&
     ++	test_when_finished "git bisect reset && git checkout main" &&
      +	git checkout main &&
      +	bisect_start_and_finish --reset-when-found &&
     -+	test "$HASH4" = "$(git rev-parse HEAD)" &&
     -+	test main = "$(git branch --show-current)" &&
     ++	actual=$(git rev-parse HEAD) &&
     ++	test "$HASH4" = "$actual" &&
     ++	actual=$(git branch --show-current) &&
     ++	test main = "$actual" &&
      +	test_bisect_state_missing BISECT_START &&
      +
      +	bisect_start_and_finish --reset-when-found=original &&
     -+	test "$HASH4" = "$(git rev-parse HEAD)" &&
     -+	test main = "$(git branch --show-current)" &&
     ++	actual=$(git rev-parse HEAD) &&
     ++	test "$HASH4" = "$actual" &&
     ++	actual=$(git branch --show-current) &&
     ++	test main = "$actual" &&
      +	test_bisect_state_missing BISECT_START
      +'
      +
      +test_expect_success '"git bisect start --reset-when-found=found" leaves first bad checked out' '
     -+	test_when_finished "git bisect reset; git checkout main" &&
     ++	test_when_finished "git bisect reset && git checkout main" &&
      +	bisect_start_and_finish --reset-when-found=found &&
     -+	test "$HASH3" = "$(git rev-parse HEAD)" &&
     ++	actual=$(git rev-parse HEAD) &&
     ++	test "$HASH3" = "$actual" &&
      +	test_bisect_state_missing BISECT_START
      +'
      +
      +test_expect_success '"git bisect run --reset-when-found" defaults to original' '
     -+	test_when_finished "git bisect reset; git checkout main" &&
     ++	test_when_finished "git bisect reset && git checkout main" &&
      +	bisect_run_reset_when_found --reset-when-found &&
     -+	test "$HASH4" = "$(git rev-parse HEAD)" &&
     -+	test main = "$(git branch --show-current)" &&
     ++	actual=$(git rev-parse HEAD) &&
     ++	test "$HASH4" = "$actual" &&
     ++	actual=$(git branch --show-current) &&
     ++	test main = "$actual" &&
      +	test_bisect_state_missing BISECT_START
      +'
      +
      +test_expect_success '"git bisect run --reset-when-found=found" leaves first bad checked out' '
     -+	test_when_finished "git bisect reset; git checkout main" &&
     ++	test_when_finished "git bisect reset && git checkout main" &&
      +	bisect_run_reset_when_found --reset-when-found=found &&
     -+	test "$HASH3" = "$(git rev-parse HEAD)" &&
     ++	actual=$(git rev-parse HEAD) &&
     ++	test "$HASH3" = "$actual" &&
      +	test_bisect_state_missing BISECT_START
      +'
      +
      +test_expect_success '--reset-when-found rejects an unknown reset target' '
     -+	test_when_finished "git bisect reset; git checkout main" &&
     ++	test_when_finished "git bisect reset && git checkout main" &&
      +	test_reset_when_found_fails \
      +		"invalid value for.*--reset-when-found.*unknown" BISECT_START \
      +		git bisect start --reset-when-found=unknown $HASH4 $HASH2 &&
     @@ t/t6030-bisect-porcelain.sh: test_expect_success '"git bisect run" simple case'
      +test_expect_success '--reset-when-found cannot be used with --no-checkout' '
      +	test_when_finished "git bisect reset" &&
      +	test_reset_when_found_fails \
     -+		"cannot be used with.*--no-checkout" BISECT_START \
     ++		"options .*--reset-when-found.* and .*--no-checkout.* cannot be used together" BISECT_START \
      +		git bisect start --reset-when-found=original --no-checkout $HASH4 $HASH2 &&
      +
      +	git bisect start --no-checkout $HASH4 $HASH2 &&
      +	test_reset_when_found_fails \
     -+		"cannot be used with.*--no-checkout" BISECT_RESET_WHEN_FOUND \
     ++		"options .*--reset-when-found.* and .*--no-checkout.* cannot be used together" BISECT_RESET_WHEN_FOUND \
      +		git bisect run --reset-when-found=found true
      +'
      +
     @@ t/t6030-bisect-porcelain.sh: test_expect_success '"git bisect run" simple case'
      +'
      +
      +test_expect_success '--reset-when-found does not leak into a later bisection' '
     -+	test_when_finished "git bisect reset; git checkout main" &&
     ++	test_when_finished "git bisect reset && git checkout main" &&
      +	bisect_start_and_finish --reset-when-found &&
      +
      +	git bisect start $HASH4 $HASH2 &&

-- 
gitgitgadget

  parent reply	other threads:[~2026-08-01  9:44 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-16  5:35 [PATCH 0/3] bisect: add --auto-reset to leave when done Harald Nordgren via GitGitGadget
2026-07-16  5:35 ` [PATCH 1/3] bisect: read run output from the open descriptor Harald Nordgren via GitGitGadget
2026-07-16  5:35 ` [PATCH 2/3] bisect: let bisect_reset() optionally check out quietly Harald Nordgren via GitGitGadget
2026-07-16  5:35 ` [PATCH 3/3] bisect: add --auto-reset to leave when done Harald Nordgren via GitGitGadget
2026-07-16 17:22   ` Junio C Hamano
2026-07-16 21:22     ` Harald Nordgren
2026-07-17  5:00       ` Junio C Hamano
2026-07-17  9:16         ` Harald Nordgren
2026-07-17 16:43           ` Junio C Hamano
2026-07-17 18:27 ` [PATCH v2 0/3] " Harald Nordgren via GitGitGadget
2026-07-17 18:27   ` [PATCH v2 1/3] bisect: read run output from the open descriptor Harald Nordgren via GitGitGadget
2026-07-17 22:42     ` Junio C Hamano
2026-07-18 16:24     ` Johannes Sixt
2026-07-17 18:27   ` [PATCH v2 2/3] bisect: let bisect_reset() optionally check out quietly Harald Nordgren via GitGitGadget
2026-07-17 18:27   ` [PATCH v2 3/3] bisect: add --auto-reset to leave when done Harald Nordgren via GitGitGadget
2026-07-18 16:18     ` Johannes Sixt
2026-07-20  1:14       ` Junio C Hamano
2026-07-20  9:10   ` [PATCH v3 0/2] " Harald Nordgren via GitGitGadget
2026-07-20  9:10     ` [PATCH v3 1/2] bisect: let bisect_reset() optionally check out quietly Harald Nordgren via GitGitGadget
2026-07-20  9:10     ` [PATCH v3 2/2] bisect: add --reset-when-found to leave when done Harald Nordgren via GitGitGadget
2026-07-23  9:17       ` Johannes Sixt
2026-07-23 14:27         ` Junio C Hamano
2026-08-01  6:51         ` Harald Nordgren
2026-07-20 17:20     ` [PATCH v3 0/2] bisect: add --auto-reset " Junio C Hamano
2026-08-01  9:44     ` Harald Nordgren via GitGitGadget [this message]
2026-08-01  9:44       ` [PATCH v4 1/2] bisect: let bisect_reset() optionally check out quietly Harald Nordgren via GitGitGadget
2026-08-01  9:44       ` [PATCH v4 2/2] bisect: add --reset-when-found to leave when done Harald Nordgren via GitGitGadget

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=pull.2335.v4.git.git.1785577445.gitgitgadget@gmail.com \
    --to=gitgitgadget@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=haraldnordgren@gmail.com \
    --cc=j6t@kdbg.org \
    /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 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.