git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v2 11/14] bisect: move even the option parsing to `bisect--helper`

From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date
Feb 23, 2022, 09:47 UTC
Message-ID
<220223.86v8x56g7g.gmgdl@evledraar.gmail.com>
In-Reply-To
<dc04b06206bbb833ce3a7fa893d724d00fe58a74.1645547423.git.gitgitgadget@gmail.com>
On Tue, Feb 22 2022, Johannes Schindelin via GitGitGadget wrote:
Show 18 quoted lines
> From: Johannes Schindelin <johannes.schindelin@gmx.de>
>
> On our journey to a fully built-in `git bisect`, this is the
> second-to-last step.
>
> Side note: The `if (!strcmp(...)) ... else if (!strcmp(...)) ... else if
> (!strcmp(...)) ...` chain seen in this patch was not actually the first
> idea how to convert the command modes to sub-commands. Since the
> `bisect--helper` command already used the `parse-opions` API with neatly
> set-up command modes, naturally the idea was to use `PARSE_OPT_NODASH`
> to support proper sub-commands instead. However, the `parse-options` API
> is not set up for that, and even after making that option work with long
> options, it turned out that `STOP_AT_NON_OPTION` and `KEEP_UNKNOWN`
> would have to be used but these options were not designed to work
> together. So it would appear as if a lot of work would have to be done
> just to be able to use `parse_options()` just to parse the sub-command,
> instead of a simple `if...else if` chain, the latter being a
> dramatically simpler implementation.

As I noted in https://lore.kernel.org/git/220129.86pmobauyt.gmgdl@evledraar.gmail.com/:

