Re: [PATCH v4 5/9] rebase: add coverage of other incompatible options

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Elijah

On 24/01/2023 15:41, Elijah Newren wrote:
Ah, despite looking over the code multiple times to check my
statements, I somehow kept missing this:

     if (keep_base && options.reapply_cherry_picks)
         options.upstream = options.onto;

which is how --[no-]reapply-cherry-picks is supported in conjunction
with --keep-base.  Thanks.

For all four cases (A)-(D), the apply backend will ignore whatever
--[no-]reapply-cherry-picks flag is provided.

For (D) the flag is respected, (C) errors out, the other cases
correspond to the default so it's like saying

      git rebase --merge --no-reapply-cherry-picks

ignores the flag.

On reflection that is only true for (B). I agree that we should error
out on (A) which we don't at the moment.

I'd support a change that errors out on (A) and (C) but continues to
allow (B) and (D). I think we can do that with the diff below


diff --git a/builtin/rebase.c b/builtin/rebase.c
index 1481c5b6a5..66aef356b8 100644
--- a/builtin/rebase.c
+++ b/builtin/rebase.c
@@ -1230,12 +1230,6 @@ int cmd_rebase(int argc, const char **argv, const
char *prefix)
                   if (options.fork_point < 0)
                           options.fork_point = 0;
           }
-        /*
-         * --keep-base defaults to --reapply-cherry-picks to avoid losing
-         * commits when using this option.
-         */
-        if (options.reapply_cherry_picks < 0)
-                options.reapply_cherry_picks = keep_base;

           if (options.root && options.fork_point > 0)
                   die(_("options '%s' and '%s' cannot be used
together"), "--root", "--fork-point");
@@ -1412,11 +1406,17 @@ int cmd_rebase(int argc, const char **argv,
const char *prefix)
           if (options.empty != EMPTY_UNSPECIFIED)
                   imply_merge(&options, "--empty");

-        /*
-         * --keep-base implements --reapply-cherry-picks by altering
upstream so
-         * it works with both backends.
-         */
-        if (options.reapply_cherry_picks && !keep_base)
+        if (options.reapply_cherry_picks < 0)
+                /*
+                 * --keep-base defaults to --reapply-cherry-picks to
+                 * avoid losing commits when using this option.
+                 */

I know you were copying the previous comment, but this comment is
really confusing to me.  Shouldn't it read "--reapply-cherry-picks
defaults to --keep-base" instead of vice-versa?

Clearly this comment has not been as helpful as I indented it to be. I think maybe we should spell out the defaults with and without --keep-base. Perhaps something like

default to --no-reapply-cherry-picks unless --keep-base is given in which case default to --reapply-cherry-picks


+                options.reapply_cherry_picks = keep_base;
+        else if (!keep_base)
+                /*
+                 * --keep-base implements --reapply-cherry-picks by

Should this be --[no-]reapply-cherry-picks, to clarify that it handles
both cases?  Especially given how many times I missed it?

This has obviously proved to be confusing. The aim was to explain that in order to work with the apply backend "[--reapply-cherry-picks] --keep-base" was doing something unusual with `upstream` to reapply cherry picks. "--no-reapply-cherry-picks --keep-base" does not do anything unusual with `upstream`. I don't think changing it to --[no-]reapply-cherry-picks quite captures that. I came up with

To support --reapply-cherry-picks (which is not supported by the apply backend) --keep-base alters upstream to prevent cherry picked commits from being dropped.

but it really needs to mention that --keep-base also supports --no-reapply-cherry-picks in the usual way

+                 * altering upstream so it works with both backends.
+                 */
                   imply_merge(&options, "--reapply-cherry-picks");

And perhaps this should be

     imply_merge(&options, options.reapply_cherry_picks ?
"--reapply-cherry-picks" :
          "--no-reapply-cherry-picks");

That's a good idea

Also, the comment in git-rebase.txt about incompatibilities would become

      * --[no-]reapply-cherry-picks, when --keep-base is not provided

Yes, that's good

Thanks again for working on this

Phillip



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux