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>

Denton Liu committed Aug 27, 2019 at 01:37 UTC 2b318aa6c3566ad65d9547f42828f277955e6519
1 file changed +13 -8
builtin/rebase.c
+13 -8
@@ -1264,20 +1264,25 @@ static int can_fast_forward(struct commit *onto, struct object_id *head_oid,
1264 struct object_id *merge_base)
1265 {
1266 struct commit *head = lookup_commit(the_repository, head_oid);
1267 - struct commit_list *merge_bases;
1268 - int res;
1267 + struct commit_list *merge_bases = NULL;
1268 + int res = 0;
1269
1270 if (!head)
1271 - return 0;
1271 + goto done;
1272
1273 merge_bases = get_merge_bases(onto, head);
1274 - if (merge_bases && !merge_bases->next) {
1275 - oidcpy(merge_base, &merge_bases->item->object.oid);
1276 - res = oideq(merge_base, &onto->object.oid);
1277 - } else {
1274 + if (!merge_bases || merge_bases->next) {
1275 oidcpy(merge_base, &null_oid);
1279 - res = 0;
1276 + goto done;
1277 }
1278 +
1279 + oidcpy(merge_base, &merge_bases->item->object.oid);
1280 + if (!oideq(merge_base, &onto->object.oid))
1281 + goto done;
1282 +
1283 + res = 1;
1284 +
1285 +done:
1286 free_commit_list(merge_bases);
1287 return res && is_linear_history(onto, head);
1288 }