Show 56 quoted lines
> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
> ---
>  builtin/bisect--helper.c | 133 ++++++++++++++++-----------------------
>  git-bisect.sh            |  49 +--------------
>  2 files changed, 56 insertions(+), 126 deletions(-)
>
> diff --git a/builtin/bisect--helper.c b/builtin/bisect--helper.c
> index 5228964937d..ef0b06d594b 100644
> --- a/builtin/bisect--helper.c
> +++ b/builtin/bisect--helper.c
> @@ -20,18 +20,34 @@ static GIT_PATH_FUNC(git_path_bisect_names, "BISECT_NAMES")
>  static GIT_PATH_FUNC(git_path_bisect_first_parent, "BISECT_FIRST_PARENT")
>  static GIT_PATH_FUNC(git_path_bisect_run, "BISECT_RUN")
>  
> -static const char * const git_bisect_helper_usage[] = {
> -	N_("git bisect--helper --bisect-reset [<commit>]"),
> -	N_("git bisect--helper --bisect-terms [--term-good | --term-old | --term-bad | --term-new]"),
> -	N_("git bisect--helper --bisect-start [--term-{new,bad}=<term> --term-{old,good}=<term>]"
> -					    " [--no-checkout] [--first-parent] [<bad> [<good>...]] [--] [<paths>...]"),
> -	N_("git bisect--helper --bisect-next"),
> -	N_("git bisect--helper [--bisect-state] (bad|new) [<rev>]"),
> -	N_("git bisect--helper [--bisect-state] (good|old) [<rev>...]"),
> -	N_("git bisect--helper --bisect-replay <filename>"),
> -	N_("git bisect--helper --bisect-skip [(<rev>|<range>)...]"),
> -	N_("git bisect--helper --bisect-visualize"),
> -	N_("git bisect--helper --bisect-run <cmd>..."),
> +static const char * const git_bisect_usage[] = {
> +	N_("git bisect help\n"
> +	   "\tprint this long help message."),
> +	N_("git bisect start [--term-{new,bad}=<term> --term-{old,good}=<term>]\n"
> +	   "\t\t [--no-checkout] [--first-parent] [<bad> [<good>...]] [--] [<pathspec>...]\n"
> +	   "\treset bisect state and start bisection."),
> +	N_("git bisect (bad|new) [<rev>]\n"
> +	   "\tmark <rev> a known-bad revision/\n"
> +	   "\t\ta revision after change in a given property."),
> +	N_("git bisect (good|old) [<rev>...]\n"
> +	   "\tmark <rev>... known-good revisions/\n"
> +	   "\t\trevisions before change in a given property."),
> +	N_("git bisect terms [--term-good | --term-bad]\n"
> +	   "\tshow the terms used for old and new commits (default: bad, good)"),
> +	N_("git bisect skip [(<rev>|<range>)...]\n"
> +	   "\tmark <rev>... untestable revisions."),
> +	N_("git bisect next\n"
> +	   "\tfind next bisection to test and check it out."),
> +	N_("git bisect reset [<commit>]\n"
> +	   "\tfinish bisection search and go back to commit."),
> +	N_("git bisect (visualize|view)\n"
> +	   "\tshow bisect status in gitk."),
> +	N_("git bisect replay <logfile>\n"
> +	   "\treplay bisection log."),
> +	N_("git bisect log\n"
> +	   "\tshow bisect log."),
> +	N_("git bisect run <cmd>...\n"
> +	   "\tuse <cmd>... to automatically bisect."),
>  	NULL
>  };
Even that doesn't explain why this needs to be changed as
well. I.e. this could just be:
	
	diff --git a/builtin/bisect.c b/builtin/bisect.c
	index e8a346fa516..d27b80ddaf3 100644
	--- a/builtin/bisect.c
	+++ b/builtin/bisect.c
	@@ -20,33 +20,18 @@ static GIT_PATH_FUNC(git_path_bisect_first_parent, "BISECT_FIRST_PARENT")
	 static GIT_PATH_FUNC(git_path_bisect_run, "BISECT_RUN")
	 
	 static const char * const builtin_bisect_usage[] = {
	-	N_("git bisect help\n"
	-	   "\tprint this long help message."),
	+	N_("git bisect reset [<commit>]"),
	+	N_("git bisect terms [--term-good | --term-old | --term-bad | --term-new]"),
	 	N_("git bisect start [--term-{new,bad}=<term> --term-{old,good}=<term>]\n"
	-	   "\t\t [--no-checkout] [--first-parent] [<bad> [<good>...]] [--] [<pathspec>...]\n"
	-	   "\treset bisect state and start bisection."),
	-	N_("git bisect (bad|new) [<rev>]\n"
	-	   "\tmark <rev> a known-bad revision/\n"
	-	   "\t\ta revision after change in a given property."),
	-	N_("git bisect (good|old) [<rev>...]\n"
	-	   "\tmark <rev>... known-good revisions/\n"
	-	   "\t\trevisions before change in a given property."),
	-	N_("git bisect terms [--term-good | --term-bad]\n"
	-	   "\tshow the terms used for old and new commits (default: bad, good)"),
	-	N_("git bisect skip [(<rev>|<range>)...]\n"
	-	   "\tmark <rev>... untestable revisions."),
	-	N_("git bisect next\n"
	-	   "\tfind next bisection to test and check it out."),
	-	N_("git bisect reset [<commit>]\n"
	-	   "\tfinish bisection search and go back to commit."),
	-	N_("git bisect (visualize|view)\n"
	-	   "\tshow bisect status in gitk."),
	-	N_("git bisect replay <logfile>\n"
	-	   "\treplay bisection log."),
	-	N_("git bisect log\n"
	-	   "\tshow bisect log."),
	-	N_("git bisect run <cmd>...\n"
	-	   "\tuse <cmd>... to automatically bisect."),
	+	   "                 [--no-checkout] [--first-parent] [<bad> [<good>...]]\n"
	+	   "                 [--] [<paths>...]"),
	+	N_("git bisect next"),
	+	N_("git bisect state (bad|new) [<rev>]"),
	+	N_("git bisect state (good|old) [<rev>...]"),
	+	N_("git bisect replay <filename>"),
	+	N_("git bisect skip [(<rev>|<range>)...]"),
	+	N_("git bisect visualize"),
	+	N_("git bisect run <cmd>..."),
	 	NULL
	 };
Which turns the help output into:
    
    $ ./git bisect -h
    usage: git bisect reset [<commit>]
       or: git bisect terms [--term-good | --term-old | --term-bad | --term-new]
       or: git bisect start [--term-{new,bad}=<term> --term-{old,good}=<term>]
                            [--no-checkout] [--first-parent] [<bad> [<good>...]]
                            [--] [<paths>...]
       or: git bisect next
       or: git bisect state (bad|new) [<rev>]
       or: git bisect state (good|old) [<rev>...]
       or: git bisect replay <filename>
       or: git bisect skip [(<rev>|<range>)...]
       or: git bisect visualize
       or: git bisect run <cmd>...
