@@ -1082,7 +1082,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
10821082 struct commit * head_commit ;
10831083 struct strbuf buf = STRBUF_INIT ;
10841084 const char * head_arg ;
1085- int flag , i ;
1085+ int flag , i , ret = 0 ;
10861086 int best_cnt = -1 , merge_was_ok = 0 , automerge_was_ok = 0 ;
10871087 struct commit_list * common = NULL ;
10881088 const char * best_strategy = NULL , * wt_strategy = NULL ;
@@ -1096,8 +1096,11 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
10961096 * current branch.
10971097 */
10981098 branch = resolve_ref ("HEAD" , head_sha1 , 0 , & flag );
1099- if (branch && !prefixcmp (branch , "refs/heads/" ))
1100- branch += 11 ;
1099+ if (branch ) {
1100+ if (!prefixcmp (branch , "refs/heads/" ))
1101+ branch += 11 ;
1102+ branch = xstrdup (branch );
1103+ }
11011104 if (!branch || is_null_sha1 (head_sha1 ))
11021105 head_commit = NULL ;
11031106 else
@@ -1121,7 +1124,8 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
11211124 die (_ ("There is no merge to abort (MERGE_HEAD missing)." ));
11221125
11231126 /* Invoke 'git reset --merge' */
1124- return cmd_reset (nargc , nargv , prefix );
1127+ ret = cmd_reset (nargc , nargv , prefix );
1128+ goto done ;
11251129 }
11261130
11271131 if (read_cache_unmerged ())
@@ -1205,7 +1209,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
12051209 read_empty (remote_head -> sha1 , 0 );
12061210 update_ref ("initial pull" , "HEAD" , remote_head -> sha1 , NULL , 0 ,
12071211 DIE_ON_ERR );
1208- return 0 ;
1212+ goto done ;
12091213 } else {
12101214 struct strbuf merge_names = STRBUF_INIT ;
12111215
@@ -1292,7 +1296,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
12921296 * but first the most common case of merging one remote.
12931297 */
12941298 finish_up_to_date ("Already up-to-date." );
1295- return 0 ;
1299+ goto done ;
12961300 } else if (allow_fast_forward && !remoteheads -> next &&
12971301 !common -> next &&
12981302 !hashcmp (common -> item -> object .sha1 , head_commit -> object .sha1 )) {
@@ -1313,15 +1317,20 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
13131317 strbuf_addstr (& msg ,
13141318 " (no commit created; -m option ignored)" );
13151319 o = want_commit (sha1_to_hex (remoteheads -> item -> object .sha1 ));
1316- if (!o )
1317- return 1 ;
1320+ if (!o ) {
1321+ ret = 1 ;
1322+ goto done ;
1323+ }
13181324
1319- if (checkout_fast_forward (head_commit -> object .sha1 , remoteheads -> item -> object .sha1 ))
1320- return 1 ;
1325+ if (checkout_fast_forward (head_commit -> object .sha1 ,
1326+ remoteheads -> item -> object .sha1 )) {
1327+ ret = 1 ;
1328+ goto done ;
1329+ }
13211330
13221331 finish (head_commit , o -> sha1 , msg .buf );
13231332 drop_save ();
1324- return 0 ;
1333+ goto done ;
13251334 } else if (!remoteheads -> next && common -> next )
13261335 ;
13271336 /*
@@ -1339,8 +1348,11 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
13391348 git_committer_info (IDENT_ERROR_ON_NO_NAME );
13401349 printf (_ ("Trying really trivial in-index merge...\n" ));
13411350 if (!read_tree_trivial (common -> item -> object .sha1 ,
1342- head_commit -> object .sha1 , remoteheads -> item -> object .sha1 ))
1343- return merge_trivial (head_commit );
1351+ head_commit -> object .sha1 ,
1352+ remoteheads -> item -> object .sha1 )) {
1353+ ret = merge_trivial (head_commit );
1354+ goto done ;
1355+ }
13441356 printf (_ ("Nope.\n" ));
13451357 }
13461358 } else {
@@ -1368,7 +1380,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
13681380 }
13691381 if (up_to_date ) {
13701382 finish_up_to_date ("Already up-to-date. Yeeah!" );
1371- return 0 ;
1383+ goto done ;
13721384 }
13731385 }
13741386
@@ -1450,9 +1462,11 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
14501462 * If we have a resulting tree, that means the strategy module
14511463 * auto resolved the merge cleanly.
14521464 */
1453- if (automerge_was_ok )
1454- return finish_automerge (head_commit , common , result_tree ,
1455- wt_strategy );
1465+ if (automerge_was_ok ) {
1466+ ret = finish_automerge (head_commit , common , result_tree ,
1467+ wt_strategy );
1468+ goto done ;
1469+ }
14561470
14571471 /*
14581472 * Pick the result from the best strategy and have the user fix
@@ -1466,7 +1480,8 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
14661480 else
14671481 fprintf (stderr , _ ("Merge with strategy %s failed.\n" ),
14681482 use_strategies [0 ]-> name );
1469- return 2 ;
1483+ ret = 2 ;
1484+ goto done ;
14701485 } else if (best_strategy == wt_strategy )
14711486 ; /* We already have its result in the working tree. */
14721487 else {
@@ -1482,10 +1497,13 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
14821497 else
14831498 write_merge_state ();
14841499
1485- if (merge_was_ok ) {
1500+ if (merge_was_ok )
14861501 fprintf (stderr , _ ("Automatic merge went well; "
14871502 "stopped before committing as requested\n" ));
1488- return 0 ;
1489- } else
1490- return suggest_conflicts (option_renormalize );
1503+ else
1504+ ret = suggest_conflicts (option_renormalize );
1505+
1506+ done :
1507+ free ((char * )branch );
1508+ return ret ;
14911509}
0 commit comments