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
}