Instead of:
    
    $ ./git bisect -h
    usage: git bisect help
            print this long help message.
       or: git bisect start [--term-{new,bad}=<term> --term-{old,good}=<term>]
                     [--no-checkout] [--first-parent] [<bad> [<good>...]] [--] [<pathspec>...]
            reset bisect state and start bisection.
       or: git bisect (bad|new) [<rev>]
            mark <rev> a known-bad revision/
                    a revision after change in a given property.
       or: git bisect (good|old) [<rev>...]
            mark <rev>... known-good revisions/
                    revisions before change in a given property.
       or: git bisect terms [--term-good | --term-bad]
            show the terms used for old and new commits (default: bad, good)
       or: git bisect skip [(<rev>|<range>)...]
            mark <rev>... untestable revisions.
       or: git bisect next
            find next bisection to test and check it out.
       or: git bisect reset [<commit>]
            finish bisection search and go back to commit.
       or: git bisect (visualize|view)
            show bisect status in gitk.
       or: git bisect replay <logfile>
            replay bisection log.
       or: git bisect log
            show bisect log.
       or: git bisect run <cmd>...
            use <cmd>... to automatically bisect.

I.e. parse_options() != the usage_with_options() formatting function in parse-options.c. You can use one without using the other. The commit message only claims (wrongly I think, but let's leave that aside for the moment) that we can't use parse_options(), but doesn't say why we *also* need to move to doing our own formatting of the usage output, those are two different things.

As I noted in the previous round I think you were trying to retain the OPT_CMDMODE help messages. We could use the "" parse_options() usage feature to emit output similar to "git bisect--helper -h", but I think just having it by the same as current built-ins is fine.

I.e. for "stash" etc. we're not emitting human readable help explanations along with every subcommand, and could just do the same for "git bisect".

But on to parse_options() usage:
Show 46 quoted lines
> @@ -1168,108 +1184,69 @@ static int bisect_run(struct bisect_terms *terms, const char **argv, int argc)
>  
>  int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
>  {
> -	enum {
> -		BISECT_START = 1,
> -		BISECT_STATE,
> -		BISECT_TERMS,
> -		BISECT_SKIP,
> -		BISECT_NEXT,
> -		BISECT_RESET,
> -		BISECT_VISUALIZE,
> -		BISECT_REPLAY,
> -		BISECT_LOG,
> -		BISECT_RUN,
> -	} cmdmode = 0;
>  	int res = 0;
>  	struct option options[] = {
> -		OPT_CMDMODE(0, "bisect-start", &cmdmode,
> -			 N_("start the bisect session"), BISECT_START),
> -		OPT_CMDMODE(0, "bisect-state", &cmdmode,
> -			 N_("mark the state of ref (or refs)"), BISECT_STATE),
> -		OPT_CMDMODE(0, "bisect-terms", &cmdmode,
> -			 N_("print out the bisect terms"), BISECT_TERMS),
> -		OPT_CMDMODE(0, "bisect-skip", &cmdmode,
> -			 N_("skip some commits for checkout"), BISECT_SKIP),
> -		OPT_CMDMODE(0, "bisect-next", &cmdmode,
> -			 N_("find the next bisection commit"), BISECT_NEXT),
> -		OPT_CMDMODE(0, "bisect-reset", &cmdmode,
> -			 N_("reset the bisection state"), BISECT_RESET),
> -		OPT_CMDMODE(0, "bisect-visualize", &cmdmode,
> -			 N_("visualize the bisection"), BISECT_VISUALIZE),
> -		OPT_CMDMODE(0, "bisect-replay", &cmdmode,
> -			 N_("replay the bisection process from the given file"), BISECT_REPLAY),
> -		OPT_CMDMODE(0, "bisect-log", &cmdmode,
> -			 N_("list the bisection steps so far"), BISECT_LOG),
> -		OPT_CMDMODE(0, "bisect-run", &cmdmode,
> -			 N_("use <cmd>... to automatically bisect."), BISECT_RUN),
>  		OPT_END()
>  	};
>  	struct bisect_terms terms = { .term_good = NULL, .term_bad = NULL };
> +	const char *command = argc > 1 ? argv[1] : "help";
>  
> -	argc = parse_options(argc, argv, prefix, options,
> -			     git_bisect_helper_usage,
> -			     PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_UNKNOWN);

Because of thinking that we need to get rid of parse_options() here we...

> +	if (!strcmp("-h", command) || !strcmp("help", command))
> +		usage_with_options(git_bisect_usage, options);
...end up duplicating some of its behavior here...
Show 75 quoted lines
>  
> -	switch (cmdmode ? cmdmode : BISECT_STATE) {
> -	case BISECT_START:
> +	argc -= 2;
> +	argv += 2;
> +
> +	if (!strcmp("start", command)) {
>  		set_terms(&terms, "bad", "good");
>  		res = bisect_start(&terms, argv, argc);
> -		break;
> -	case BISECT_TERMS:
> +	} else if (!strcmp("terms", command)) {
>  		if (argc > 1)
> -			die(_("--bisect-terms requires 0 or 1 argument"));
> +			die(_("'terms' requires 0 or 1 argument"));
>  		res = bisect_terms(&terms, argc == 1 ? argv[0] : NULL);
> -		break;
> -	case BISECT_SKIP:
> +	} else if (!strcmp("skip", command)) {
>  		set_terms(&terms, "bad", "good");
>  		get_terms(&terms);
>  		res = bisect_skip(&terms, argv, argc);
> -		break;
> -	case BISECT_NEXT:
> +	} else if (!strcmp("next", command)) {
>  		if (argc)
> -			die(_("--bisect-next requires 0 arguments"));
> +			die(_("'next' requires 0 arguments"));
>  		get_terms(&terms);
>  		res = bisect_next(&terms, prefix);
> -		break;
> -	case BISECT_RESET:
> +	} else if (!strcmp("reset", command)) {
>  		if (argc > 1)
> -			die(_("--bisect-reset requires either no argument or a commit"));
> +			die(_("'reset' requires either no argument or a commit"));
>  		res = bisect_reset(argc ? argv[0] : NULL);
> -		break;
> -	case BISECT_VISUALIZE:
> +	} else if (one_of(command, "visualize", "view", NULL)) {
>  		get_terms(&terms);
>  		res = bisect_visualize(&terms, argv, argc);
> -		break;
> -	case BISECT_REPLAY:
> +	} else if (!strcmp("replay", command)) {
>  		if (argc != 1)
>  			die(_("no logfile given"));
>  		set_terms(&terms, "bad", "good");
>  		res = bisect_replay(&terms, argv[0]);
> -		break;
> -	case BISECT_LOG:
> +	} else if (!strcmp("log", command)) {
>  		if (argc)
> -			die(_("--bisect-log requires 0 arguments"));
> +			die(_("'log' requires 0 arguments"));
>  		res = bisect_log();
> -		break;
> -	case BISECT_RUN:
> +	} else if (!strcmp("run", command)) {
>  		if (!argc)
>  			die(_("bisect run failed: no command provided."));
>  		get_terms(&terms);
>  		res = bisect_run(&terms, argv, argc);
> -		break;
> -	case BISECT_STATE:
> +	} else {
>  		set_terms(&terms, "bad", "good");
>  		get_terms(&terms);
> -		if (!cmdmode &&
> -		    (!argc || check_and_set_terms(&terms, argv[0]))) {
> -			char *msg = xstrfmt(_("unknown command: '%s'"), argv[0]);
> -			usage_msg_opt(msg, git_bisect_helper_usage, options);
> +		if (check_and_set_terms(&terms, command)) {
> +			char *msg = xstrfmt(_("unknown command: '%s'"), command);
> +			usage_msg_opt(msg, git_bisect_usage, options);

[Change this usage_msg_opt() to a usage_msg_optf() and drop the xstrfmt()]

Show 9 quoted lines
>  		}
> +		/* shift the `command` back in */
> +		argc++;
> +		argv--;
>  		res = bisect_state(&terms, argv, argc);
> -		break;
> -	default:
> -		BUG("unknown subcommand %d", cmdmode);
>  	}

..and introducing bugs here, e.g. "git bisect --blah" is now a valid way to start a bisect", we no longer understand "git bisect <subcommand> -h", but did before etc.

Is the reason for further extending the custom command parser here because of e.g. the "die(..requires N arguments"? For all of those this could follow the pattern that builtin/commit-graph.c etc. use.

I.e. just define a usage for say "log", and empty options, then pass argc/argv to that subcommand, and have it call parse_options().

Then not only will the user get an error, they'll get the subset of "git bisect -h" output appropriate for whatever "git bisect subcommand <bad usage>" they invoked.

Previous: Johannes Schindelin via GitGitGadgetNext: Johannes Schindelin
Message 42 of 147 in “Finish converting git bisect into a built-in”
  1. 00/11 Finish converting git bisect into a built-inJohannes Schindelin via GitGitGadget, Jan 28, 2022
  2. 01/11 bisect run: fix the error messageJohannes Schindelin via GitGitGadget, Jan 28, 2022
  3. Elijah NewrenFeb 8, 2022
  4. Johannes SchindelinFeb 22, 2022
  5. 02/11 bisect--helper: retire the --no-log optionJohannes Schindelin via GitGitGadget, Jan 28, 2022
  6. 03/11 bisect--helper: really retire --bisect-next-checkJohannes Schindelin via GitGitGadget, Jan 28, 2022
  7. 04/11 bisect--helper: really retire `--bisect-autostart`Johannes Schindelin via GitGitGadget, Jan 28, 2022
  8. 05/11 bisect--helper: align the sub-command order with git-bisect.shJohannes Schindelin via GitGitGadget, Jan 28, 2022
  9. 08/11 bisect--helper: using `--bisect-state` without an argument is a bugJohannes Schindelin via GitGitGadget, Jan 28, 2022
  10. Ævar Arnfjörð BjarmasonJan 29, 2022
  11. Elijah NewrenFeb 9, 2022
  12. 06/11 bisect--helper: make `--bisect-state` optionalJohannes Schindelin via GitGitGadget, Jan 28, 2022
  13. Elijah NewrenFeb 8, 2022
  14. Johannes SchindelinFeb 22, 2022
  15. Junio C HamanoFeb 9, 2022
  16. Johannes SchindelinFeb 22, 2022
  17. 09/11 Turn `git bisect` into a full built-in.Johannes Schindelin via GitGitGadget, Jan 28, 2022
  18. Ævar Arnfjörð BjarmasonJan 29, 2022
  19. 07/11 bisect: move even the option parsing to `bisect--helper`Johannes Schindelin via GitGitGadget, Jan 28, 2022
  20. Ævar Arnfjörð BjarmasonJan 29, 2022
  21. Elijah NewrenFeb 9, 2022
  22. Johannes SchindelinFeb 22, 2022
  23. 11/11 bisect: no longer try to clean up left-over `.git/head-name` filesJohannes Schindelin via GitGitGadget, Jan 28, 2022
  24. 10/11 bisect: remove Cogito-related codeJohannes Schindelin via GitGitGadget, Jan 28, 2022
  25. Elijah NewrenJan 30, 2022
  26. Elijah NewrenFeb 9, 2022
  27. Johannes SchindelinFeb 22, 2022
  28. 00/14 Finish converting git bisect into a built-inJohannes Schindelin via GitGitGadget, Feb 22, 2022
  29. 01/14 bisect run: fix the error messageJohannes Schindelin via GitGitGadget, Feb 22, 2022
  30. 02/14 bisect: avoid double-quoting when printing the failed commandJohannes Schindelin via GitGitGadget, Feb 22, 2022
  31. 03/14 bisect--helper: retire the --no-log optionJohannes Schindelin via GitGitGadget, Feb 22, 2022
  32. 04/14 bisect--helper: really retire --bisect-next-checkJohannes Schindelin via GitGitGadget, Feb 22, 2022
  33. 05/14 bisect--helper: really retire `--bisect-autostart`Johannes Schindelin via GitGitGadget, Feb 22, 2022
  34. 06/14 bisect--helper: using `--bisect-state` without an argument is a bugJohannes Schindelin via GitGitGadget, Feb 22, 2022
  35. 07/14 bisect--helper: align the sub-command order with git-bisect.shJohannes Schindelin via GitGitGadget, Feb 22, 2022
  36. 08/14 bisect--helper: make `--bisect-state` optionalJohannes Schindelin via GitGitGadget, Feb 22, 2022
  37. 09/14 bisect--helper: move the `BISECT_STATE` case to the endJohannes Schindelin via GitGitGadget, Feb 22, 2022
  38. 10/14 bisect--helper: return only correct exit codes in `cmd_*()`Johannes Schindelin via GitGitGadget, Feb 22, 2022
  39. 14/14 bisect: no longer try to clean up left-over `.git/head-name` filesJohannes Schindelin via GitGitGadget, Feb 22, 2022
  40. 13/14 bisect: remove Cogito-related codeJohannes Schindelin via GitGitGadget, Feb 22, 2022
  41. 11/14 bisect: move even the option parsing to `bisect--helper`Johannes Schindelin via GitGitGadget, Feb 22, 2022
  42. Ævar Arnfjörð BjarmasonFeb 23, 2022
  43. Johannes SchindelinFeb 25, 2022
  44. Ævar Arnfjörð BjarmasonFeb 25, 2022
  45. 12/14 Turn `git bisect` into a full built-inJohannes Schindelin via GitGitGadget, Feb 22, 2022
  46. Elijah NewrenFeb 23, 2022
  47. Johannes SchindelinFeb 25, 2022
  48. Junio C HamanoFeb 23, 2022
  49. Johannes SchindelinFeb 25, 2022
  50. Ævar Arnfjörð BjarmasonFeb 25, 2022
  51. 00/15 Finish converting git bisect into a built-inJohannes Schindelin via GitGitGadget, May 21, 2022
  52. 01/15 bisect run: fix the error messageJohannes Schindelin via GitGitGadget, May 21, 2022
  53. 02/15 bisect: avoid double-quoting when printing the failed commandJohannes Schindelin via GitGitGadget, May 21, 2022
  54. 03/15 bisect--helper: retire the --no-log optionJohannes Schindelin via GitGitGadget, May 21, 2022
  55. 05/15 bisect--helper: really retire `--bisect-autostart`Johannes Schindelin via GitGitGadget, May 21, 2022
  56. 06/15 bisect--helper: using `--bisect-state` without an argument is a bugJohannes Schindelin via GitGitGadget, May 21, 2022
  57. 04/15 bisect--helper: really retire --bisect-next-checkJohannes Schindelin via GitGitGadget, May 21, 2022
  58. 07/15 bisect--helper: align the sub-command order with git-bisect.shJohannes Schindelin via GitGitGadget, May 21, 2022
  59. 08/15 bisect--helper: make `--bisect-state` optionalJohannes Schindelin via GitGitGadget, May 21, 2022
  60. 10/15 bisect--helper: return only correct exit codes in `cmd_*()`Johannes Schindelin via GitGitGadget, May 21, 2022
  61. Ævar Arnfjörð BjarmasonMay 21, 2022
  62. 09/15 bisect--helper: move the `BISECT_STATE` case to the endJohannes Schindelin via GitGitGadget, May 21, 2022
  63. 12/15 bisect: teach the `bisect--helper` command to show the correct usage stringsJohannes Schindelin via GitGitGadget, May 21, 2022
  64. 11/15 bisect: move even the command-line parsing to `bisect--helper`Johannes Schindelin via GitGitGadget, May 21, 2022
  65. Ævar Arnfjörð BjarmasonMay 21, 2022
  66. 14/15 bisect: remove Cogito-related codeJohannes Schindelin via GitGitGadget, May 21, 2022
  67. 13/15 Turn `git bisect` into a full built-inJohannes Schindelin via GitGitGadget, May 21, 2022
  68. 15/15 bisect: no longer try to clean up left-over `.git/head-name` filesJohannes Schindelin via GitGitGadget, May 21, 2022
  69. Bagas SanjayaMay 22, 2022
  70. Ævar Arnfjörð BjarmasonMay 23, 2022
  71. 00/16 Finish converting git bisect into a built-inJohannes Schindelin via GitGitGadget, Jun 27, 2022
  72. 02/16 bisect run: fix the error messageJohannes Schindelin via GitGitGadget, Jun 27, 2022
  73. 01/16 bisect: verify that a bogus option won't try to start a bisectionJohannes Schindelin via GitGitGadget, Jun 27, 2022
  74. Junio C HamanoJun 28, 2022
  75. 04/16 bisect--helper: retire the --no-log optionJohannes Schindelin via GitGitGadget, Jun 27, 2022
  76. 05/16 bisect--helper: really retire --bisect-next-checkJohannes Schindelin via GitGitGadget, Jun 27, 2022
  77. 03/16 bisect: avoid double-quoting when printing the failed commandJohannes Schindelin via GitGitGadget, Jun 27, 2022
  78. 07/16 bisect--helper: using `--bisect-state` without an argument is a bugJohannes Schindelin via GitGitGadget, Jun 27, 2022
  79. 06/16 bisect--helper: really retire `--bisect-autostart`Johannes Schindelin via GitGitGadget, Jun 27, 2022
  80. 08/16 bisect--helper: align the sub-command order with git-bisect.shJohannes Schindelin via GitGitGadget, Jun 27, 2022
  81. 09/16 bisect--helper: make `--bisect-state` optionalJohannes Schindelin via GitGitGadget, Jun 27, 2022
  82. 10/16 bisect--helper: move the `BISECT_STATE` case to the endJohannes Schindelin via GitGitGadget, Jun 27, 2022
  83. 11/16 bisect--helper: return only correct exit codes in `cmd_*()`Johannes Schindelin via GitGitGadget, Jun 27, 2022
  84. Ævar Arnfjörð BjarmasonJun 27, 2022
  85. 12/16 bisect: teach the `bisect--helper` command to show the correct usage stringsJohannes Schindelin via GitGitGadget, Jun 27, 2022
  86. Junio C HamanoJun 27, 2022
  87. 14/16 Turn `git bisect` into a full built-inJohannes Schindelin via GitGitGadget, Jun 27, 2022
  88. Junio C HamanoJun 27, 2022
  89. 16/16 bisect: no longer try to clean up left-over `.git/head-name` filesJohannes Schindelin via GitGitGadget, Jun 27, 2022
  90. 13/16 bisect: move even the command-line parsing to `bisect--helper`Johannes Schindelin via GitGitGadget, Jun 27, 2022
  91. 15/16 bisect: remove Cogito-related codeJohannes Schindelin via GitGitGadget, Jun 27, 2022
  92. Junio C HamanoJun 27, 2022
  93. Ævar Arnfjörð BjarmasonJun 27, 2022
  94. 00/16 Finish converting git bisect into a built-inJohannes Schindelin via GitGitGadget, Aug 27, 2022
  95. 01/16 bisect--helper: retire the --no-log optionJohannes Schindelin via GitGitGadget, Aug 27, 2022
  96. 03/16 bisect--helper: really retire `--bisect-autostart`Johannes Schindelin via GitGitGadget, Aug 27, 2022
  97. 02/16 bisect--helper: really retire --bisect-next-checkJohannes Schindelin via GitGitGadget, Aug 27, 2022
  98. 04/16 bisect--helper: simplify exit code computationJohannes Schindelin via GitGitGadget, Aug 27, 2022
  99. Junio C HamanoAug 28, 2022
  100. 05/16 bisect--helper: make `terms` an explicit singletonJohannes Schindelin via GitGitGadget, Aug 27, 2022
  101. Junio C HamanoAug 28, 2022
  102. Johannes SchindelinAug 29, 2022
  103. Junio C HamanoAug 29, 2022
  104. Ævar Arnfjörð BjarmasonAug 29, 2022
  105. Johannes SchindelinAug 29, 2022
  106. Junio C HamanoAug 29, 2022
  107. 06/16 bisect--helper: make the order consistently `argc, argv`Johannes Schindelin via GitGitGadget, Aug 27, 2022
  108. Junio C HamanoAug 28, 2022
  109. 07/16 bisect--helper: migrate to OPT_SUBCOMMAND()Johannes Schindelin via GitGitGadget, Aug 27, 2022
  110. Ævar Arnfjörð BjarmasonAug 29, 2022
  111. Johannes SchindelinAug 30, 2022
  112. 08/16 bisect: verify that a bogus option won't try to start a bisectionJohannes Schindelin via GitGitGadget, Aug 27, 2022
  113. 09/16 bisect run: fix the error messageJohannes Schindelin via GitGitGadget, Aug 27, 2022
  114. Junio C HamanoAug 28, 2022
  115. Johannes SchindelinAug 29, 2022
  116. 10/16 bisect: avoid double-quoting when printing the failed commandJohannes Schindelin via GitGitGadget, Aug 27, 2022
  117. 11/16 bisect--helper: calling `bisect_state()` without an argument is a bugJohannes Schindelin via GitGitGadget, Aug 27, 2022
  118. Ævar Arnfjörð BjarmasonAug 29, 2022
  119. Johannes SchindelinAug 30, 2022
  120. 15/16 bisect: remove Cogito-related codeJohannes Schindelin via GitGitGadget, Aug 27, 2022
  121. 14/16 Turn `git bisect` into a full built-inJohannes Schindelin via GitGitGadget, Aug 27, 2022
  122. 13/16 bisect: move even the command-line parsing to `bisect--helper`Johannes Schindelin via GitGitGadget, Aug 27, 2022
  123. 12/16 bisect--helper: make `state` optionalJohannes Schindelin via GitGitGadget, Aug 27, 2022
  124. 16/16 bisect: no longer try to clean up left-over `.git/head-name` filesJohannes Schindelin via GitGitGadget, Aug 27, 2022
  125. 00/16 Finish converting git bisect into a built-inJohannes Schindelin via GitGitGadget, Aug 30, 2022
  126. 01/16 bisect--helper: retire the --no-log optionJohannes Schindelin via GitGitGadget, Aug 30, 2022
  127. 02/16 bisect--helper: really retire --bisect-next-checkJohannes Schindelin via GitGitGadget, Aug 30, 2022
  128. 03/16 bisect--helper: really retire `--bisect-autostart`Johannes Schindelin via GitGitGadget, Aug 30, 2022
  129. 04/16 bisect--helper: simplify exit code computationJohannes Schindelin via GitGitGadget, Aug 30, 2022
  130. 06/16 bisect--helper: make the order consistently `argc, argv`Johannes Schindelin via GitGitGadget, Aug 30, 2022
  131. 05/16 bisect--helper: make `terms` an explicit singletonJohannes Schindelin via GitGitGadget, Aug 30, 2022
  132. Junio C HamanoAug 30, 2022
  133. Junio C HamanoAug 30, 2022
  134. 07/16 bisect--helper: migrate to OPT_SUBCOMMAND()Johannes Schindelin via GitGitGadget, Aug 30, 2022
  135. 08/16 bisect: verify that a bogus option won't try to start a bisectionJohannes Schindelin via GitGitGadget, Aug 30, 2022
  136. 09/16 bisect run: fix the error messageJohannes Schindelin via GitGitGadget, Aug 30, 2022
  137. 10/16 bisect: avoid double-quoting when printing the failed commandJohannes Schindelin via GitGitGadget, Aug 30, 2022
  138. 11/16 bisect--helper: calling `bisect_state()` without an argument is a bugJohannes Schindelin via GitGitGadget, Aug 30, 2022
  139. 12/16 bisect--helper: make `state` optionalJohannes Schindelin via GitGitGadget, Aug 30, 2022
  140. 13/16 bisect: move even the command-line parsing to `bisect--helper`Johannes Schindelin via GitGitGadget, Aug 30, 2022
  141. 14/16 Turn `git bisect` into a full built-inJohannes Schindelin via GitGitGadget, Aug 30, 2022
  142. 15/16 bisect: remove Cogito-related codeJohannes Schindelin via GitGitGadget, Aug 30, 2022
  143. 16/16 bisect: no longer try to clean up left-over `.git/head-name` filesJohannes Schindelin via GitGitGadget, Aug 30, 2022
  144. Junio C HamanoSep 13, 2022
  145. Fwd: [PATCH 00/11] Finish converting git bisect into a built-inMiriam R., Jan 28, 2022
  146. Johannes SchindelinJan 28, 2022
  147. Miriam R.Jan 28, 2022

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.