From: "Johannes Schindelin via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: "Pranit Bauva" <pranit.bauva@gmail.com>,
"Tanushree Tumane" <tanushreetumane@gmail.com>,
"Miriam Rubio" <mirucam@gmail.com>,
"Ævar Arnfjörð Bjarmason" <avarab@gmail.com>,
"Elijah Newren" <newren@gmail.com>,
"Bagas Sanjaya" <bagasdotme@gmail.com>,
"Junio C Hamano" <gitster@pobox.com>,
"Johannes Schindelin" <johannes.schindelin@gmx.de>
Subject: [PATCH v5 00/16] Finish converting git bisect into a built-in
Date: Sat, 27 Aug 2022 12:44:08 +0000 [thread overview]
Message-ID: <pull.1132.v5.git.1661604264.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.1132.v4.git.1656354677.gitgitgadget@gmail.com>
After three GSoC/Outreachy students spent an incredible effort on this, it
is finally time to put a neat little bow on it, or maybe more like a big
bow, maybe even a very large one, seeing as it takes quite a while to tie
(half a year at the time of writing)...
Changes since v4:
* rebased onto sg/parse-options-subcommand
* migrated to OPT_SUBCOMMAND().
* As a consequence, this patch series is now unfortunately very large. And
the range-diff is much less useful than I'd like because of the extensive
changes that were de facto made a precondition to moving this patch
series further. Junio, I would have liked to keep the scope (and burden
for the reviewers) substantially smaller, maybe you can help with the
review?
Changes since v3:
* Rebased because of merge conflicts with ab/plug-leak-in-revisions.
* Fixed the bug that git bisect --bisect-terms 1 2 wanted to auto-start a
bisection if running with a git executable built at the in-between state
at patch "bisect: move even the command-line parsing to bisect--helper".
Since this bug was "fixed" in v3 by the very next patch, "bisect: teach
the bisect--helper command to show the correct usage strings", v4 avoids
introducing this bug simply by letting these two patches trade places.
The range-diff admittedly looks quite awful because both patches overlap
quite a bit in the lines they modify. The end result is the same, though,
the diff between v3's and v4's builtin/bisect.c would be empty if I
hadn't been forced to rebase.
* Added a test case to ensure that this bug won't be introduced again. This
test case is the only actual difference relative to v3 of this patch
series.
Changes since v2:
* We're now careful to provide identical usage strings upon git bisect -h
and git bisect bogus.
* When a bogus command is provided, we now error out instead of trying to
start a git bisect run.
* Rebased onto main to avoid plenty of merge conflicts with
rs/bisect-executable-not-found, ac/usage-string-fixups and with
cd/bisect-messages-from-pre-flight-states.
Changes since v1:
* Added a regression test to "bisect run: fix the error message".
* Added a patch to address an error message that double-single-quoted the
command.
* Reworked the logic in "bisect--helper: make --bisect-state optional" to
delay showing the usage upon an unknown command, which should make the
code a lot less confusing.
* Split out the change that moved the BISECT_STATE case to the end of the
switch block.
* Added a patch that replaces the return error() calls in
cmd_bisect_helper() with die() calls, to avoid returning -1 as an exit
code.
* Dropped the use of parse_options() for the single purpose of handling -h;
This is now done explicitly.
* Simplified the diff of "bisect: move even the option parsing to
bisect--helper" by modifying argc and argv instead of modifying all the
function calls using those variables.
* In the "Turn git bisect into a full built-in" patch, changed the name of
the variable holding the usage to use the builtin_ prefix used in other
built-ins, too.
* Removed the trailing dot from the commit message of "Turn git bisect into
a full built-in".
Johannes Schindelin (16):
bisect--helper: retire the --no-log option
bisect--helper: really retire --bisect-next-check
bisect--helper: really retire `--bisect-autostart`
bisect--helper: simplify exit code computation
bisect--helper: make `terms` an explicit singleton
bisect--helper: make the order consistently `argc, argv`
bisect--helper: migrate to OPT_SUBCOMMAND()
bisect: verify that a bogus option won't try to start a bisection
bisect run: fix the error message
bisect: avoid double-quoting when printing the failed command
bisect--helper: calling `bisect_state()` without an argument is a bug
bisect--helper: make `state` optional
bisect: move even the command-line parsing to `bisect--helper`
Turn `git bisect` into a full built-in
bisect: remove Cogito-related code
bisect: no longer try to clean up left-over `.git/head-name` files
Makefile | 3 +-
bisect.c | 3 -
builtin.h | 2 +-
builtin/{bisect--helper.c => bisect.c} | 679 ++++++++++++++-----------
git-bisect.sh | 84 ---
git.c | 2 +-
t/t6030-bisect-porcelain.sh | 21 +-
7 files changed, 406 insertions(+), 388 deletions(-)
rename builtin/{bisect--helper.c => bisect.c} (67%)
delete mode 100755 git-bisect.sh
base-commit: 8f9d80f6c06369b563c76ec46c462e740a1a2cf0
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1132%2Fdscho%2Fbisect-in-c-v5
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1132/dscho/bisect-in-c-v5
Pull-Request: https://github.com/gitgitgadget/git/pull/1132
Range-diff vs v4:
4: 5bfaf0334c3 = 1: 05262b6a7d1 bisect--helper: retire the --no-log option
5: e85f236304b = 2: 1e43148864a bisect--helper: really retire --bisect-next-check
6: b94b7bb4fd0 = 3: 1a1649d9d0d bisect--helper: really retire `--bisect-autostart`
-: ----------- > 4: 9ab30552c6a bisect--helper: simplify exit code computation
-: ----------- > 5: 92b3b116ef8 bisect--helper: make `terms` an explicit singleton
11: ce508583e45 ! 6: c9dc0281e38 bisect--helper: return only correct exit codes in `cmd_*()`
@@ Metadata
Author: Johannes Schindelin <Johannes.Schindelin@gmx.de>
## Commit message ##
- bisect--helper: return only correct exit codes in `cmd_*()`
+ bisect--helper: make the order consistently `argc, argv`
- Exit codes cannot be negative, but `error()` returns -1.
+ In C, the natural order is for `argc` to come before `argv` by virtue of
+ the `main()` function declaring the parameters in precisely that order.
- Let's just go with the common pattern and call `die()` in
- `cmd_bisect__helper()` when incorrect arguments were detected.
+ It is confusing & distracting, then, when readers familiar with the C
+ language read code where that order is switched around.
+
+ Let's just change the order and avoid that type of developer friction.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
## builtin/bisect--helper.c ##
+@@ builtin/bisect--helper.c: static enum bisect_error bisect_auto_next(const char *prefix)
+ return bisect_next(prefix);
+ }
+
+-static enum bisect_error bisect_start(const char **argv, int argc)
++static enum bisect_error bisect_start(int argc, const char **argv)
+ {
+ int no_checkout = 0;
+ int first_parent_only = 0;
+@@ builtin/bisect--helper.c: static int bisect_autostart(void)
+ yesno = git_prompt(_("Do you want me to do it for you "
+ "[Y/n]? "), PROMPT_ECHO);
+ res = tolower(*yesno) == 'n' ?
+- -1 : bisect_start(empty_strvec, 0);
++ -1 : bisect_start(0, empty_strvec);
+
+ return res;
+ }
+
+-static enum bisect_error bisect_state(const char **argv,
+- int argc)
++static enum bisect_error bisect_state(int argc, const char **argv)
+ {
+ const char *state;
+ int i, verify_expected = 1;
+@@ builtin/bisect--helper.c: static int process_replay_line(struct strbuf *line)
+ struct strvec argv = STRVEC_INIT;
+ int res;
+ sq_dequote_to_strvec(rev, &argv);
+- res = bisect_start(argv.v, argv.nr);
++ res = bisect_start(argv.nr, argv.v);
+ strvec_clear(&argv);
+ return res;
+ }
+@@ builtin/bisect--helper.c: static enum bisect_error bisect_replay(const char *filename)
+ return bisect_auto_next(NULL);
+ }
+
+-static enum bisect_error bisect_skip(const char **argv, int argc)
++static enum bisect_error bisect_skip(int argc, const char **argv)
+ {
+ int i;
+ enum bisect_error res;
+@@ builtin/bisect--helper.c: static enum bisect_error bisect_skip(const char **argv, int argc)
+ strvec_push(&argv_state, argv[i]);
+ }
+ }
+- res = bisect_state(argv_state.v, argv_state.nr);
++ res = bisect_state(argv_state.nr, argv_state.v);
+
+ strvec_clear(&argv_state);
+ return res;
+ }
+
+-static int bisect_visualize(const char **argv, int argc)
++static int bisect_visualize(int argc, const char **argv)
+ {
+ struct strvec args = STRVEC_INIT;
+ int flags = RUN_COMMAND_NO_STDIN, res = 0;
+@@ builtin/bisect--helper.c: static int verify_good(const char **quoted_argv)
+ return rc;
+ }
+
+-static int bisect_run(const char **argv, int argc)
++static int bisect_run(int argc, const char **argv)
+ {
+ int res = BISECT_OK;
+ struct strbuf command = STRBUF_INIT;
+@@ builtin/bisect--helper.c: static int bisect_run(const char **argv, int argc)
+ saved_stdout = dup(1);
+ dup2(temporary_stdout_fd, 1);
+
+- res = bisect_state(&new_state, 1);
++ res = bisect_state(1, &new_state);
+
+ fflush(stdout);
+ dup2(saved_stdout, 1);
@@ builtin/bisect--helper.c: int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
break;
- case BISECT_TERMS:
- if (argc > 1)
-- return error(_("--bisect-terms requires 0 or 1 argument"));
-+ die(_("--bisect-terms requires 0 or 1 argument"));
- res = bisect_terms(&terms, argc == 1 ? argv[0] : NULL);
- break;
- case BISECT_SKIP:
-@@ builtin/bisect--helper.c: int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
+ case BISECT_START:
+ set_terms("bad", "good");
+- res = bisect_start(argv, argc);
++ res = bisect_start(argc, argv);
break;
case BISECT_NEXT:
if (argc)
-- return error(_("--bisect-next requires 0 arguments"));
-+ die(_("--bisect-next requires 0 arguments"));
- get_terms(&terms);
- res = bisect_next(&terms, prefix);
- break;
- case BISECT_RESET:
- if (argc > 1)
-- return error(_("--bisect-reset requires either no argument or a commit"));
-+ die(_("--bisect-reset requires either no argument or a commit"));
- res = bisect_reset(argc ? argv[0] : NULL);
- break;
- case BISECT_VISUALIZE:
@@ builtin/bisect--helper.c: int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
- break;
- case BISECT_REPLAY:
- if (argc != 1)
-- return error(_("no logfile given"));
-+ die(_("no logfile given"));
- set_terms(&terms, "bad", "good");
- res = bisect_replay(&terms, argv[0]);
+ case BISECT_STATE:
+ set_terms("bad", "good");
+ get_terms();
+- res = bisect_state(argv, argc);
++ res = bisect_state(argc, argv);
break;
case BISECT_LOG:
if (argc)
-- return error(_("--bisect-log requires 0 arguments"));
-+ die(_("--bisect-log requires 0 arguments"));
- res = bisect_log();
+@@ builtin/bisect--helper.c: int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
+ case BISECT_SKIP:
+ set_terms("bad", "good");
+ get_terms();
+- res = bisect_skip(argv, argc);
++ res = bisect_skip(argc, argv);
+ break;
+ case BISECT_VISUALIZE:
+ get_terms();
+- res = bisect_visualize(argv, argc);
++ res = bisect_visualize(argc, argv);
break;
case BISECT_RUN:
if (!argc)
-- return error(_("bisect run failed: no command provided."));
-+ die(_("bisect run failed: no command provided."));
- get_terms(&terms);
- res = bisect_run(&terms, argv, argc);
+ return error(_("bisect run failed: no command provided."));
+ get_terms();
+- res = bisect_run(argv, argc);
++ res = bisect_run(argc, argv);
break;
+ default:
+ BUG("unknown subcommand %d", cmdmode);
-: ----------- > 7: 5b7a3d58b4f bisect--helper: migrate to OPT_SUBCOMMAND()
1: 30ddbd7affc = 8: ba537af7066 bisect: verify that a bogus option won't try to start a bisection
2: 97dd2da8f89 ! 9: 409492ad830 bisect run: fix the error message
@@ Commit message
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
## builtin/bisect--helper.c ##
-@@ builtin/bisect--helper.c: static int bisect_run(struct bisect_terms *terms, const char **argv, int argc)
+@@ builtin/bisect--helper.c: static int cmd_bisect_run(int argc, const char **argv, const char *prefix)
printf(_("bisect found first bad commit"));
res = BISECT_OK;
} else if (res) {
3: 5571e0f76ff ! 10: bc5efc8fbfe bisect: avoid double-quoting when printing the failed command
@@ Commit message
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
## builtin/bisect--helper.c ##
-@@ builtin/bisect--helper.c: static int bisect_run(struct bisect_terms *terms, const char **argv, int argc)
+@@ builtin/bisect--helper.c: static int cmd_bisect_run(int argc, const char **argv, const char *prefix)
if (res < 0 || 128 <= res) {
error(_("bisect run failed: exit code %d from"
7: aad3c9a0850 ! 11: 8a0adfe3867 bisect--helper: using `--bisect-state` without an argument is a bug
@@ Metadata
Author: Johannes Schindelin <Johannes.Schindelin@gmx.de>
## Commit message ##
- bisect--helper: using `--bisect-state` without an argument is a bug
+ bisect--helper: calling `bisect_state()` without an argument is a bug
- The `bisect--helper` command is not expected to be used directly by the
- user. Therefore, it is a bug if it receives no argument to the
- `--bisect-state` command mode, not a user error. Which means that we
- need to call `BUG()` instead of `die()`.
+ The `bisect_state()` function is now a purely internal function and must
+ be called with a valid state, everything else is a bug.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
## builtin/bisect--helper.c ##
-@@ builtin/bisect--helper.c: static enum bisect_error bisect_state(struct bisect_terms *terms, const char **a
+@@ builtin/bisect--helper.c: static enum bisect_error bisect_state(int argc, const char **argv,
+ struct strbuf buf = STRBUF_INIT;
struct oid_array revs = OID_ARRAY_INIT;
- if (!argc)
-- return error(_("Please call `--bisect-state` with at least one argument"));
++ if (!argc)
+ BUG("bisect_state() called without argument");
- if (bisect_autostart(terms))
+ if (bisect_autostart(prefix))
return BISECT_FAILED;
8: 375a46dca9f < -: ----------- bisect--helper: align the sub-command order with git-bisect.sh
9: c57f63f6a61 ! 12: 189d2b3ba46 bisect--helper: make `--bisect-state` optional
@@ Metadata
Author: Johannes Schindelin <Johannes.Schindelin@gmx.de>
## Commit message ##
- bisect--helper: make `--bisect-state` optional
+ bisect--helper: make `state` optional
In preparation for making `git bisect` a real built-in, let's prepare
the `bisect--helper` built-in to handle `git bisect--helper good` and
- `git bisect--helper bad`, i.e. do not require the `--bisect-state`
- option to be passed explicitly.
+ `git bisect--helper bad`, i.e. do not require the `state` subcommand to
+ be passed explicitly.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
## builtin/bisect--helper.c ##
-@@ builtin/bisect--helper.c: static const char * const git_bisect_helper_usage[] = {
- N_("git bisect--helper --bisect-start [--term-{new,bad}=<term> --term-{old,good}=<term>]"
- " [--no-checkout] [--first-parent] [<bad> [<good>...]] [--] [<paths>...]"),
- "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-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>)...]"),
- "git bisect--helper --bisect-visualize",
-@@ builtin/bisect--helper.c: int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
- git_bisect_helper_usage,
- PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_UNKNOWN);
+@@ builtin/bisect--helper.c: static int cmd_bisect_run(int argc, const char **argv, const char *prefix)
-- if (!cmdmode)
-- usage_with_options(git_bisect_helper_usage, options);
--
-- switch (cmdmode) {
-+ switch (cmdmode ? cmdmode : BISECT_STATE) {
- case BISECT_START:
- set_terms(&terms, "bad", "good");
- res = bisect_start(&terms, argv, argc);
+ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
+ {
++ struct strvec args = STRVEC_INIT;
+ parse_opt_subcommand_fn *fn = NULL;
+ int res = 0;
+ struct option options[] = {
@@ builtin/bisect--helper.c: int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
- case BISECT_STATE:
- 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);
-+ }
- res = bisect_state(&terms, argv, argc);
- break;
- case BISECT_TERMS:
+ };
+
+ argc = parse_options(argc, argv, prefix, options,
+- bisect_usage, 0);
++ bisect_usage, PARSE_OPT_SUBCOMMAND_OPTIONAL);
++
++ if (!fn) {
++ if (!argc)
++ usage_msg_opt(_("need a command"), bisect_usage,
++ options);
++
++ set_terms("bad", "good");
++ get_terms();
++ if (check_and_set_terms(argv[0]))
++ usage_msg_optf(_("unknown command: '%s'"), bisect_usage,
++ options, argv[0]);
++
++ strvec_push(&args, "state");
++ strvec_pushv(&args, argv);
++ argc = args.nr;
++ argv = args.v;
++ fn = cmd_bisect_state;
++ }
+
+ res = fn(argc, argv, prefix);
+ free_terms();
++ strvec_clear(&args);
+
+ return is_bisect_success(res) ? 0 : -res;
+ }
## git-bisect.sh ##
@@ git-bisect.sh: case "$#" in
start)
- git bisect--helper --bisect-start "$@" ;;
+ git bisect--helper start "$@" ;;
bad|good|new|old|"$TERM_BAD"|"$TERM_GOOD")
-- git bisect--helper --bisect-state "$cmd" "$@" ;;
+- git bisect--helper state "$cmd" "$@" ;;
+ git bisect--helper "$cmd" "$@" ;;
skip)
- git bisect--helper --bisect-skip "$@" || exit;;
+ git bisect--helper skip "$@" || exit;;
next)
10: 87f53469a72 < -: ----------- bisect--helper: move the `BISECT_STATE` case to the end
12: 5dbe233e4ec < -: ----------- bisect: teach the `bisect--helper` command to show the correct usage strings
13: d56f2a14060 ! 13: 32bf74e3050 bisect: move even the command-line parsing to `bisect--helper`
@@ Commit message
On our journey to a fully built-in `git bisect`, this is the
last step.
- Side note: The `parse-options` API is not at all set up to parse
- subcommands such as `git bisect start`, `git bisect reset`, etc.
- Instead of fighting an up-hill battle trying to "fix" that, we simply
- roll the same type of manual subcommand parsing as we already do e.g.
- in `builtin/bundle.c`.
-
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
## builtin/bisect--helper.c ##
-@@ builtin/bisect--helper.c: static const char *bisect_usage =
- N_("git bisect [help|start|bad|good|new|old|terms|skip|next|reset|"
- "visualize|view|replay|log|run]");
-
--static const char * const bisect_long_usage[] = {
-+static const char *bisect_long_usage =
- N_("git bisect [help|start|bad|good|new|old|terms|skip|next|reset|"
- "visualize|view|replay|log|run]\n"
- "\n"
-@@ builtin/bisect--helper.c: static const char * const bisect_long_usage[] = {
- "git bisect run <cmd>...\n"
- "\tuse <cmd>... to automatically bisect.\n"
- "\n"
-- "Please use \"git help bisect\" to get the full man page."),
-- NULL
--};
-+ "Please use \"git help bisect\" to get the full man page.");
-
- struct add_bisect_ref_data {
- struct rev_info *revs;
-@@ builtin/bisect--helper.c: 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";
-+
-+ if (!strcmp("-h", command) || !strcmp("help", command))
-+ usage(bisect_long_usage);
-
-- argc = parse_options(argc, argv, prefix, options,
-- bisect_long_usage,
-- PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_UNKNOWN);
-+ argc -= 2;
-+ argv += 2;
-
-- switch (cmdmode ? cmdmode : BISECT_STATE) {
-- case BISECT_START:
-+ 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:
-- if (argc &&
-- !file_is_not_empty(git_path_bisect_start()) &&
-- !one_of(argv[0], "bad", "good", "new", "old", NULL))
-+ } else {
-+ if (!file_is_not_empty(git_path_bisect_start()) &&
-+ !one_of(command, "bad", "good", "new", "old", NULL))
- usage(bisect_usage);
- set_terms(&terms, "bad", "good");
- get_terms(&terms);
-- if (!cmdmode &&
-- (!argc || check_and_set_terms(&terms, argv[0])))
-+ if (check_and_set_terms(&terms, command))
- usage(bisect_usage);
-+ /* shift the `command` back in */
-+ argc++;
-+ argv--;
- res = bisect_state(&terms, argv, argc);
-- break;
-- default:
-- BUG("unknown subcommand %d", cmdmode);
- }
-+
- free_terms(&terms);
-
- /*
+@@ builtin/bisect--helper.c: int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
+ OPT_SUBCOMMAND("terms", &fn, cmd_bisect_terms),
+ OPT_SUBCOMMAND("start", &fn, cmd_bisect_start),
+ OPT_SUBCOMMAND("next", &fn, cmd_bisect_next),
+- OPT_SUBCOMMAND("state", &fn, cmd_bisect_state),
+ OPT_SUBCOMMAND("log", &fn, cmd_bisect_log),
+ OPT_SUBCOMMAND("replay", &fn, cmd_bisect_replay),
+ OPT_SUBCOMMAND("skip", &fn, cmd_bisect_skip),
## git-bisect.sh ##
@@ git-bisect.sh: Please use "git help bisect" to get the full man page.'
@@ git-bisect.sh: Please use "git help bisect" to get the full man page.'
- help)
- git bisect -h ;;
- start)
-- git bisect--helper --bisect-start "$@" ;;
+- git bisect--helper start "$@" ;;
- bad|good|new|old|"$TERM_BAD"|"$TERM_GOOD")
- git bisect--helper "$cmd" "$@" ;;
- skip)
-- git bisect--helper --bisect-skip "$@" || exit;;
+- git bisect--helper skip "$@" || exit;;
- next)
- # Not sure we want "next" at the UI level anymore.
-- git bisect--helper --bisect-next "$@" || exit ;;
+- git bisect--helper next "$@" || exit ;;
- visualize|view)
-- git bisect--helper --bisect-visualize "$@" || exit;;
+- git bisect--helper visualize "$@" || exit;;
- reset)
-- git bisect--helper --bisect-reset "$@" ;;
+- git bisect--helper reset "$@" ;;
- replay)
-- git bisect--helper --bisect-replay "$@" || exit;;
+- git bisect--helper replay "$@" || exit;;
- log)
-- git bisect--helper --bisect-log || exit ;;
+- git bisect--helper log || exit ;;
- run)
-- git bisect--helper --bisect-run "$@" || exit;;
+- git bisect--helper run "$@" || exit;;
- terms)
-- git bisect--helper --bisect-terms "$@" || exit;;
+- git bisect--helper terms "$@" || exit;;
- *)
- usage ;;
- esac
14: 378d6d22737 ! 14: a8f08f5e0cb Turn `git bisect` into a full built-in
@@ builtin.h: int cmd_am(int argc, const char **argv, const char *prefix);
int cmd_bugreport(int argc, const char **argv, const char *prefix);
## builtin/bisect--helper.c => builtin/bisect.c ##
-@@ builtin/bisect.c: static int bisect_run(struct bisect_terms *terms, const char **argv, int argc)
+@@ builtin/bisect.c: static int cmd_bisect_run(int argc, const char **argv, const char *prefix)
return res;
}
-int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
+int cmd_bisect(int argc, const char **argv, const char *prefix)
{
- int res = 0;
- struct bisect_terms terms = { .term_good = NULL, .term_bad = NULL };
+ struct strvec args = STRVEC_INIT;
+ parse_opt_subcommand_fn *fn = NULL;
## git-bisect.sh (deleted) ##
@@
@@ git-bisect.sh (deleted)
## git.c ##
@@ git.c: static struct cmd_struct commands[] = {
- { "annotate", cmd_annotate, RUN_SETUP | NO_PARSEOPT },
+ { "annotate", cmd_annotate, RUN_SETUP },
{ "apply", cmd_apply, RUN_SETUP_GENTLY },
{ "archive", cmd_archive, RUN_SETUP_GENTLY },
- { "bisect--helper", cmd_bisect__helper, RUN_SETUP },
15: 33566b86d77 ! 15: a96489310d3 bisect: remove Cogito-related code
@@ builtin/bisect.c: static GIT_PATH_FUNC(git_path_bisect_expected_rev, "BISECT_EXP
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")
-@@ builtin/bisect.c: static enum bisect_error bisect_start(struct bisect_terms *terms, const char **a
+@@ builtin/bisect.c: static int cmd_bisect_start(int argc, const char **argv, const char *prefix)
strbuf_addstr(&start_head, oid_to_hex(&head_oid));
} else if (!get_oid(head, &head_oid) &&
skip_prefix(head, "refs/heads/", &head)) {
16: 334664f23a8 = 16: bfa7aa19f03 bisect: no longer try to clean up left-over `.git/head-name` files
--
gitgitgadget
next prev parent reply other threads:[~2022-08-27 12:46 UTC|newest]
Thread overview: 147+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-28 0:12 [PATCH 00/11] Finish converting git bisect into a built-in Johannes Schindelin via GitGitGadget
2022-01-28 0:12 ` [PATCH 01/11] bisect run: fix the error message Johannes Schindelin via GitGitGadget
2022-02-08 22:05 ` Elijah Newren
2022-02-22 14:38 ` Johannes Schindelin
2022-01-28 0:12 ` [PATCH 02/11] bisect--helper: retire the --no-log option Johannes Schindelin via GitGitGadget
2022-01-28 0:12 ` [PATCH 03/11] bisect--helper: really retire --bisect-next-check Johannes Schindelin via GitGitGadget
2022-01-28 0:12 ` [PATCH 04/11] bisect--helper: really retire `--bisect-autostart` Johannes Schindelin via GitGitGadget
2022-01-28 0:12 ` [PATCH 05/11] bisect--helper: align the sub-command order with git-bisect.sh Johannes Schindelin via GitGitGadget
2022-01-28 0:12 ` [PATCH 06/11] bisect--helper: make `--bisect-state` optional Johannes Schindelin via GitGitGadget
2022-02-08 23:03 ` Elijah Newren
2022-02-22 15:12 ` Johannes Schindelin
2022-02-09 19:45 ` Junio C Hamano
2022-02-22 15:53 ` Johannes Schindelin
2022-01-28 0:12 ` [PATCH 07/11] bisect: move even the option parsing to `bisect--helper` Johannes Schindelin via GitGitGadget
2022-01-29 6:47 ` Ævar Arnfjörð Bjarmason
2022-02-09 0:12 ` Elijah Newren
2022-02-22 15:49 ` Johannes Schindelin
2022-01-28 0:12 ` [PATCH 08/11] bisect--helper: using `--bisect-state` without an argument is a bug Johannes Schindelin via GitGitGadget
2022-01-29 7:04 ` Ævar Arnfjörð Bjarmason
2022-02-09 0:26 ` Elijah Newren
2022-01-28 0:12 ` [PATCH 09/11] Turn `git bisect` into a full built-in Johannes Schindelin via GitGitGadget
2022-01-29 7:09 ` Ævar Arnfjörð Bjarmason
2022-01-28 0:12 ` [PATCH 10/11] bisect: remove Cogito-related code Johannes Schindelin via GitGitGadget
2022-01-28 0:12 ` [PATCH 11/11] bisect: no longer try to clean up left-over `.git/head-name` files Johannes Schindelin via GitGitGadget
[not found] ` <CAN7CjDC+O883DB1iaJAXF5ZCis7FP2Z9z0y2qS2-JVAKfQA8aA@mail.gmail.com>
2022-01-28 8:54 ` Fwd: [PATCH 00/11] Finish converting git bisect into a built-in Miriam R.
2022-01-28 12:42 ` Johannes Schindelin
2022-01-28 15:11 ` Miriam R.
2022-01-30 6:39 ` Elijah Newren
2022-02-09 4:41 ` Elijah Newren
2022-02-22 15:55 ` Johannes Schindelin
2022-02-22 16:30 ` [PATCH v2 00/14] " Johannes Schindelin via GitGitGadget
2022-02-22 16:30 ` [PATCH v2 01/14] bisect run: fix the error message Johannes Schindelin via GitGitGadget
2022-02-22 16:30 ` [PATCH v2 02/14] bisect: avoid double-quoting when printing the failed command Johannes Schindelin via GitGitGadget
2022-02-22 16:30 ` [PATCH v2 03/14] bisect--helper: retire the --no-log option Johannes Schindelin via GitGitGadget
2022-02-22 16:30 ` [PATCH v2 04/14] bisect--helper: really retire --bisect-next-check Johannes Schindelin via GitGitGadget
2022-02-22 16:30 ` [PATCH v2 05/14] bisect--helper: really retire `--bisect-autostart` Johannes Schindelin via GitGitGadget
2022-02-22 16:30 ` [PATCH v2 06/14] bisect--helper: using `--bisect-state` without an argument is a bug Johannes Schindelin via GitGitGadget
2022-02-22 16:30 ` [PATCH v2 07/14] bisect--helper: align the sub-command order with git-bisect.sh Johannes Schindelin via GitGitGadget
2022-02-22 16:30 ` [PATCH v2 08/14] bisect--helper: make `--bisect-state` optional Johannes Schindelin via GitGitGadget
2022-02-22 16:30 ` [PATCH v2 09/14] bisect--helper: move the `BISECT_STATE` case to the end Johannes Schindelin via GitGitGadget
2022-02-22 16:30 ` [PATCH v2 10/14] bisect--helper: return only correct exit codes in `cmd_*()` Johannes Schindelin via GitGitGadget
2022-02-22 16:30 ` [PATCH v2 11/14] bisect: move even the option parsing to `bisect--helper` Johannes Schindelin via GitGitGadget
2022-02-23 9:47 ` Ævar Arnfjörð Bjarmason
2022-02-25 15:59 ` Johannes Schindelin
2022-02-25 16:49 ` Ævar Arnfjörð Bjarmason
2022-02-22 16:30 ` [PATCH v2 12/14] Turn `git bisect` into a full built-in Johannes Schindelin via GitGitGadget
2022-02-22 16:30 ` [PATCH v2 13/14] bisect: remove Cogito-related code Johannes Schindelin via GitGitGadget
2022-02-22 16:30 ` [PATCH v2 14/14] bisect: no longer try to clean up left-over `.git/head-name` files Johannes Schindelin via GitGitGadget
2022-02-23 1:41 ` [PATCH v2 00/14] Finish converting git bisect into a built-in Elijah Newren
2022-02-25 15:59 ` Johannes Schindelin
2022-02-23 21:35 ` Junio C Hamano
2022-02-25 16:03 ` Johannes Schindelin
2022-02-25 16:44 ` Ævar Arnfjörð Bjarmason
2022-05-21 14:48 ` [PATCH v3 00/15] " Johannes Schindelin via GitGitGadget
2022-05-21 14:48 ` [PATCH v3 01/15] bisect run: fix the error message Johannes Schindelin via GitGitGadget
2022-05-21 14:48 ` [PATCH v3 02/15] bisect: avoid double-quoting when printing the failed command Johannes Schindelin via GitGitGadget
2022-05-21 14:48 ` [PATCH v3 03/15] bisect--helper: retire the --no-log option Johannes Schindelin via GitGitGadget
2022-05-21 14:48 ` [PATCH v3 04/15] bisect--helper: really retire --bisect-next-check Johannes Schindelin via GitGitGadget
2022-05-21 14:48 ` [PATCH v3 05/15] bisect--helper: really retire `--bisect-autostart` Johannes Schindelin via GitGitGadget
2022-05-21 14:48 ` [PATCH v3 06/15] bisect--helper: using `--bisect-state` without an argument is a bug Johannes Schindelin via GitGitGadget
2022-05-21 14:48 ` [PATCH v3 07/15] bisect--helper: align the sub-command order with git-bisect.sh Johannes Schindelin via GitGitGadget
2022-05-21 14:48 ` [PATCH v3 08/15] bisect--helper: make `--bisect-state` optional Johannes Schindelin via GitGitGadget
2022-05-21 14:49 ` [PATCH v3 09/15] bisect--helper: move the `BISECT_STATE` case to the end Johannes Schindelin via GitGitGadget
2022-05-21 14:49 ` [PATCH v3 10/15] bisect--helper: return only correct exit codes in `cmd_*()` Johannes Schindelin via GitGitGadget
2022-05-21 16:45 ` Ævar Arnfjörð Bjarmason
2022-05-21 14:49 ` [PATCH v3 11/15] bisect: move even the command-line parsing to `bisect--helper` Johannes Schindelin via GitGitGadget
2022-05-21 16:52 ` Ævar Arnfjörð Bjarmason
2022-05-21 14:49 ` [PATCH v3 12/15] bisect: teach the `bisect--helper` command to show the correct usage strings Johannes Schindelin via GitGitGadget
2022-05-21 14:49 ` [PATCH v3 13/15] Turn `git bisect` into a full built-in Johannes Schindelin via GitGitGadget
2022-05-21 14:49 ` [PATCH v3 14/15] bisect: remove Cogito-related code Johannes Schindelin via GitGitGadget
2022-05-21 14:49 ` [PATCH v3 15/15] bisect: no longer try to clean up left-over `.git/head-name` files Johannes Schindelin via GitGitGadget
2022-05-22 3:07 ` [PATCH v3 00/15] Finish converting git bisect into a built-in Bagas Sanjaya
2022-05-23 10:22 ` Ævar Arnfjörð Bjarmason
2022-06-27 18:31 ` [PATCH v4 00/16] " Johannes Schindelin via GitGitGadget
2022-06-27 18:31 ` [PATCH v4 01/16] bisect: verify that a bogus option won't try to start a bisection Johannes Schindelin via GitGitGadget
2022-06-28 2:12 ` Junio C Hamano
2022-06-27 18:31 ` [PATCH v4 02/16] bisect run: fix the error message Johannes Schindelin via GitGitGadget
2022-06-27 18:31 ` [PATCH v4 03/16] bisect: avoid double-quoting when printing the failed command Johannes Schindelin via GitGitGadget
2022-06-27 18:31 ` [PATCH v4 04/16] bisect--helper: retire the --no-log option Johannes Schindelin via GitGitGadget
2022-06-27 18:31 ` [PATCH v4 05/16] bisect--helper: really retire --bisect-next-check Johannes Schindelin via GitGitGadget
2022-06-27 18:31 ` [PATCH v4 06/16] bisect--helper: really retire `--bisect-autostart` Johannes Schindelin via GitGitGadget
2022-06-27 18:31 ` [PATCH v4 07/16] bisect--helper: using `--bisect-state` without an argument is a bug Johannes Schindelin via GitGitGadget
2022-06-27 18:31 ` [PATCH v4 08/16] bisect--helper: align the sub-command order with git-bisect.sh Johannes Schindelin via GitGitGadget
2022-06-27 18:31 ` [PATCH v4 09/16] bisect--helper: make `--bisect-state` optional Johannes Schindelin via GitGitGadget
2022-06-27 18:31 ` [PATCH v4 10/16] bisect--helper: move the `BISECT_STATE` case to the end Johannes Schindelin via GitGitGadget
2022-06-27 18:31 ` [PATCH v4 11/16] bisect--helper: return only correct exit codes in `cmd_*()` Johannes Schindelin via GitGitGadget
2022-06-27 20:09 ` Ævar Arnfjörð Bjarmason
2022-06-27 18:31 ` [PATCH v4 12/16] bisect: teach the `bisect--helper` command to show the correct usage strings Johannes Schindelin via GitGitGadget
2022-06-27 22:11 ` Junio C Hamano
2022-06-27 18:31 ` [PATCH v4 13/16] bisect: move even the command-line parsing to `bisect--helper` Johannes Schindelin via GitGitGadget
2022-06-27 18:31 ` [PATCH v4 14/16] Turn `git bisect` into a full built-in Johannes Schindelin via GitGitGadget
2022-06-27 22:13 ` Junio C Hamano
2022-06-27 18:31 ` [PATCH v4 15/16] bisect: remove Cogito-related code Johannes Schindelin via GitGitGadget
2022-06-27 22:18 ` Junio C Hamano
2022-06-27 18:31 ` [PATCH v4 16/16] bisect: no longer try to clean up left-over `.git/head-name` files Johannes Schindelin via GitGitGadget
2022-06-27 19:45 ` [PATCH v4 00/16] Finish converting git bisect into a built-in Ævar Arnfjörð Bjarmason
2022-08-27 12:44 ` Johannes Schindelin via GitGitGadget [this message]
2022-08-27 12:44 ` [PATCH v5 01/16] bisect--helper: retire the --no-log option Johannes Schindelin via GitGitGadget
2022-08-27 12:44 ` [PATCH v5 02/16] bisect--helper: really retire --bisect-next-check Johannes Schindelin via GitGitGadget
2022-08-27 12:44 ` [PATCH v5 03/16] bisect--helper: really retire `--bisect-autostart` Johannes Schindelin via GitGitGadget
2022-08-27 12:44 ` [PATCH v5 04/16] bisect--helper: simplify exit code computation Johannes Schindelin via GitGitGadget
2022-08-28 6:43 ` Junio C Hamano
2022-08-27 12:44 ` [PATCH v5 05/16] bisect--helper: make `terms` an explicit singleton Johannes Schindelin via GitGitGadget
2022-08-28 6:53 ` Junio C Hamano
2022-08-29 12:13 ` Johannes Schindelin
2022-08-29 17:04 ` Junio C Hamano
2022-08-29 10:20 ` Ævar Arnfjörð Bjarmason
2022-08-29 12:30 ` Johannes Schindelin
2022-08-29 17:47 ` Junio C Hamano
2022-08-27 12:44 ` [PATCH v5 06/16] bisect--helper: make the order consistently `argc, argv` Johannes Schindelin via GitGitGadget
2022-08-28 6:53 ` Junio C Hamano
2022-08-27 12:44 ` [PATCH v5 07/16] bisect--helper: migrate to OPT_SUBCOMMAND() Johannes Schindelin via GitGitGadget
2022-08-29 9:38 ` Ævar Arnfjörð Bjarmason
2022-08-30 15:42 ` Johannes Schindelin
2022-08-27 12:44 ` [PATCH v5 08/16] bisect: verify that a bogus option won't try to start a bisection Johannes Schindelin via GitGitGadget
2022-08-27 12:44 ` [PATCH v5 09/16] bisect run: fix the error message Johannes Schindelin via GitGitGadget
2022-08-28 7:03 ` Junio C Hamano
2022-08-29 12:20 ` Johannes Schindelin
2022-08-27 12:44 ` [PATCH v5 10/16] bisect: avoid double-quoting when printing the failed command Johannes Schindelin via GitGitGadget
2022-08-27 12:44 ` [PATCH v5 11/16] bisect--helper: calling `bisect_state()` without an argument is a bug Johannes Schindelin via GitGitGadget
2022-08-29 10:11 ` Ævar Arnfjörð Bjarmason
2022-08-30 14:47 ` Johannes Schindelin
2022-08-27 12:44 ` [PATCH v5 12/16] bisect--helper: make `state` optional Johannes Schindelin via GitGitGadget
2022-08-27 12:44 ` [PATCH v5 13/16] bisect: move even the command-line parsing to `bisect--helper` Johannes Schindelin via GitGitGadget
2022-08-27 12:44 ` [PATCH v5 14/16] Turn `git bisect` into a full built-in Johannes Schindelin via GitGitGadget
2022-08-27 12:44 ` [PATCH v5 15/16] bisect: remove Cogito-related code Johannes Schindelin via GitGitGadget
2022-08-27 12:44 ` [PATCH v5 16/16] bisect: no longer try to clean up left-over `.git/head-name` files Johannes Schindelin via GitGitGadget
2022-08-30 18:50 ` [PATCH v6 00/16] Finish converting git bisect into a built-in Johannes Schindelin via GitGitGadget
2022-08-30 18:50 ` [PATCH v6 01/16] bisect--helper: retire the --no-log option Johannes Schindelin via GitGitGadget
2022-08-30 18:50 ` [PATCH v6 02/16] bisect--helper: really retire --bisect-next-check Johannes Schindelin via GitGitGadget
2022-08-30 18:50 ` [PATCH v6 03/16] bisect--helper: really retire `--bisect-autostart` Johannes Schindelin via GitGitGadget
2022-08-30 18:50 ` [PATCH v6 04/16] bisect--helper: simplify exit code computation Johannes Schindelin via GitGitGadget
2022-08-30 18:50 ` [PATCH v6 05/16] bisect--helper: make `terms` an explicit singleton Johannes Schindelin via GitGitGadget
2022-08-30 21:11 ` Junio C Hamano
2022-08-30 21:28 ` Junio C Hamano
2022-08-30 18:50 ` [PATCH v6 06/16] bisect--helper: make the order consistently `argc, argv` Johannes Schindelin via GitGitGadget
2022-08-30 18:50 ` [PATCH v6 07/16] bisect--helper: migrate to OPT_SUBCOMMAND() Johannes Schindelin via GitGitGadget
2022-08-30 18:50 ` [PATCH v6 08/16] bisect: verify that a bogus option won't try to start a bisection Johannes Schindelin via GitGitGadget
2022-08-30 18:50 ` [PATCH v6 09/16] bisect run: fix the error message Johannes Schindelin via GitGitGadget
2022-08-30 18:50 ` [PATCH v6 10/16] bisect: avoid double-quoting when printing the failed command Johannes Schindelin via GitGitGadget
2022-08-30 18:50 ` [PATCH v6 11/16] bisect--helper: calling `bisect_state()` without an argument is a bug Johannes Schindelin via GitGitGadget
2022-08-30 18:50 ` [PATCH v6 12/16] bisect--helper: make `state` optional Johannes Schindelin via GitGitGadget
2022-08-30 18:50 ` [PATCH v6 13/16] bisect: move even the command-line parsing to `bisect--helper` Johannes Schindelin via GitGitGadget
2022-08-30 18:50 ` [PATCH v6 14/16] Turn `git bisect` into a full built-in Johannes Schindelin via GitGitGadget
2022-08-30 18:50 ` [PATCH v6 15/16] bisect: remove Cogito-related code Johannes Schindelin via GitGitGadget
2022-08-30 18:50 ` [PATCH v6 16/16] bisect: no longer try to clean up left-over `.git/head-name` files Johannes Schindelin via GitGitGadget
2022-09-13 17:44 ` [PATCH v6 00/16] Finish converting git bisect into a built-in 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
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.1132.v5.git.1661604264.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=avarab@gmail.com \
--cc=bagasdotme@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=johannes.schindelin@gmx.de \
--cc=mirucam@gmail.com \
--cc=newren@gmail.com \
--cc=pranit.bauva@gmail.com \
--cc=tanushreetumane@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.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
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 read-only IMAP folder(s) and NNTP newsgroup(s).