rebase: refactor can_fast_forward into goto tower
Before, can_fast_forward was written with an if-else statement. However, in the future, we may be adding more termination cases which would lead to deeply nested if statements. Refactor to use a goto tower so that future cases can be easily inserted. Signed-off-by: Denton Liu <liu.denton@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
c9efc21683
commit
2b318aa6c3
|
@ -1264,20 +1264,25 @@ static int can_fast_forward(struct commit *onto, struct object_id *head_oid,
|
||||||
struct object_id *merge_base)
|
struct object_id *merge_base)
|
||||||
{
|
{
|
||||||
struct commit *head = lookup_commit(the_repository, head_oid);
|
struct commit *head = lookup_commit(the_repository, head_oid);
|
||||||
struct commit_list *merge_bases;
|
struct commit_list *merge_bases = NULL;
|
||||||
int res;
|
int res = 0;
|
||||||
|
|
||||||
if (!head)
|
if (!head)
|
||||||
return 0;
|
goto done;
|
||||||
|
|
||||||
merge_bases = get_merge_bases(onto, head);
|
merge_bases = get_merge_bases(onto, head);
|
||||||
if (merge_bases && !merge_bases->next) {
|
if (!merge_bases || merge_bases->next) {
|
||||||
oidcpy(merge_base, &merge_bases->item->object.oid);
|
|
||||||
res = oideq(merge_base, &onto->object.oid);
|
|
||||||
} else {
|
|
||||||
oidcpy(merge_base, &null_oid);
|
oidcpy(merge_base, &null_oid);
|
||||||
res = 0;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
oidcpy(merge_base, &merge_bases->item->object.oid);
|
||||||
|
if (!oideq(merge_base, &onto->object.oid))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
res = 1;
|
||||||
|
|
||||||
|
done:
|
||||||
free_commit_list(merge_bases);
|
free_commit_list(merge_bases);
|
||||||
return res && is_linear_history(onto, head);
|
return res && is_linear_history(onto, head);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue