]> git.ipfire.org Git - thirdparty/git.git/commitdiff
replay: remove dead code and rearrange
authorKristoffer Haugsbakk <code@khaugsbakk.name>
Mon, 5 Jan 2026 19:53:17 +0000 (20:53 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 5 Jan 2026 22:30:15 +0000 (07:30 +0900)
22d99f01 (replay: add --advance or 'cherry-pick' mode, 2023-11-24) both
added `--advance` and made one of `--onto` or `--advance` mandatory.
But `determine_replay_mode` claims that there is a third alternative;
neither of `--onto` or `--advance` were given:

    if (onto_name) {
    ...
    } else if (*advance_name) {
    ...
    } else {
    ...
    }

But this is false—the fallthrough else-block is dead code.

Commit 22d99f01 was iterated upon by several people.[1] The initial
author wrote code for a sort of *guess mode*, allowing for shorter
commands when that was possible. But the next person instead made one
of the aforementioned options mandatory. In turn this code was dead on
arrival in git.git.

[1]: https://lore.kernel.org/git/CABPp-BEcJqjD4ztsZo2FTZgWT5ZOADKYEyiZtda+d0mSd1quPQ@mail.gmail.com/

Let’s remove this code. We can also join the if-block with the
condition `!*advance_name` into the `*onto` block since we do not set
`*advance_name` in this function. It only looked like we might set it
since the dead code has this line:

    *advance_name = xstrdup_or_null(last_key);

Let’s also rename the function since we do not determine the
replay mode here. We just set up `*onto` and refs to update.

Note that there might be more dead code caused by this *guess mode*.
We only concern ourselves with this function for now.

Helped-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/replay.c

index 69c4c551297c03dcd32adac016e57f874e354d28..524bf96ffd6c9d59f2545114503bec511ce89538 100644 (file)
@@ -162,12 +162,12 @@ static void get_ref_information(struct repository *repo,
        }
 }
 
-static void determine_replay_mode(struct repository *repo,
-                                 struct rev_cmdline_info *cmd_info,
-                                 const char *onto_name,
-                                 char **advance_name,
-                                 struct commit **onto,
-                                 struct strset **update_refs)
+static void set_up_replay_mode(struct repository *repo,
+                              struct rev_cmdline_info *cmd_info,
+                              const char *onto_name,
+                              char **advance_name,
+                              struct commit **onto,
+                              struct strset **update_refs)
 {
        struct ref_info rinfo;
 
@@ -182,10 +182,16 @@ static void determine_replay_mode(struct repository *repo,
                if (rinfo.positive_refexprs <
                    strset_get_size(&rinfo.positive_refs))
                        die(_("all positive revisions given must be references"));
-       } else if (*advance_name) {
+               *update_refs = xcalloc(1, sizeof(**update_refs));
+               **update_refs = rinfo.positive_refs;
+               memset(&rinfo.positive_refs, 0, sizeof(**update_refs));
+       } else {
                struct object_id oid;
                char *fullname = NULL;
 
+               if (!*advance_name)
+                       BUG("expected either onto_name or *advance_name in this function");
+
                *onto = peel_committish(repo, *advance_name);
                if (repo_dwim_ref(repo, *advance_name, strlen(*advance_name),
                             &oid, &fullname, 0) == 1) {
@@ -196,51 +202,6 @@ static void determine_replay_mode(struct repository *repo,
                }
                if (rinfo.positive_refexprs > 1)
                        die(_("cannot advance target with multiple sources because ordering would be ill-defined"));
-       } else {
-               int positive_refs_complete = (
-                       rinfo.positive_refexprs ==
-                       strset_get_size(&rinfo.positive_refs));
-               int negative_refs_complete = (
-                       rinfo.negative_refexprs ==
-                       strset_get_size(&rinfo.negative_refs));
-               /*
-                * We need either positive_refs_complete or
-                * negative_refs_complete, but not both.
-                */
-               if (rinfo.negative_refexprs > 0 &&
-                   positive_refs_complete == negative_refs_complete)
-                       die(_("cannot implicitly determine whether this is an --advance or --onto operation"));
-               if (negative_refs_complete) {
-                       struct hashmap_iter iter;
-                       struct strmap_entry *entry;
-                       const char *last_key = NULL;
-
-                       if (rinfo.negative_refexprs == 0)
-                               die(_("all positive revisions given must be references"));
-                       else if (rinfo.negative_refexprs > 1)
-                               die(_("cannot implicitly determine whether this is an --advance or --onto operation"));
-                       else if (rinfo.positive_refexprs > 1)
-                               die(_("cannot advance target with multiple source branches because ordering would be ill-defined"));
-
-                       /* Only one entry, but we have to loop to get it */
-                       strset_for_each_entry(&rinfo.negative_refs,
-                                             &iter, entry) {
-                               last_key = entry->key;
-                       }
-
-                       free(*advance_name);
-                       *advance_name = xstrdup_or_null(last_key);
-               } else { /* positive_refs_complete */
-                       if (rinfo.negative_refexprs > 1)
-                               die(_("cannot implicitly determine correct base for --onto"));
-                       if (rinfo.negative_refexprs == 1)
-                               *onto = rinfo.onto;
-               }
-       }
-       if (!*advance_name) {
-               *update_refs = xcalloc(1, sizeof(**update_refs));
-               **update_refs = rinfo.positive_refs;
-               memset(&rinfo.positive_refs, 0, sizeof(**update_refs));
        }
        strset_clear(&rinfo.negative_refs);
        strset_clear(&rinfo.positive_refs);
@@ -451,8 +412,9 @@ int cmd_replay(int argc,
                revs.simplify_history = 0;
        }
 
-       determine_replay_mode(repo, &revs.cmdline, onto_name, &advance_name,
-                             &onto, &update_refs);
+       set_up_replay_mode(repo, &revs.cmdline,
+                          onto_name, &advance_name,
+                          &onto, &update_refs);
 
        if (!onto) /* FIXME: Should handle replaying down to root commit */
                die("Replaying down to root commit is not supported yet!");