mirror of
https://github.com/git/git.git
synced 2026-01-11 13:23:12 +09:00
replay: remove dead code and rearrange
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>
This commit is contained in:
parent
66ce5f8e88
commit
76eab50f75
@ -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!");
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user