1717#include "merge-ll.h"
1818#include "lockfile.h"
1919#include "mem-pool.h"
20- #include "merge-ort-wrappers.h"
2120#include "object-file.h"
2221#include "object-name.h"
2322#include "odb.h"
3029#include "repo-settings.h"
3130#include "resolve-undo.h"
3231#include "revision.h"
32+ #include "sequencer.h"
3333#include "setup.h"
3434#include "strvec.h"
3535#include "submodule.h"
@@ -790,8 +790,10 @@ static int merge_working_tree(const struct checkout_opts *opts,
790790 struct tree * new_tree ;
791791
792792 repo_hold_locked_index (the_repository , & lock_file , LOCK_DIE_ON_ERROR );
793- if (repo_read_index_preload (the_repository , NULL , 0 ) < 0 )
793+ if (repo_read_index_preload (the_repository , NULL , 0 ) < 0 ) {
794+ rollback_lock_file (& lock_file );
794795 return error (_ ("index file corrupt" ));
796+ }
795797
796798 resolve_undo_clear_index (the_repository -> index );
797799 if (opts -> new_orphan_branch && opts -> orphan_from_empty_tree ) {
@@ -804,14 +806,18 @@ static int merge_working_tree(const struct checkout_opts *opts,
804806 } else {
805807 new_tree = repo_get_commit_tree (the_repository ,
806808 new_branch_info -> commit );
807- if (!new_tree )
809+ if (!new_tree ) {
810+ rollback_lock_file (& lock_file );
808811 return error (_ ("unable to read tree (%s)" ),
809812 oid_to_hex (& new_branch_info -> commit -> object .oid ));
813+ }
810814 }
811815 if (opts -> discard_changes ) {
812816 ret = reset_tree (new_tree , opts , 1 , writeout_error , new_branch_info );
813- if (ret )
817+ if (ret ) {
818+ rollback_lock_file (& lock_file );
814819 return ret ;
820+ }
815821 } else {
816822 struct tree_desc trees [2 ];
817823 struct tree * tree ;
@@ -821,6 +827,7 @@ static int merge_working_tree(const struct checkout_opts *opts,
821827 refresh_index (the_repository -> index , REFRESH_QUIET , NULL , NULL , NULL );
822828
823829 if (unmerged_index (the_repository -> index )) {
830+ rollback_lock_file (& lock_file );
824831 error (_ ("you need to resolve your current index first" ));
825832 return 1 ;
826833 }
@@ -853,82 +860,8 @@ static int merge_working_tree(const struct checkout_opts *opts,
853860 ret = unpack_trees (2 , trees , & topts );
854861 clear_unpack_trees_porcelain (& topts );
855862 if (ret == -1 ) {
856- /*
857- * Unpack couldn't do a trivial merge; either
858- * give up or do a real merge, depending on
859- * whether the merge flag was used.
860- */
861- struct tree * work ;
862- struct tree * old_tree ;
863- struct merge_options o ;
864- struct strbuf sb = STRBUF_INIT ;
865- struct strbuf old_commit_shortname = STRBUF_INIT ;
866-
867- if (!opts -> merge )
868- return 1 ;
869-
870- /*
871- * Without old_branch_info->commit, the below is the same as
872- * the two-tree unpack we already tried and failed.
873- */
874- if (!old_branch_info -> commit )
875- return 1 ;
876- old_tree = repo_get_commit_tree (the_repository ,
877- old_branch_info -> commit );
878-
879- if (repo_index_has_changes (the_repository , old_tree , & sb ))
880- die (_ ("cannot continue with staged changes in "
881- "the following files:\n%s" ), sb .buf );
882- strbuf_release (& sb );
883-
884- /* Do more real merge */
885-
886- /*
887- * We update the index fully, then write the
888- * tree from the index, then merge the new
889- * branch with the current tree, with the old
890- * branch as the base. Then we reset the index
891- * (but not the working tree) to the new
892- * branch, leaving the working tree as the
893- * merged version, but skipping unmerged
894- * entries in the index.
895- */
896-
897- add_files_to_cache (the_repository , NULL , NULL , NULL , 0 ,
898- 0 , 0 );
899- init_ui_merge_options (& o , the_repository );
900- o .verbosity = 0 ;
901- work = write_in_core_index_as_tree (the_repository ,
902- the_repository -> index );
903-
904- ret = reset_tree (new_tree ,
905- opts , 1 ,
906- writeout_error , new_branch_info );
907- if (ret )
908- return ret ;
909- o .ancestor = old_branch_info -> name ;
910- if (!old_branch_info -> name ) {
911- strbuf_add_unique_abbrev (& old_commit_shortname ,
912- & old_branch_info -> commit -> object .oid ,
913- DEFAULT_ABBREV );
914- o .ancestor = old_commit_shortname .buf ;
915- }
916- o .branch1 = new_branch_info -> name ;
917- o .branch2 = "local" ;
918- o .conflict_style = opts -> conflict_style ;
919- ret = merge_ort_nonrecursive (& o ,
920- new_tree ,
921- work ,
922- old_tree );
923- if (ret < 0 )
924- die (NULL );
925- ret = reset_tree (new_tree ,
926- opts , 0 ,
927- writeout_error , new_branch_info );
928- strbuf_release (& o .obuf );
929- strbuf_release (& old_commit_shortname );
930- if (ret )
931- return ret ;
863+ rollback_lock_file (& lock_file );
864+ return ret ;
932865 }
933866 }
934867
@@ -1173,6 +1106,10 @@ static int switch_branches(const struct checkout_opts *opts,
11731106 struct object_id rev ;
11741107 int flag , writeout_error = 0 ;
11751108 int do_merge = 1 ;
1109+ int created_autostash = 0 ;
1110+ struct strbuf old_commit_shortname = STRBUF_INIT ;
1111+ struct strbuf autostash_msg = STRBUF_INIT ;
1112+ const char * stash_label_base = NULL ;
11761113
11771114 trace2_cmd_mode ("branch" );
11781115
@@ -1210,11 +1147,39 @@ static int switch_branches(const struct checkout_opts *opts,
12101147 do_merge = 0 ;
12111148 }
12121149
1150+ if (old_branch_info .name )
1151+ stash_label_base = old_branch_info .name ;
1152+ else if (old_branch_info .commit ) {
1153+ strbuf_add_unique_abbrev (& old_commit_shortname ,
1154+ & old_branch_info .commit -> object .oid ,
1155+ DEFAULT_ABBREV );
1156+ stash_label_base = old_commit_shortname .buf ;
1157+ }
1158+
12131159 if (do_merge ) {
12141160 ret = merge_working_tree (opts , & old_branch_info , new_branch_info , & writeout_error );
1161+ if (ret == -1 && opts -> merge ) {
1162+ strbuf_addf (& autostash_msg ,
1163+ "autostash while switching to '%s'" ,
1164+ new_branch_info -> name );
1165+ create_autostash_ref (the_repository ,
1166+ "CHECKOUT_AUTOSTASH_HEAD" ,
1167+ autostash_msg .buf , true);
1168+ created_autostash = 1 ;
1169+ ret = merge_working_tree (opts , & old_branch_info , new_branch_info , & writeout_error );
1170+ }
12151171 if (ret ) {
1172+ if (created_autostash )
1173+ apply_autostash_ref (the_repository ,
1174+ "CHECKOUT_AUTOSTASH_HEAD" ,
1175+ new_branch_info -> name ,
1176+ "local" ,
1177+ stash_label_base ,
1178+ autostash_msg .buf );
12161179 branch_info_release (& old_branch_info );
1217- return ret ;
1180+ strbuf_release (& old_commit_shortname );
1181+ strbuf_release (& autostash_msg );
1182+ return ret < 0 ? 1 : ret ;
12181183 }
12191184 }
12201185
@@ -1223,8 +1188,30 @@ static int switch_branches(const struct checkout_opts *opts,
12231188
12241189 update_refs_for_switch (opts , & old_branch_info , new_branch_info );
12251190
1191+ if (opts -> conflict_style >= 0 ) {
1192+ struct strbuf cfg = STRBUF_INIT ;
1193+ strbuf_addf (& cfg , "merge.conflictStyle=%s" ,
1194+ conflict_style_name (opts -> conflict_style ));
1195+ git_config_push_parameter (cfg .buf );
1196+ strbuf_release (& cfg );
1197+ }
1198+ apply_autostash_ref (the_repository , "CHECKOUT_AUTOSTASH_HEAD" ,
1199+ new_branch_info -> name , "local" ,
1200+ stash_label_base ,
1201+ autostash_msg .buf );
1202+
1203+ discard_index (the_repository -> index );
1204+ if (repo_read_index (the_repository ) < 0 )
1205+ die (_ ("index file corrupt" ));
1206+
1207+ if (created_autostash && !opts -> quiet && new_branch_info -> commit )
1208+ show_local_changes (& new_branch_info -> commit -> object ,
1209+ & opts -> diff_options );
1210+
12261211 ret = post_checkout_hook (old_branch_info .commit , new_branch_info -> commit , 1 );
12271212 branch_info_release (& old_branch_info );
1213+ strbuf_release (& old_commit_shortname );
1214+ strbuf_release (& autostash_msg );
12281215
12291216 return ret || writeout_error ;
12301217}
0 commit comments