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 v5 0/2] bisect: add --reset-when-found to leave when done
Date: Sun, 02 Aug 2026 09:31:13 +0000	[thread overview]
Message-ID: <pull.2335.v5.git.git.1785663075.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.2335.v4.git.git.1785577445.gitgitgadget@gmail.com>

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

Changes in v5:

 * Move automatic reset handling to cmd_bisect() after subcommand resources
   are closed.
 * Propagate the first-bad commit OID from bisect_next_all() and remove
   defer_reset plumbing.
 * Separate checkout from state cleanup in bisect_reset(), and use bool for
   its quiet flag.

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                      |   6 +-
 bisect.h                      |   3 +-
 builtin/bisect.c              | 165 +++++++++++++++++++++++++++++++---
 t/t6030-bisect-porcelain.sh   | 121 +++++++++++++++++++++++++
 5 files changed, 292 insertions(+), 17 deletions(-)


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

Range-diff vs v4:

 1:  e39670edf4 ! 1:  b6ab87fd29 bisect: let bisect_reset() optionally check out quietly
     @@ builtin/bisect.c: static int write_terms(const char *bad, const char *good)
       }
       
      -static int bisect_reset(const char *commit)
     -+static int bisect_reset(const char *commit, int quiet)
     ++static int bisect_reset(const char *commit, bool quiet)
       {
       	struct strbuf branch = STRBUF_INIT;
       
     @@ builtin/bisect.c: static enum bisect_error bisect_replay(struct bisect_terms *te
       		return error(_("cannot read file '%s' for replaying"), filename);
       
      -	if (bisect_reset(NULL))
     -+	if (bisect_reset(NULL, 0))
     ++	if (bisect_reset(NULL, false))
       		return BISECT_FAILED;
       
       	fp = fopen(filename, "r");
     @@ builtin/bisect.c: static int cmd_bisect__reset(int argc, const char **argv, cons
       		return error(_("'%s' requires either no argument or a commit"),
       			     "git bisect reset");
      -	return bisect_reset(argc ? argv[0] : NULL);
     -+	return bisect_reset(argc ? argv[0] : NULL, 0);
     ++	return bisect_reset(argc ? argv[0] : NULL, false);
       }
       
       static int cmd_bisect__terms(int argc, const char **argv, const char *prefix UNUSED,
 2:  f5f370df1b ! 2:  ec362f3b82 bisect: add --reset-when-found to leave when done
     @@ Commit message
          Persist the selected target in a BISECT_RESET_WHEN_FOUND state file
          and perform the reset quietly.
      
     -    For "git bisect run", defer the reset until after the captured output
     -    is printed and BISECT_RUN is closed. This lets cleanup remove the file
     -    on systems that cannot unlink an open file.
     +    Propagate the internal first-bad result and its commit to
     +    cmd_bisect(), which performs the reset after the subcommand has
     +    returned. For "git bisect run", this means BISECT_RUN has been printed
     +    and closed before cleanup, which also works on systems that cannot
     +    unlink an open file.
      
          Reject this option together with "--no-checkout", since that mode must
          not check out either target.
     @@ bisect.c: static GIT_PATH_FUNC(git_path_bisect_start, "BISECT_START")
       
       static void read_bisect_paths(struct strvec *array)
       {
     +@@ bisect.c: void read_bisect_terms(char **read_bad, char **read_good)
     +  * the end of bisect_helper::cmd_bisect__helper() helps bypassing
     +  * all the code related to finding a commit to test.
     +  */
     +-enum bisect_error bisect_next_all(struct repository *r, const char *prefix)
     ++enum bisect_error bisect_next_all(struct repository *r, const char *prefix,
     ++				  struct object_id *first_bad)
     + {
     + 	struct strvec rev_argv = STRVEC_INIT;
     + 	struct rev_info revs = REV_INFO_INIT;
     +@@ bisect.c: enum bisect_error bisect_next_all(struct repository *r, const char *prefix)
     + 		res = error_if_skipped_commits(tried, current_bad_oid);
     + 		if (res)
     + 			goto cleanup;
     ++		oidcpy(first_bad, bisect_rev);
     + 		printf("%s is the first '%s' commit\n", oid_to_hex(bisect_rev),
     + 			term_bad);
     + 
      @@ bisect.c: int bisect_clean_state(void)
       	unlink_or_warn(git_path_bisect_run());
       	unlink_or_warn(git_path_bisect_terms());
     @@ bisect.c: int bisect_clean_state(void)
       	 * Cleanup BISECT_START last to support the --no-checkout option
       	 * introduced in the commit 4796e823a.
      
     + ## bisect.h ##
     +@@ bisect.h: struct bisect_state {
     + 	unsigned int nr_bad;
     + };
     + 
     +-enum bisect_error bisect_next_all(struct repository *r, const char *prefix);
     ++enum bisect_error bisect_next_all(struct repository *r, const char *prefix,
     ++				  struct object_id *first_bad);
     + 
     + int estimate_bisect_steps(int all);
     + 
     +
       ## builtin/bisect.c ##
      @@ builtin/bisect.c: static GIT_PATH_FUNC(git_path_bisect_start, "BISECT_START")
       static GIT_PATH_FUNC(git_path_bisect_log, "BISECT_LOG")
     @@ builtin/bisect.c: static const char * const git_bisect_usage[] = {
       struct add_bisect_ref_data {
       	struct rev_info *revs;
       	unsigned int object_flags;
     -@@ builtin/bisect.c: static int bisect_reset(const char *commit, int quiet)
     - 	return bisect_clean_state();
     - }
     +@@ builtin/bisect.c: struct bisect_terms {
     + 	char *term_bad;
     + };
       
     ++static struct object_id first_bad_oid;
     ++
     + static void free_terms(struct bisect_terms *terms)
     + {
     + 	FREE_AND_NULL(terms->term_good);
     +@@ builtin/bisect.c: static int bisect_reset(const char *commit, bool quiet)
     + 	}
     + 
     + 	strbuf_release(&branch);
     +-	return bisect_clean_state();
     ++	return 0;
     ++}
     ++
      +static int parse_reset_when_found(const char *value,
      +				  enum reset_when_found_mode *mode)
      +{
     @@ builtin/bisect.c: static int bisect_reset(const char *commit, int quiet)
      +	BUG("unknown reset-when-found mode %d", mode);
      +}
      +
     -+static int bisect_reset_when_found(struct bisect_terms *terms)
     ++static int read_reset_when_found(enum reset_when_found_mode *mode)
      +{
      +	struct strbuf value = STRBUF_INIT;
     -+	enum reset_when_found_mode mode;
     -+	char *commit = NULL;
     -+	int res;
     ++	int res = 0;
     ++
     ++	*mode = RESET_WHEN_FOUND_NONE;
     ++	if (is_empty_or_missing_file(git_path_bisect_reset_when_found()))
     ++		return 0;
      +
      +	if (strbuf_read_file(&value, git_path_bisect_reset_when_found(), 0) < 0) {
      +		res = error_errno(_("could not read '%s'"),
      +				  git_path_bisect_reset_when_found());
     -+		goto cleanup;
     ++		goto out;
      +	}
      +	strbuf_trim(&value);
     -+	if (parse_reset_when_found(value.buf, &mode)) {
     ++	if (parse_reset_when_found(value.buf, mode))
      +		res = -1;
     -+		goto cleanup;
     -+	}
      +
     -+	if (mode == RESET_WHEN_FOUND_TO_FOUND)
     -+		commit = xstrfmt("refs/bisect/%s", terms->term_bad);
     -+	res = bisect_reset(commit, 1);
     -+
     -+cleanup:
     -+	free(commit);
     ++out:
      +	strbuf_release(&value);
      +	return res;
      +}
      +
     ++static int bisect_reset_when_found(enum reset_when_found_mode mode)
     ++{
     ++	char first_bad_hex[GIT_MAX_HEXSZ + 1];
     ++	const char *commit = NULL;
     ++	int res;
     ++
     ++	if (mode == RESET_WHEN_FOUND_TO_FOUND)
     ++		commit = oid_to_hex_r(first_bad_hex, &first_bad_oid);
     ++	else if (mode == RESET_WHEN_FOUND_NONE)
     ++		BUG("automatic reset requested without a reset mode");
     ++
     ++	res = bisect_reset(commit, true);
     ++	if (!res)
     ++		res = bisect_clean_state();
     ++
     ++	return res;
     + }
     + 
       static void log_commit(FILE *fp,
     - 		       const char *fmt, const char *state,
     - 		       struct commit *commit)
      @@ builtin/bisect.c: static int bisect_successful(struct bisect_terms *terms)
       	return res;
       }
       
      -static enum bisect_error bisect_next(struct bisect_terms *terms, const char *prefix)
      +static enum bisect_error bisect_next(struct bisect_terms *terms,
     -+				     const char *prefix, bool defer_reset)
     ++				     const char *prefix)
       {
       	enum bisect_error res;
       
      @@ builtin/bisect.c: static enum bisect_error bisect_next(struct bisect_terms *terms, const char *pre
     + 		return BISECT_FAILED;
     + 
     + 	/* Perform all bisection computation */
     +-	res = bisect_next_all(the_repository, prefix);
     ++	res = bisect_next_all(the_repository, prefix, &first_bad_oid);
       
       	if (res == BISECT_INTERNAL_SUCCESS_1ST_BAD_FOUND) {
       		res = bisect_successful(terms);
     -+		if (!res && !defer_reset &&
     -+		    !is_empty_or_missing_file(git_path_bisect_reset_when_found()))
     -+			res = bisect_reset_when_found(terms);
     - 		return res ? res : BISECT_INTERNAL_SUCCESS_1ST_BAD_FOUND;
     - 	} else if (res == BISECT_ONLY_SKIPPED_LEFT) {
     - 		res = bisect_skipped_commits(terms);
      @@ builtin/bisect.c: static enum bisect_error bisect_next(struct bisect_terms *terms, const char *pre
       	return res;
       }
       
      -static enum bisect_error bisect_auto_next(struct bisect_terms *terms, const char *prefix)
      +static enum bisect_error bisect_auto_next(struct bisect_terms *terms,
     -+					  const char *prefix, bool defer_reset)
     ++					  const char *prefix)
       {
       	if (bisect_next_check(terms, NULL)) {
       		bisect_print_status(terms);
     - 		return BISECT_OK;
     - 	}
     - 
     --	return bisect_next(terms, prefix);
     -+	return bisect_next(terms, prefix, defer_reset);
     - }
     - 
     - static enum bisect_error bisect_start(struct bisect_terms *terms, int argc,
      @@ builtin/bisect.c: static enum bisect_error bisect_start(struct bisect_terms *terms, int argc,
     - {
     - 	int no_checkout = 0;
     - 	int first_parent_only = 0;
     + 	struct strbuf bisect_names = STRBUF_INIT;
     + 	struct object_id head_oid;
     + 	struct object_id oid;
      +	enum reset_when_found_mode reset_when_found = RESET_WHEN_FOUND_NONE;
     - 	int i, has_double_dash = 0, must_write_terms = 0, bad_seen = 0;
     - 	int flags, pathspec_pos;
     - 	enum bisect_error res = BISECT_OK;
     + 	const char *head;
     + 
     + 	if (is_bare_repository(the_repository))
      @@ builtin/bisect.c: static enum bisect_error bisect_start(struct bisect_terms *terms, int argc,
       			no_checkout = 1;
       		} else if (!strcmp(arg, "--first-parent")) {
     @@ builtin/bisect.c: static enum bisect_error bisect_start(struct bisect_terms *ter
       	if (no_checkout) {
       		if (repo_get_oid(the_repository, start_head.buf, &oid) < 0) {
       			res = error(_("invalid ref: '%s'"), start_head.buf);
     -@@ builtin/bisect.c: finish:
     - 	if (res)
     - 		return res;
     - 
     --	res = bisect_auto_next(terms, NULL);
     -+	res = bisect_auto_next(terms, NULL, false);
     - 	if (!is_bisect_success(res))
     - 		bisect_clean_state();
     - 	return res;
     -@@ builtin/bisect.c: static int bisect_autostart(struct bisect_terms *terms)
     - }
     - 
     - static enum bisect_error bisect_state(struct bisect_terms *terms, int argc,
     --				      const char **argv)
     -+				      const char **argv, bool defer_reset)
     - {
     - 	const char *state;
     - 	int i, verify_expected = 1;
     -@@ builtin/bisect.c: static enum bisect_error bisect_state(struct bisect_terms *terms, int argc,
     - 	}
     - 
     - 	oid_array_clear(&revs);
     --	return bisect_auto_next(terms, NULL);
     -+	return bisect_auto_next(terms, NULL, defer_reset);
     - }
     - 
     - static enum bisect_error bisect_log(void)
      @@ builtin/bisect.c: static enum bisect_error bisect_replay(struct bisect_terms *terms, const char *f
     - 	if (res)
     - 		return BISECT_FAILED;
     + 	if (is_empty_or_missing_file(filename))
     + 		return error(_("cannot read file '%s' for replaying"), filename);
       
     --	return bisect_auto_next(terms, NULL);
     -+	return bisect_auto_next(terms, NULL, false);
     - }
     - 
     - static enum bisect_error bisect_skip(struct bisect_terms *terms, int argc,
     -@@ builtin/bisect.c: static enum bisect_error bisect_skip(struct bisect_terms *terms, int argc,
     - 			strvec_push(&argv_state, argv[i]);
     - 		}
     - 	}
     --	res = bisect_state(terms, argv_state.nr, argv_state.v);
     -+	res = bisect_state(terms, argv_state.nr, argv_state.v, false);
     +-	if (bisect_reset(NULL, false))
     ++	if (bisect_clean_state())
     + 		return BISECT_FAILED;
       
     - 	strvec_clear(&argv_state);
     - 	return res;
     + 	fp = fopen(filename, "r");
      @@ builtin/bisect.c: static int bisect_run(struct bisect_terms *terms, int argc, const char **argv)
       {
       	int res = BISECT_OK;
       	struct strbuf command = STRBUF_INIT;
     -+	enum reset_when_found_mode reset_when_found = RESET_WHEN_FOUND_NONE;
      +	const char *reset_when_found_arg;
       	const char *new_state;
       	int temporary_stdout_fd, saved_stdout;
       	int is_first_run = 1;
     -@@ builtin/bisect.c: static int bisect_run(struct bisect_terms *terms, int argc, const char **argv)
     ++	enum reset_when_found_mode reset_when_found = RESET_WHEN_FOUND_NONE;
     ++	bool reset_when_found_arg_seen = false;
     + 
       	if (bisect_next_check(terms, NULL))
       		return BISECT_FAILED;
       
     -+	if (argc && !strcmp(argv[0], "--reset-when-found"))
     ++	if (argc && !strcmp(argv[0], "--reset-when-found")) {
      +		reset_when_found = RESET_WHEN_FOUND_TO_ORIGINAL;
     -+	else if (argc && skip_prefix(argv[0], "--reset-when-found=",
     ++		reset_when_found_arg_seen = true;
     ++	} else if (argc && skip_prefix(argv[0], "--reset-when-found=",
      +				    &reset_when_found_arg)) {
     -+		if (parse_reset_when_found(reset_when_found_arg, &reset_when_found))
     ++		if (parse_reset_when_found(reset_when_found_arg,
     ++					   &reset_when_found))
      +			return BISECT_FAILED;
     ++		reset_when_found_arg_seen = true;
      +	}
      +
     -+	if (reset_when_found != RESET_WHEN_FOUND_NONE) {
     -+		if (refs_ref_exists(get_main_ref_store(the_repository), "BISECT_HEAD"))
     -+			return error(_("options '%s' and '%s' cannot be used together"),
     -+				     "--reset-when-found", "--no-checkout");
     ++	if (reset_when_found != RESET_WHEN_FOUND_NONE &&
     ++	    refs_ref_exists(get_main_ref_store(the_repository), "BISECT_HEAD"))
     ++		return error(_("options '%s' and '%s' cannot be used together"),
     ++			     "--reset-when-found", "--no-checkout");
     ++
     ++	if (reset_when_found_arg_seen) {
      +		write_file(git_path_bisect_reset_when_found(), "%s\n",
      +			   reset_when_found_mode_name(reset_when_found));
      +		argc--;
     @@ builtin/bisect.c: static int bisect_run(struct bisect_terms *terms, int argc, co
       	if (!argc) {
       		error(_("bisect run failed: no command provided."));
       		return BISECT_FAILED;
     -@@ builtin/bisect.c: static int bisect_run(struct bisect_terms *terms, int argc, const char **argv)
     - 		saved_stdout = dup(1);
     - 		dup2(temporary_stdout_fd, 1);
     - 
     --		res = bisect_state(terms, 1, &new_state);
     -+		res = bisect_state(terms, 1, &new_state, true);
     - 
     - 		fflush(stdout);
     - 		dup2(saved_stdout, 1);
      @@ builtin/bisect.c: static int bisect_run(struct bisect_terms *terms, int argc, const char **argv)
       			res = BISECT_OK;
       		} else if (res == BISECT_INTERNAL_SUCCESS_1ST_BAD_FOUND) {
       			printf(_("bisect found first '%s' commit\n"), terms->term_bad);
      -			res = BISECT_OK;
     -+			if (!is_empty_or_missing_file(git_path_bisect_reset_when_found()) &&
     -+			    bisect_reset_when_found(terms))
     -+				res = BISECT_FAILED;
     -+			else
     -+				res = BISECT_OK;
       		} else if (res) {
       			error(_("bisect run failed: 'git bisect %s'"
       				" exited with error code %d"), new_state, res);
     -@@ builtin/bisect.c: static int cmd_bisect__next(int argc, const char **argv UNUSED, const char *pref
     - 		return error(_("'%s' requires 0 arguments"),
     - 			     "git bisect next");
     - 	get_terms(&terms);
     --	res = bisect_next(&terms, prefix);
     -+	res = bisect_next(&terms, prefix, false);
     - 	free_terms(&terms);
     - 	return res;
     +@@ builtin/bisect.c: static int bisect_run(struct bisect_terms *terms, int argc, const char **argv)
     + static int cmd_bisect__reset(int argc, const char **argv, const char *prefix UNUSED,
     + 			     struct repository *repo UNUSED)
     + {
     ++	int res;
     ++
     + 	if (argc > 1)
     + 		return error(_("'%s' requires either no argument or a commit"),
     + 			     "git bisect reset");
     +-	return bisect_reset(argc ? argv[0] : NULL, false);
     ++	res = bisect_reset(argc ? argv[0] : NULL, false);
     ++	if (res)
     ++		return res;
     ++	return bisect_clean_state();
       }
     + 
     + static int cmd_bisect__terms(int argc, const char **argv, const char *prefix UNUSED,
      @@ builtin/bisect.c: int cmd_bisect(int argc,
       		    !one_of(argv[0], terms.term_good, terms.term_bad, NULL))
       			usage_msg_optf(_("unknown command: '%s'"), git_bisect_usage,
       				       options, argv[0]);
      -		res = bisect_state(&terms, argc, argv);
     -+		res = bisect_state(&terms, argc, argv, false);
     ++		else
     ++			res = bisect_state(&terms, argc, argv);
       		free_terms(&terms);
       	} else {
       		argc--;
     +@@ builtin/bisect.c: int cmd_bisect(int argc,
     + 		res = fn(argc, argv, prefix, repo);
     + 	}
     + 
     ++	if (res == BISECT_INTERNAL_SUCCESS_1ST_BAD_FOUND) {
     ++		enum reset_when_found_mode mode;
     ++
     ++		if (read_reset_when_found(&mode))
     ++			res = BISECT_FAILED;
     ++		else if (mode != RESET_WHEN_FOUND_NONE &&
     ++			 bisect_reset_when_found(mode))
     ++			res = BISECT_FAILED;
     ++	}
     ++
     + 	return is_bisect_success(res) ? 0 : -res;
     + }
      
       ## t/t6030-bisect-porcelain.sh ##
      @@ t/t6030-bisect-porcelain.sh: test_bisect_usage () {

-- 
gitgitgadget

  parent reply	other threads:[~2026-08-02  9:31 UTC|newest]

Thread overview: 42+ 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     ` [PATCH v4 0/2] bisect: add --reset-when-found " Harald Nordgren via GitGitGadget
2026-08-01  9:44       ` [PATCH v4 1/2] bisect: let bisect_reset() optionally check out quietly Harald Nordgren via GitGitGadget
2026-08-01 19:15         ` Junio C Hamano
2026-08-01  9:44       ` [PATCH v4 2/2] bisect: add --reset-when-found to leave when done Harald Nordgren via GitGitGadget
2026-08-01 19:54         ` Junio C Hamano
2026-08-01 21:40           ` Junio C Hamano
2026-08-02  9:31       ` Harald Nordgren via GitGitGadget [this message]
2026-08-02  9:31         ` [PATCH v5 1/2] bisect: let bisect_reset() optionally check out quietly Harald Nordgren via GitGitGadget
2026-08-02  9:31         ` [PATCH v5 2/2] bisect: add --reset-when-found to leave when done Harald Nordgren via GitGitGadget
2026-08-02 16:01         ` [PATCH v5 0/2] " Junio C Hamano
2026-08-02 21:24         ` [PATCH v6 " Harald Nordgren via GitGitGadget
2026-08-02 21:24           ` [PATCH v6 1/2] bisect: let bisect_reset() optionally check out quietly Harald Nordgren via GitGitGadget
2026-08-02 21:24           ` [PATCH v6 2/2] bisect: add --reset-when-found to leave when done Harald Nordgren via GitGitGadget
2026-08-03  0:08             ` Junio C Hamano
2026-08-06  7:30               ` Harald Nordgren
2026-08-06 13:50                 ` Junio C Hamano
2026-08-06 15:59                   ` Harald Nordgren
2026-08-06 17:36                     ` Junio C Hamano

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.v5.git.git.1785663075.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.