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 "submodule.h"
3535#include "symlinks.h"
@@ -845,83 +845,8 @@ static int merge_working_tree(const struct checkout_opts *opts,
845845
846846 ret = unpack_trees (2 , trees , & topts );
847847 clear_unpack_trees_porcelain (& topts );
848- if (ret == -1 ) {
849- /*
850- * Unpack couldn't do a trivial merge; either
851- * give up or do a real merge, depending on
852- * whether the merge flag was used.
853- */
854- struct tree * work ;
855- struct tree * old_tree ;
856- struct merge_options o ;
857- struct strbuf sb = STRBUF_INIT ;
858- struct strbuf old_commit_shortname = STRBUF_INIT ;
859-
860- if (!opts -> merge )
861- return 1 ;
862-
863- /*
864- * Without old_branch_info->commit, the below is the same as
865- * the two-tree unpack we already tried and failed.
866- */
867- if (!old_branch_info -> commit )
868- return 1 ;
869- old_tree = repo_get_commit_tree (the_repository ,
870- old_branch_info -> commit );
871-
872- if (repo_index_has_changes (the_repository , old_tree , & sb ))
873- die (_ ("cannot continue with staged changes in "
874- "the following files:\n%s" ), sb .buf );
875- strbuf_release (& sb );
876-
877- /* Do more real merge */
878-
879- /*
880- * We update the index fully, then write the
881- * tree from the index, then merge the new
882- * branch with the current tree, with the old
883- * branch as the base. Then we reset the index
884- * (but not the working tree) to the new
885- * branch, leaving the working tree as the
886- * merged version, but skipping unmerged
887- * entries in the index.
888- */
889-
890- add_files_to_cache (the_repository , NULL , NULL , NULL , 0 ,
891- 0 , 0 );
892- init_ui_merge_options (& o , the_repository );
893- o .verbosity = 0 ;
894- work = write_in_core_index_as_tree (the_repository );
895-
896- ret = reset_tree (new_tree ,
897- opts , 1 ,
898- writeout_error , new_branch_info );
899- if (ret )
900- return ret ;
901- o .ancestor = old_branch_info -> name ;
902- if (!old_branch_info -> name ) {
903- strbuf_add_unique_abbrev (& old_commit_shortname ,
904- & old_branch_info -> commit -> object .oid ,
905- DEFAULT_ABBREV );
906- o .ancestor = old_commit_shortname .buf ;
907- }
908- o .branch1 = new_branch_info -> name ;
909- o .branch2 = "local" ;
910- o .conflict_style = opts -> conflict_style ;
911- ret = merge_ort_nonrecursive (& o ,
912- new_tree ,
913- work ,
914- old_tree );
915- if (ret < 0 )
916- die (NULL );
917- ret = reset_tree (new_tree ,
918- opts , 0 ,
919- writeout_error , new_branch_info );
920- strbuf_release (& o .obuf );
921- strbuf_release (& old_commit_shortname );
922- if (ret )
923- return ret ;
924- }
848+ if (ret == -1 )
849+ return 1 ;
925850 }
926851
927852 if (!cache_tree_fully_valid (the_repository -> index -> cache_tree ))
@@ -930,9 +855,6 @@ static int merge_working_tree(const struct checkout_opts *opts,
930855 if (write_locked_index (the_repository -> index , & lock_file , COMMIT_LOCK ))
931856 die (_ ("unable to write new index file" ));
932857
933- if (!opts -> discard_changes && !opts -> quiet && new_branch_info -> commit )
934- show_local_changes (& new_branch_info -> commit -> object , & opts -> diff_options );
935-
936858 return 0 ;
937859}
938860
@@ -1157,6 +1079,55 @@ static void orphaned_commit_warning(struct commit *old_commit, struct commit *ne
11571079 release_revisions (& revs );
11581080}
11591081
1082+ static int checkout_would_clobber_changes (struct branch_info * old_branch_info ,
1083+ struct branch_info * new_branch_info )
1084+ {
1085+ struct tree_desc trees [2 ];
1086+ struct tree * old_tree , * new_tree ;
1087+ struct unpack_trees_options topts ;
1088+ struct index_state tmp_index = INDEX_STATE_INIT (the_repository );
1089+ const struct object_id * old_commit_oid ;
1090+ int ret ;
1091+
1092+ if (!new_branch_info -> commit )
1093+ return 0 ;
1094+
1095+ old_commit_oid = old_branch_info -> commit ?
1096+ & old_branch_info -> commit -> object .oid :
1097+ the_hash_algo -> empty_tree ;
1098+ old_tree = repo_parse_tree_indirect (the_repository , old_commit_oid );
1099+ if (!old_tree )
1100+ return 0 ;
1101+
1102+ new_tree = repo_get_commit_tree (the_repository ,
1103+ new_branch_info -> commit );
1104+ if (!new_tree )
1105+ return 0 ;
1106+ if (repo_parse_tree (the_repository , new_tree ) < 0 )
1107+ return 0 ;
1108+
1109+ memset (& topts , 0 , sizeof (topts ));
1110+ topts .head_idx = -1 ;
1111+ topts .src_index = the_repository -> index ;
1112+ topts .dst_index = & tmp_index ;
1113+ topts .initial_checkout = is_index_unborn (the_repository -> index );
1114+ topts .merge = 1 ;
1115+ topts .update = 1 ;
1116+ topts .dry_run = 1 ;
1117+ topts .quiet = 1 ;
1118+ topts .fn = twoway_merge ;
1119+
1120+ init_tree_desc (& trees [0 ], & old_tree -> object .oid ,
1121+ old_tree -> buffer , old_tree -> size );
1122+ init_tree_desc (& trees [1 ], & new_tree -> object .oid ,
1123+ new_tree -> buffer , new_tree -> size );
1124+
1125+ ret = unpack_trees (2 , trees , & topts );
1126+ discard_index (& tmp_index );
1127+
1128+ return ret != 0 ;
1129+ }
1130+
11601131static int switch_branches (const struct checkout_opts * opts ,
11611132 struct branch_info * new_branch_info )
11621133{
@@ -1202,9 +1173,19 @@ static int switch_branches(const struct checkout_opts *opts,
12021173 do_merge = 0 ;
12031174 }
12041175
1176+ if (opts -> merge ) {
1177+ if (repo_read_index (the_repository ) < 0 )
1178+ die (_ ("index file corrupt" ));
1179+ if (checkout_would_clobber_changes (& old_branch_info ,
1180+ new_branch_info ))
1181+ create_autostash_ref_silent (the_repository ,
1182+ "CHECKOUT_AUTOSTASH" );
1183+ }
1184+
12051185 if (do_merge ) {
12061186 ret = merge_working_tree (opts , & old_branch_info , new_branch_info , & writeout_error );
12071187 if (ret ) {
1188+ apply_autostash_ref (the_repository , "CHECKOUT_AUTOSTASH" );
12081189 branch_info_release (& old_branch_info );
12091190 return ret ;
12101191 }
@@ -1215,6 +1196,23 @@ static int switch_branches(const struct checkout_opts *opts,
12151196
12161197 update_refs_for_switch (opts , & old_branch_info , new_branch_info );
12171198
1199+ if (opts -> conflict_style >= 0 ) {
1200+ struct strbuf cfg = STRBUF_INIT ;
1201+ strbuf_addf (& cfg , "merge.conflictStyle=%s" ,
1202+ conflict_style_name (opts -> conflict_style ));
1203+ git_config_push_parameter (cfg .buf );
1204+ strbuf_release (& cfg );
1205+ }
1206+ apply_autostash_ref (the_repository , "CHECKOUT_AUTOSTASH" );
1207+
1208+ discard_index (the_repository -> index );
1209+ if (repo_read_index (the_repository ) < 0 )
1210+ die (_ ("index file corrupt" ));
1211+
1212+ if (!opts -> discard_changes && !opts -> quiet && new_branch_info -> commit )
1213+ show_local_changes (& new_branch_info -> commit -> object ,
1214+ & opts -> diff_options );
1215+
12181216 ret = post_checkout_hook (old_branch_info .commit , new_branch_info -> commit , 1 );
12191217 branch_info_release (& old_branch_info );
12201218
0 commit comments