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"
@@ -852,84 +852,8 @@ static int merge_working_tree(const struct checkout_opts *opts,
852852
853853 ret = unpack_trees (2 , trees , & topts );
854854 clear_unpack_trees_porcelain (& topts );
855- 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 ;
932- }
855+ if (ret == -1 )
856+ return 1 ;
933857 }
934858
935859 if (!cache_tree_fully_valid (the_repository -> index -> cache_tree ))
@@ -938,9 +862,6 @@ static int merge_working_tree(const struct checkout_opts *opts,
938862 if (write_locked_index (the_repository -> index , & lock_file , COMMIT_LOCK ))
939863 die (_ ("unable to write new index file" ));
940864
941- if (!opts -> discard_changes && !opts -> quiet && new_branch_info -> commit )
942- show_local_changes (& new_branch_info -> commit -> object , & opts -> diff_options );
943-
944865 return 0 ;
945866}
946867
@@ -1165,6 +1086,55 @@ static void orphaned_commit_warning(struct commit *old_commit, struct commit *ne
11651086 release_revisions (& revs );
11661087}
11671088
1089+ static int checkout_would_clobber_changes (struct branch_info * old_branch_info ,
1090+ struct branch_info * new_branch_info )
1091+ {
1092+ struct tree_desc trees [2 ];
1093+ struct tree * old_tree , * new_tree ;
1094+ struct unpack_trees_options topts ;
1095+ struct index_state tmp_index = INDEX_STATE_INIT (the_repository );
1096+ const struct object_id * old_commit_oid ;
1097+ int ret ;
1098+
1099+ if (!new_branch_info -> commit )
1100+ return 0 ;
1101+
1102+ old_commit_oid = old_branch_info -> commit ?
1103+ & old_branch_info -> commit -> object .oid :
1104+ the_hash_algo -> empty_tree ;
1105+ old_tree = repo_parse_tree_indirect (the_repository , old_commit_oid );
1106+ if (!old_tree )
1107+ return 0 ;
1108+
1109+ new_tree = repo_get_commit_tree (the_repository ,
1110+ new_branch_info -> commit );
1111+ if (!new_tree )
1112+ return 0 ;
1113+ if (repo_parse_tree (the_repository , new_tree ) < 0 )
1114+ return 0 ;
1115+
1116+ memset (& topts , 0 , sizeof (topts ));
1117+ topts .head_idx = -1 ;
1118+ topts .src_index = the_repository -> index ;
1119+ topts .dst_index = & tmp_index ;
1120+ topts .initial_checkout = is_index_unborn (the_repository -> index );
1121+ topts .merge = 1 ;
1122+ topts .update = 1 ;
1123+ topts .dry_run = 1 ;
1124+ topts .quiet = 1 ;
1125+ topts .fn = twoway_merge ;
1126+
1127+ init_tree_desc (& trees [0 ], & old_tree -> object .oid ,
1128+ old_tree -> buffer , old_tree -> size );
1129+ init_tree_desc (& trees [1 ], & new_tree -> object .oid ,
1130+ new_tree -> buffer , new_tree -> size );
1131+
1132+ ret = unpack_trees (2 , trees , & topts );
1133+ discard_index (& tmp_index );
1134+
1135+ return ret != 0 ;
1136+ }
1137+
11681138static int switch_branches (const struct checkout_opts * opts ,
11691139 struct branch_info * new_branch_info )
11701140{
@@ -1210,9 +1180,19 @@ static int switch_branches(const struct checkout_opts *opts,
12101180 do_merge = 0 ;
12111181 }
12121182
1183+ if (opts -> merge ) {
1184+ if (repo_read_index (the_repository ) < 0 )
1185+ die (_ ("index file corrupt" ));
1186+ if (checkout_would_clobber_changes (& old_branch_info ,
1187+ new_branch_info ))
1188+ create_autostash_ref (the_repository ,
1189+ "CHECKOUT_AUTOSTASH" );
1190+ }
1191+
12131192 if (do_merge ) {
12141193 ret = merge_working_tree (opts , & old_branch_info , new_branch_info , & writeout_error );
12151194 if (ret ) {
1195+ apply_autostash_ref (the_repository , "CHECKOUT_AUTOSTASH" );
12161196 branch_info_release (& old_branch_info );
12171197 return ret ;
12181198 }
@@ -1223,6 +1203,23 @@ static int switch_branches(const struct checkout_opts *opts,
12231203
12241204 update_refs_for_switch (opts , & old_branch_info , new_branch_info );
12251205
1206+ if (opts -> conflict_style >= 0 ) {
1207+ struct strbuf cfg = STRBUF_INIT ;
1208+ strbuf_addf (& cfg , "merge.conflictStyle=%s" ,
1209+ conflict_style_name (opts -> conflict_style ));
1210+ git_config_push_parameter (cfg .buf );
1211+ strbuf_release (& cfg );
1212+ }
1213+ apply_autostash_ref (the_repository , "CHECKOUT_AUTOSTASH" );
1214+
1215+ discard_index (the_repository -> index );
1216+ if (repo_read_index (the_repository ) < 0 )
1217+ die (_ ("index file corrupt" ));
1218+
1219+ if (!opts -> discard_changes && !opts -> quiet && new_branch_info -> commit )
1220+ show_local_changes (& new_branch_info -> commit -> object ,
1221+ & opts -> diff_options );
1222+
12261223 ret = post_checkout_hook (old_branch_info .commit , new_branch_info -> commit , 1 );
12271224 branch_info_release (& old_branch_info );
12281225
0 commit comments