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{
@@ -1165,6 +1136,8 @@ static int switch_branches(const struct checkout_opts *opts,
11651136 struct object_id rev ;
11661137 int flag , writeout_error = 0 ;
11671138 int do_merge = 1 ;
1139+ struct strbuf old_commit_shortname = STRBUF_INIT ;
1140+ const char * stash_label_ancestor = NULL ;
11681141
11691142 trace2_cmd_mode ("branch" );
11701143
@@ -1202,10 +1175,34 @@ static int switch_branches(const struct checkout_opts *opts,
12021175 do_merge = 0 ;
12031176 }
12041177
1178+ if (old_branch_info .name )
1179+ stash_label_ancestor = old_branch_info .name ;
1180+ else if (old_branch_info .commit ) {
1181+ strbuf_add_unique_abbrev (& old_commit_shortname ,
1182+ & old_branch_info .commit -> object .oid ,
1183+ DEFAULT_ABBREV );
1184+ stash_label_ancestor = old_commit_shortname .buf ;
1185+ }
1186+
1187+ if (opts -> merge ) {
1188+ if (repo_read_index (the_repository ) < 0 )
1189+ die (_ ("index file corrupt" ));
1190+ if (checkout_would_clobber_changes (& old_branch_info ,
1191+ new_branch_info ))
1192+ create_autostash_ref_silent (the_repository ,
1193+ "CHECKOUT_AUTOSTASH" );
1194+ }
1195+
12051196 if (do_merge ) {
12061197 ret = merge_working_tree (opts , & old_branch_info , new_branch_info , & writeout_error );
12071198 if (ret ) {
1199+ apply_autostash_ref_with_labels (the_repository ,
1200+ "CHECKOUT_AUTOSTASH" ,
1201+ new_branch_info -> name ,
1202+ "local" ,
1203+ stash_label_ancestor );
12081204 branch_info_release (& old_branch_info );
1205+ strbuf_release (& old_commit_shortname );
12091206 return ret ;
12101207 }
12111208 }
@@ -1215,8 +1212,28 @@ static int switch_branches(const struct checkout_opts *opts,
12151212
12161213 update_refs_for_switch (opts , & old_branch_info , new_branch_info );
12171214
1215+ if (opts -> conflict_style >= 0 ) {
1216+ struct strbuf cfg = STRBUF_INIT ;
1217+ strbuf_addf (& cfg , "merge.conflictStyle=%s" ,
1218+ conflict_style_name (opts -> conflict_style ));
1219+ git_config_push_parameter (cfg .buf );
1220+ strbuf_release (& cfg );
1221+ }
1222+ apply_autostash_ref_with_labels (the_repository , "CHECKOUT_AUTOSTASH" ,
1223+ new_branch_info -> name , "local" ,
1224+ stash_label_ancestor );
1225+
1226+ discard_index (the_repository -> index );
1227+ if (repo_read_index (the_repository ) < 0 )
1228+ die (_ ("index file corrupt" ));
1229+
1230+ if (!opts -> discard_changes && !opts -> quiet && new_branch_info -> commit )
1231+ show_local_changes (& new_branch_info -> commit -> object ,
1232+ & opts -> diff_options );
1233+
12181234 ret = post_checkout_hook (old_branch_info .commit , new_branch_info -> commit , 1 );
12191235 branch_info_release (& old_branch_info );
1236+ strbuf_release (& old_commit_shortname );
12201237
12211238 return ret || writeout_error ;
12221239}
0 commit comments