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

Re: [PATCH RFC] rebase: respect --ff-only option

From
Alex Henrie <alexhenrie24@gmail.com>
Date
Jul 5, 2021, 19:48 UTC
Message-ID
<CAMMLpeQG-eYgWTXyG0YzgN3U8QDASAtNFpxyXDFFPSVNzfw18g@mail.gmail.com>
In-Reply-To
<xmqqlf6kmup4.fsf@gitster.g>
On Mon, Jul 5, 2021 at 2:53 AM Phillip Wood <phillip.wood123@gmail.com> wrote:
Show 22 quoted lines
>
> On 05/07/2021 05:45, Alex Henrie wrote:
> > index 12f093121d..b88f0cbcca 100644
> > --- a/builtin/rebase.c
> > +++ b/builtin/rebase.c
> > @@ -1345,12 +1349,14 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
> >                        N_("ignore changes in whitespace")),
> >               OPT_PASSTHRU_ARGV(0, "whitespace", &options.git_am_opts,
> >                                 N_("action"), N_("passed to 'git apply'"), 0),
> > -             OPT_BIT('f', "force-rebase", &options.flags,
> > -                     N_("cherry-pick all commits, even if unchanged"),
> > -                     REBASE_FORCE),
> > -             OPT_BIT(0, "no-ff", &options.flags,
> > -                     N_("cherry-pick all commits, even if unchanged"),
> > -                     REBASE_FORCE),
> > +             OPT_SET_INT_F('f', "force-rebase", &options.fast_forward,
> > +                           N_("cherry-pick all commits, even if unchanged"),
> > +                           FF_NO, PARSE_OPT_NONEG),
>
> Why does this change rebase to start rejecting --no-force-rebase? This
> is the sort of behavior change that deserves a mention in the commit
> message.

That was accidental, sorry. I copied and pasted option code from another place without paying attention to the PARSE_OPT_NONEG.

Show 5 quoted lines
> > +             OPT_SET_INT(0, "ff", &options.fast_forward, N_("allow fast-forward"),
> > +                         FF_ALLOW),
>
> The useful option when rebasing is '--no-ff', now that will no longer
> appear in the output of 'git rebase -h'
Yeah, that's a good point.
On Mon, Jul 5, 2021 at 3:36 AM Ævar Arnfjörð Bjarmason <avarab@gmail.com> wrote:
Show 10 quoted lines
>
> On Sun, Jul 04 2021, Alex Henrie wrote:
>
> > +int error_ff_impossible(void)
> > +{
> > +     error(_("Not possible to fast-forward, aborting."));
> > +     return -1;
> > +}
>
> Here's one, the idiom is just "return error", i.e it itself returns -1.
That would indeed be simpler; thanks for pointing that out.
Show 10 quoted lines
> FWIW I'd consider doing:
>
>         /* earlier, static scope */
>         static const char error_ff_impossible = N_("Not possible...");
>         /* later, function scope */
>             return error(error_ff_impossible);
>
> It's a small difference, but for translators who use the jump-to-source
> while translating not having the indirection helps, and in this case
> it's just used 3 times...

Wouldn't jump-to-source take the user to the English text in advice.c either way? How does putting it in a static variable help?

Show 11 quoted lines
> > [...]
> >       if (parent && parse_commit(parent) < 0)
> >               /* TRANSLATORS: The first %s will be a "todo" command like
> > @@ -2764,7 +2769,7 @@ static int populate_opts_cb(const char *key, const char *value, void *data)
> >       else if (!strcmp(key, "options.record-origin"))
> >               opts->record_origin = git_config_bool_or_int(key, value, &error_flag);
> >       else if (!strcmp(key, "options.allow-ff"))
> > -             opts->allow_ff = git_config_bool_or_int(key, value, &error_flag);
> > +             opts->fast_forward = git_config_bool_or_int(key, value, &error_flag) ? FF_ALLOW : FF_NO;
>
> Since we're on nits, we try to wrap at 80 characters.
Thanks, I didn't know what the exact cutoff was.
Show 8 quoted lines
> > +test_expect_success "rebase: impossible fast-forward rebase" '
> > +     test_config rebase.autostash true &&
> > +     git reset --hard &&
> > +     echo dirty >>file1 &&
> > +     (git rebase --ff-only unrelated-onto-branch || true) &&
>
> Never "||" git commands, better as test_might_fail. We don't want to
> hide segfaults.
Also thanks for the advice here.
On Mon, Jul 5, 2021 at 10:50 AM Junio C Hamano <gitster@pobox.com> wrote:
Show 16 quoted lines
>
> Phillip Wood <phillip.wood123@gmail.com> writes:
>
> > Looking at origin/seen:builtin/pull.c we already check if we can
> > fast-forward and unconditionally merge in that case irrespective of
> > any '--rebase' option or pull.rebase config. It should be simple for
> > pull to error out if '--ff-only' is given and we cannot fast-forward.
>
> Excellent.
>
> Even though teaching even more special case on the "git pull" side
> makes me feel somewhat dirty, but I think it would be a small price
> to pay, and the end result would save an useless fork whose sole
> purpose is to make the integration step after fetch fail when "pull"
> can easily tell, as you said, that it ought to fail, so overall it
> would probably be a net win.

Okay, so it sounds like I should just scrap this patch and try again, after "pull: cleanup autostash check" is in master, with a patch that only modifies `git pull` and not `git rebase`. (Unless someone more experienced wants to take over, which would be fine by me.)

Thanks anyway to Phillip and Ævar: Your feedback will help me write better patches in the future.

-Alex
Previous: Junio C HamanoNext: Ævar Arnfjörð Bjarmason
Message 10 of 15 in “rebase: respect --ff-only option”
  1. rebase: respect --ff-only optionAlex Henrie, Jul 5, 2021
  2. Phillip WoodJul 5, 2021
  3. Junio C HamanoJul 5, 2021
  4. Felipe ContrerasJul 5, 2021
  5. Phillip WoodJul 5, 2021
  6. Felipe ContrerasJul 7, 2021
  7. Phillip WoodJul 5, 2021
  8. Junio C HamanoJul 5, 2021
  9. Junio C HamanoJul 5, 2021
  10. Alex HenrieJul 5, 2021
  11. Ævar Arnfjörð BjarmasonJul 6, 2021
  12. Phillip WoodJul 6, 2021
  13. Felipe ContrerasJul 7, 2021
  14. Ævar Arnfjörð BjarmasonJul 5, 2021
  15. Felipe ContrerasJul 5, 2021

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.