Re: [PATCH v6 2/2] bisect: add --reset-when-found to leave when done

Harald Nordgren <[email protected]> Thu, 6 Aug 2026 09:30:57 +0200
Newsgroups org.kernel.vger.git
Message-ID <CAHwyqnXOno2De_eOvH=LizyfWSpyVWpzGBwV4ZGW4bxOEtETOg@mail.gmail.com>
> > @@ -682,7 +761,8 @@ 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)
> >  {
> >       enum bisect_error res;
> >
> > @@ -705,7 +785,8 @@ 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)
> >  {
> >       if (bisect_next_check(terms, NULL)) {
> >               bisect_print_status(terms);
>
> The above two hunks are pure style clean-ups.  When having others to
> review a 500+ line patch, you would want to omit them or move them
> to a separate preliminary clean-up step, to avoid distracting them.

I'll remove.

> >  static int cmd_bisect__terms(int argc, const char **argv, const char *prefix UNUSED,
> > @@ -1489,7 +1614,8 @@ 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);
> > +             else
> > +                     res = bisect_state(&terms, argc, argv);
> >               free_terms(&terms);
> >       } else {
> >               argc--;
>
> What is this change about?  We used to see if the given terms
> (bad/good) are sensible and otherwise barfed with usage_msg_optf()
> that never returns, so we did without "else".  With "else" you are
> making it more explicit.  The value of such a change is debatable.
> Some would say that, just like 'if ... die()', it is already
> explicit enough that 'if ... usage()' never returns and does not
> require an "else".  Some would say new readers may not know die()
> and usage() do not return, so "else" makes it more explicit.  My
> stance is that we should not optimize our code for total newbies
> [*], so I may have a mild preference for the original over the
> updated version, but it is minor.  In other words, I would not mind
> if an author wrote this either way in new code.
>
> However.
>
> If an author is adding a new feature, I would recommend against
> making such a change that would only force reviewers to read more
> and think more about the change.  Do not waste reviewers' attention,
> which is a precious resource, to something much less relevant for
> the goal of your topic.

Good points.

> > @@ -1497,5 +1623,15 @@ 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;
> > +     }
>
> Are there "dead end" states, other than '1st-bad-found', in which we
> can no longer make any progress?  One thing that comes to mind is
> "you said this one is good, but that contradicts what you said about
> its ancestor that you said is bad".  I wonder if we want to do
> anything special here, just as this part of the code handles the
> '1st-bad-found' state, for such "dead end" states.

Maybe, but I'm not sure this topic is the right place to dig into this?


Harald