1/* 2 * Recursive Merge algorithm stolen from git-merge-recursive.py by 3 * Fredrik Kuivinen. 4 * The thieves were Alex Riesen and Johannes Schindelin, in June/July 2006 5 */ 6#include"cache.h" 7#include"config.h" 8#include"advice.h" 9#include"lockfile.h" 10#include"cache-tree.h" 11#include"commit.h" 12#include"blob.h" 13#include"builtin.h" 14#include"tree-walk.h" 15#include"diff.h" 16#include"diffcore.h" 17#include"tag.h" 18#include"alloc.h" 19#include"unpack-trees.h" 20#include"string-list.h" 21#include"xdiff-interface.h" 22#include"ll-merge.h" 23#include"attr.h" 24#include"merge-recursive.h" 25#include"dir.h" 26#include"submodule.h" 27#include"revision.h" 28 29struct path_hashmap_entry { 30struct hashmap_entry e; 31char path[FLEX_ARRAY]; 32}; 33 34static intpath_hashmap_cmp(const void*cmp_data, 35const void*entry, 36const void*entry_or_key, 37const void*keydata) 38{ 39const struct path_hashmap_entry *a = entry; 40const struct path_hashmap_entry *b = entry_or_key; 41const char*key = keydata; 42 43if(ignore_case) 44returnstrcasecmp(a->path, key ? key : b->path); 45else 46returnstrcmp(a->path, key ? key : b->path); 47} 48 49static unsigned intpath_hash(const char*path) 50{ 51return ignore_case ?strihash(path) :strhash(path); 52} 53 54static struct dir_rename_entry *dir_rename_find_entry(struct hashmap *hashmap, 55char*dir) 56{ 57struct dir_rename_entry key; 58 59if(dir == NULL) 60return NULL; 61hashmap_entry_init(&key,strhash(dir)); 62 key.dir = dir; 63returnhashmap_get(hashmap, &key, NULL); 64} 65 66static intdir_rename_cmp(const void*unused_cmp_data, 67const void*entry, 68const void*entry_or_key, 69const void*unused_keydata) 70{ 71const struct dir_rename_entry *e1 = entry; 72const struct dir_rename_entry *e2 = entry_or_key; 73 74returnstrcmp(e1->dir, e2->dir); 75} 76 77static voiddir_rename_init(struct hashmap *map) 78{ 79hashmap_init(map, dir_rename_cmp, NULL,0); 80} 81 82static voiddir_rename_entry_init(struct dir_rename_entry *entry, 83char*directory) 84{ 85hashmap_entry_init(entry,strhash(directory)); 86 entry->dir = directory; 87 entry->non_unique_new_dir =0; 88strbuf_init(&entry->new_dir,0); 89string_list_init(&entry->possible_new_dirs,0); 90} 91 92static struct collision_entry *collision_find_entry(struct hashmap *hashmap, 93char*target_file) 94{ 95struct collision_entry key; 96 97hashmap_entry_init(&key,strhash(target_file)); 98 key.target_file = target_file; 99returnhashmap_get(hashmap, &key, NULL); 100} 101 102static intcollision_cmp(void*unused_cmp_data, 103const struct collision_entry *e1, 104const struct collision_entry *e2, 105const void*unused_keydata) 106{ 107returnstrcmp(e1->target_file, e2->target_file); 108} 109 110static voidcollision_init(struct hashmap *map) 111{ 112hashmap_init(map, (hashmap_cmp_fn) collision_cmp, NULL,0); 113} 114 115static voidflush_output(struct merge_options *o) 116{ 117if(o->buffer_output <2&& o->obuf.len) { 118fputs(o->obuf.buf, stdout); 119strbuf_reset(&o->obuf); 120} 121} 122 123static interr(struct merge_options *o,const char*err, ...) 124{ 125va_list params; 126 127if(o->buffer_output <2) 128flush_output(o); 129else{ 130strbuf_complete(&o->obuf,'\n'); 131strbuf_addstr(&o->obuf,"error: "); 132} 133va_start(params, err); 134strbuf_vaddf(&o->obuf, err, params); 135va_end(params); 136if(o->buffer_output >1) 137strbuf_addch(&o->obuf,'\n'); 138else{ 139error("%s", o->obuf.buf); 140strbuf_reset(&o->obuf); 141} 142 143return-1; 144} 145 146static struct tree *shift_tree_object(struct tree *one,struct tree *two, 147const char*subtree_shift) 148{ 149struct object_id shifted; 150 151if(!*subtree_shift) { 152shift_tree(&one->object.oid, &two->object.oid, &shifted,0); 153}else{ 154shift_tree_by(&one->object.oid, &two->object.oid, &shifted, 155 subtree_shift); 156} 157if(!oidcmp(&two->object.oid, &shifted)) 158return two; 159returnlookup_tree(&shifted); 160} 161 162static struct commit *make_virtual_commit(struct tree *tree,const char*comment) 163{ 164struct commit *commit =alloc_commit_node(the_repository); 165 166set_merge_remote_desc(commit, comment, (struct object *)commit); 167 commit->maybe_tree = tree; 168 commit->object.parsed =1; 169return commit; 170} 171 172/* 173 * Since we use get_tree_entry(), which does not put the read object into 174 * the object pool, we cannot rely on a == b. 175 */ 176static intoid_eq(const struct object_id *a,const struct object_id *b) 177{ 178if(!a && !b) 179return2; 180return a && b &&oidcmp(a, b) ==0; 181} 182 183enum rename_type { 184 RENAME_NORMAL =0, 185 RENAME_DIR, 186 RENAME_DELETE, 187 RENAME_ONE_FILE_TO_ONE, 188 RENAME_ONE_FILE_TO_TWO, 189 RENAME_TWO_FILES_TO_ONE 190}; 191 192struct rename_conflict_info { 193enum rename_type rename_type; 194struct diff_filepair *pair1; 195struct diff_filepair *pair2; 196const char*branch1; 197const char*branch2; 198struct stage_data *dst_entry1; 199struct stage_data *dst_entry2; 200struct diff_filespec ren1_other; 201struct diff_filespec ren2_other; 202}; 203 204/* 205 * Since we want to write the index eventually, we cannot reuse the index 206 * for these (temporary) data. 207 */ 208struct stage_data { 209struct{ 210unsigned mode; 211struct object_id oid; 212} stages[4]; 213struct rename_conflict_info *rename_conflict_info; 214unsigned processed:1; 215}; 216 217staticinlinevoidsetup_rename_conflict_info(enum rename_type rename_type, 218struct diff_filepair *pair1, 219struct diff_filepair *pair2, 220const char*branch1, 221const char*branch2, 222struct stage_data *dst_entry1, 223struct stage_data *dst_entry2, 224struct merge_options *o, 225struct stage_data *src_entry1, 226struct stage_data *src_entry2) 227{ 228struct rename_conflict_info *ci =xcalloc(1,sizeof(struct rename_conflict_info)); 229 ci->rename_type = rename_type; 230 ci->pair1 = pair1; 231 ci->branch1 = branch1; 232 ci->branch2 = branch2; 233 234 ci->dst_entry1 = dst_entry1; 235 dst_entry1->rename_conflict_info = ci; 236 dst_entry1->processed =0; 237 238assert(!pair2 == !dst_entry2); 239if(dst_entry2) { 240 ci->dst_entry2 = dst_entry2; 241 ci->pair2 = pair2; 242 dst_entry2->rename_conflict_info = ci; 243} 244 245if(rename_type == RENAME_TWO_FILES_TO_ONE) { 246/* 247 * For each rename, there could have been 248 * modifications on the side of history where that 249 * file was not renamed. 250 */ 251int ostage1 = o->branch1 == branch1 ?3:2; 252int ostage2 = ostage1 ^1; 253 254 ci->ren1_other.path = pair1->one->path; 255oidcpy(&ci->ren1_other.oid, &src_entry1->stages[ostage1].oid); 256 ci->ren1_other.mode = src_entry1->stages[ostage1].mode; 257 258 ci->ren2_other.path = pair2->one->path; 259oidcpy(&ci->ren2_other.oid, &src_entry2->stages[ostage2].oid); 260 ci->ren2_other.mode = src_entry2->stages[ostage2].mode; 261} 262} 263 264static intshow(struct merge_options *o,int v) 265{ 266return(!o->call_depth && o->verbosity >= v) || o->verbosity >=5; 267} 268 269__attribute__((format(printf,3,4))) 270static voidoutput(struct merge_options *o,int v,const char*fmt, ...) 271{ 272va_list ap; 273 274if(!show(o, v)) 275return; 276 277strbuf_addchars(&o->obuf,' ', o->call_depth *2); 278 279va_start(ap, fmt); 280strbuf_vaddf(&o->obuf, fmt, ap); 281va_end(ap); 282 283strbuf_addch(&o->obuf,'\n'); 284if(!o->buffer_output) 285flush_output(o); 286} 287 288static voidoutput_commit_title(struct merge_options *o,struct commit *commit) 289{ 290struct merge_remote_desc *desc; 291 292strbuf_addchars(&o->obuf,' ', o->call_depth *2); 293 desc =merge_remote_util(commit); 294if(desc) 295strbuf_addf(&o->obuf,"virtual%s\n", desc->name); 296else{ 297strbuf_add_unique_abbrev(&o->obuf, &commit->object.oid, 298 DEFAULT_ABBREV); 299strbuf_addch(&o->obuf,' '); 300if(parse_commit(commit) !=0) 301strbuf_addstr(&o->obuf,_("(bad commit)\n")); 302else{ 303const char*title; 304const char*msg =get_commit_buffer(commit, NULL); 305int len =find_commit_subject(msg, &title); 306if(len) 307strbuf_addf(&o->obuf,"%.*s\n", len, title); 308unuse_commit_buffer(commit, msg); 309} 310} 311flush_output(o); 312} 313 314static intadd_cacheinfo(struct merge_options *o, 315unsigned int mode,const struct object_id *oid, 316const char*path,int stage,int refresh,int options) 317{ 318struct cache_entry *ce; 319int ret; 320 321 ce =make_cache_entry(mode, oid ? oid->hash : null_sha1, path, stage,0); 322if(!ce) 323returnerr(o,_("add_cacheinfo failed for path '%s'; merge aborting."), path); 324 325 ret =add_cache_entry(ce, options); 326if(refresh) { 327struct cache_entry *nce; 328 329 nce =refresh_cache_entry(ce, CE_MATCH_REFRESH | CE_MATCH_IGNORE_MISSING); 330if(!nce) 331returnerr(o,_("add_cacheinfo failed to refresh for path '%s'; merge aborting."), path); 332if(nce != ce) 333 ret =add_cache_entry(nce, options); 334} 335return ret; 336} 337 338static voidinit_tree_desc_from_tree(struct tree_desc *desc,struct tree *tree) 339{ 340parse_tree(tree); 341init_tree_desc(desc, tree->buffer, tree->size); 342} 343 344static intunpack_trees_start(struct merge_options *o, 345struct tree *common, 346struct tree *head, 347struct tree *merge) 348{ 349int rc; 350struct tree_desc t[3]; 351struct index_state tmp_index = { NULL }; 352 353memset(&o->unpack_opts,0,sizeof(o->unpack_opts)); 354if(o->call_depth) 355 o->unpack_opts.index_only =1; 356else 357 o->unpack_opts.update =1; 358 o->unpack_opts.merge =1; 359 o->unpack_opts.head_idx =2; 360 o->unpack_opts.fn = threeway_merge; 361 o->unpack_opts.src_index = &the_index; 362 o->unpack_opts.dst_index = &tmp_index; 363 o->unpack_opts.aggressive = !merge_detect_rename(o); 364setup_unpack_trees_porcelain(&o->unpack_opts,"merge"); 365 366init_tree_desc_from_tree(t+0, common); 367init_tree_desc_from_tree(t+1, head); 368init_tree_desc_from_tree(t+2, merge); 369 370 rc =unpack_trees(3, t, &o->unpack_opts); 371cache_tree_free(&active_cache_tree); 372 373/* 374 * Update the_index to match the new results, AFTER saving a copy 375 * in o->orig_index. Update src_index to point to the saved copy. 376 * (verify_uptodate() checks src_index, and the original index is 377 * the one that had the necessary modification timestamps.) 378 */ 379 o->orig_index = the_index; 380 the_index = tmp_index; 381 o->unpack_opts.src_index = &o->orig_index; 382 383return rc; 384} 385 386static voidunpack_trees_finish(struct merge_options *o) 387{ 388discard_index(&o->orig_index); 389clear_unpack_trees_porcelain(&o->unpack_opts); 390} 391 392struct tree *write_tree_from_memory(struct merge_options *o) 393{ 394struct tree *result = NULL; 395 396if(unmerged_cache()) { 397int i; 398fprintf(stderr,"BUG: There are unmerged index entries:\n"); 399for(i =0; i < active_nr; i++) { 400const struct cache_entry *ce = active_cache[i]; 401if(ce_stage(ce)) 402fprintf(stderr,"BUG:%d%.*s\n",ce_stage(ce), 403(int)ce_namelen(ce), ce->name); 404} 405BUG("unmerged index entries in merge-recursive.c"); 406} 407 408if(!active_cache_tree) 409 active_cache_tree =cache_tree(); 410 411if(!cache_tree_fully_valid(active_cache_tree) && 412cache_tree_update(&the_index,0) <0) { 413err(o,_("error building trees")); 414return NULL; 415} 416 417 result =lookup_tree(&active_cache_tree->oid); 418 419return result; 420} 421 422static intsave_files_dirs(const struct object_id *oid, 423struct strbuf *base,const char*path, 424unsigned int mode,int stage,void*context) 425{ 426struct path_hashmap_entry *entry; 427int baselen = base->len; 428struct merge_options *o = context; 429 430strbuf_addstr(base, path); 431 432FLEX_ALLOC_MEM(entry, path, base->buf, base->len); 433hashmap_entry_init(entry,path_hash(entry->path)); 434hashmap_add(&o->current_file_dir_set, entry); 435 436strbuf_setlen(base, baselen); 437return(S_ISDIR(mode) ? READ_TREE_RECURSIVE :0); 438} 439 440static voidget_files_dirs(struct merge_options *o,struct tree *tree) 441{ 442struct pathspec match_all; 443memset(&match_all,0,sizeof(match_all)); 444read_tree_recursive(tree,"",0,0, &match_all, save_files_dirs, o); 445} 446 447static intget_tree_entry_if_blob(const struct object_id *tree, 448const char*path, 449struct object_id *hashy, 450unsigned int*mode_o) 451{ 452int ret; 453 454 ret =get_tree_entry(tree, path, hashy, mode_o); 455if(S_ISDIR(*mode_o)) { 456oidcpy(hashy, &null_oid); 457*mode_o =0; 458} 459return ret; 460} 461 462/* 463 * Returns an index_entry instance which doesn't have to correspond to 464 * a real cache entry in Git's index. 465 */ 466static struct stage_data *insert_stage_data(const char*path, 467struct tree *o,struct tree *a,struct tree *b, 468struct string_list *entries) 469{ 470struct string_list_item *item; 471struct stage_data *e =xcalloc(1,sizeof(struct stage_data)); 472get_tree_entry_if_blob(&o->object.oid, path, 473&e->stages[1].oid, &e->stages[1].mode); 474get_tree_entry_if_blob(&a->object.oid, path, 475&e->stages[2].oid, &e->stages[2].mode); 476get_tree_entry_if_blob(&b->object.oid, path, 477&e->stages[3].oid, &e->stages[3].mode); 478 item =string_list_insert(entries, path); 479 item->util = e; 480return e; 481} 482 483/* 484 * Create a dictionary mapping file names to stage_data objects. The 485 * dictionary contains one entry for every path with a non-zero stage entry. 486 */ 487static struct string_list *get_unmerged(void) 488{ 489struct string_list *unmerged =xcalloc(1,sizeof(struct string_list)); 490int i; 491 492 unmerged->strdup_strings =1; 493 494for(i =0; i < active_nr; i++) { 495struct string_list_item *item; 496struct stage_data *e; 497const struct cache_entry *ce = active_cache[i]; 498if(!ce_stage(ce)) 499continue; 500 501 item =string_list_lookup(unmerged, ce->name); 502if(!item) { 503 item =string_list_insert(unmerged, ce->name); 504 item->util =xcalloc(1,sizeof(struct stage_data)); 505} 506 e = item->util; 507 e->stages[ce_stage(ce)].mode = ce->ce_mode; 508oidcpy(&e->stages[ce_stage(ce)].oid, &ce->oid); 509} 510 511return unmerged; 512} 513 514static intstring_list_df_name_compare(const char*one,const char*two) 515{ 516int onelen =strlen(one); 517int twolen =strlen(two); 518/* 519 * Here we only care that entries for D/F conflicts are 520 * adjacent, in particular with the file of the D/F conflict 521 * appearing before files below the corresponding directory. 522 * The order of the rest of the list is irrelevant for us. 523 * 524 * To achieve this, we sort with df_name_compare and provide 525 * the mode S_IFDIR so that D/F conflicts will sort correctly. 526 * We use the mode S_IFDIR for everything else for simplicity, 527 * since in other cases any changes in their order due to 528 * sorting cause no problems for us. 529 */ 530int cmp =df_name_compare(one, onelen, S_IFDIR, 531 two, twolen, S_IFDIR); 532/* 533 * Now that 'foo' and 'foo/bar' compare equal, we have to make sure 534 * that 'foo' comes before 'foo/bar'. 535 */ 536if(cmp) 537return cmp; 538return onelen - twolen; 539} 540 541static voidrecord_df_conflict_files(struct merge_options *o, 542struct string_list *entries) 543{ 544/* If there is a D/F conflict and the file for such a conflict 545 * currently exist in the working tree, we want to allow it to be 546 * removed to make room for the corresponding directory if needed. 547 * The files underneath the directories of such D/F conflicts will 548 * be processed before the corresponding file involved in the D/F 549 * conflict. If the D/F directory ends up being removed by the 550 * merge, then we won't have to touch the D/F file. If the D/F 551 * directory needs to be written to the working copy, then the D/F 552 * file will simply be removed (in make_room_for_path()) to make 553 * room for the necessary paths. Note that if both the directory 554 * and the file need to be present, then the D/F file will be 555 * reinstated with a new unique name at the time it is processed. 556 */ 557struct string_list df_sorted_entries = STRING_LIST_INIT_NODUP; 558const char*last_file = NULL; 559int last_len =0; 560int i; 561 562/* 563 * If we're merging merge-bases, we don't want to bother with 564 * any working directory changes. 565 */ 566if(o->call_depth) 567return; 568 569/* Ensure D/F conflicts are adjacent in the entries list. */ 570for(i =0; i < entries->nr; i++) { 571struct string_list_item *next = &entries->items[i]; 572string_list_append(&df_sorted_entries, next->string)->util = 573 next->util; 574} 575 df_sorted_entries.cmp = string_list_df_name_compare; 576string_list_sort(&df_sorted_entries); 577 578string_list_clear(&o->df_conflict_file_set,1); 579for(i =0; i < df_sorted_entries.nr; i++) { 580const char*path = df_sorted_entries.items[i].string; 581int len =strlen(path); 582struct stage_data *e = df_sorted_entries.items[i].util; 583 584/* 585 * Check if last_file & path correspond to a D/F conflict; 586 * i.e. whether path is last_file+'/'+<something>. 587 * If so, record that it's okay to remove last_file to make 588 * room for path and friends if needed. 589 */ 590if(last_file && 591 len > last_len && 592memcmp(path, last_file, last_len) ==0&& 593 path[last_len] =='/') { 594string_list_insert(&o->df_conflict_file_set, last_file); 595} 596 597/* 598 * Determine whether path could exist as a file in the 599 * working directory as a possible D/F conflict. This 600 * will only occur when it exists in stage 2 as a 601 * file. 602 */ 603if(S_ISREG(e->stages[2].mode) ||S_ISLNK(e->stages[2].mode)) { 604 last_file = path; 605 last_len = len; 606}else{ 607 last_file = NULL; 608} 609} 610string_list_clear(&df_sorted_entries,0); 611} 612 613struct rename { 614struct diff_filepair *pair; 615/* 616 * Purpose of src_entry and dst_entry: 617 * 618 * If 'before' is renamed to 'after' then src_entry will contain 619 * the versions of 'before' from the merge_base, HEAD, and MERGE in 620 * stages 1, 2, and 3; dst_entry will contain the respective 621 * versions of 'after' in corresponding locations. Thus, we have a 622 * total of six modes and oids, though some will be null. (Stage 0 623 * is ignored; we're interested in handling conflicts.) 624 * 625 * Since we don't turn on break-rewrites by default, neither 626 * src_entry nor dst_entry can have all three of their stages have 627 * non-null oids, meaning at most four of the six will be non-null. 628 * Also, since this is a rename, both src_entry and dst_entry will 629 * have at least one non-null oid, meaning at least two will be 630 * non-null. Of the six oids, a typical rename will have three be 631 * non-null. Only two implies a rename/delete, and four implies a 632 * rename/add. 633 */ 634struct stage_data *src_entry; 635struct stage_data *dst_entry; 636unsigned add_turned_into_rename:1; 637unsigned processed:1; 638}; 639 640static intupdate_stages(struct merge_options *opt,const char*path, 641const struct diff_filespec *o, 642const struct diff_filespec *a, 643const struct diff_filespec *b) 644{ 645 646/* 647 * NOTE: It is usually a bad idea to call update_stages on a path 648 * before calling update_file on that same path, since it can 649 * sometimes lead to spurious "refusing to lose untracked file..." 650 * messages from update_file (via make_room_for path via 651 * would_lose_untracked). Instead, reverse the order of the calls 652 * (executing update_file first and then update_stages). 653 */ 654int clear =1; 655int options = ADD_CACHE_OK_TO_ADD | ADD_CACHE_SKIP_DFCHECK; 656if(clear) 657if(remove_file_from_cache(path)) 658return-1; 659if(o) 660if(add_cacheinfo(opt, o->mode, &o->oid, path,1,0, options)) 661return-1; 662if(a) 663if(add_cacheinfo(opt, a->mode, &a->oid, path,2,0, options)) 664return-1; 665if(b) 666if(add_cacheinfo(opt, b->mode, &b->oid, path,3,0, options)) 667return-1; 668return0; 669} 670 671static intupdate_stages_for_stage_data(struct merge_options *opt, 672const char*path, 673const struct stage_data *stage_data) 674{ 675struct diff_filespec o, a, b; 676 677 o.mode = stage_data->stages[1].mode; 678oidcpy(&o.oid, &stage_data->stages[1].oid); 679 680 a.mode = stage_data->stages[2].mode; 681oidcpy(&a.oid, &stage_data->stages[2].oid); 682 683 b.mode = stage_data->stages[3].mode; 684oidcpy(&b.oid, &stage_data->stages[3].oid); 685 686returnupdate_stages(opt, path, 687is_null_oid(&o.oid) ? NULL : &o, 688is_null_oid(&a.oid) ? NULL : &a, 689is_null_oid(&b.oid) ? NULL : &b); 690} 691 692static voidupdate_entry(struct stage_data *entry, 693struct diff_filespec *o, 694struct diff_filespec *a, 695struct diff_filespec *b) 696{ 697 entry->processed =0; 698 entry->stages[1].mode = o->mode; 699 entry->stages[2].mode = a->mode; 700 entry->stages[3].mode = b->mode; 701oidcpy(&entry->stages[1].oid, &o->oid); 702oidcpy(&entry->stages[2].oid, &a->oid); 703oidcpy(&entry->stages[3].oid, &b->oid); 704} 705 706static intremove_file(struct merge_options *o,int clean, 707const char*path,int no_wd) 708{ 709int update_cache = o->call_depth || clean; 710int update_working_directory = !o->call_depth && !no_wd; 711 712if(update_cache) { 713if(remove_file_from_cache(path)) 714return-1; 715} 716if(update_working_directory) { 717if(ignore_case) { 718struct cache_entry *ce; 719 ce =cache_file_exists(path,strlen(path), ignore_case); 720if(ce &&ce_stage(ce) ==0&&strcmp(path, ce->name)) 721return0; 722} 723if(remove_path(path)) 724return-1; 725} 726return0; 727} 728 729/* add a string to a strbuf, but converting "/" to "_" */ 730static voidadd_flattened_path(struct strbuf *out,const char*s) 731{ 732size_t i = out->len; 733strbuf_addstr(out, s); 734for(; i < out->len; i++) 735if(out->buf[i] =='/') 736 out->buf[i] ='_'; 737} 738 739static char*unique_path(struct merge_options *o,const char*path,const char*branch) 740{ 741struct path_hashmap_entry *entry; 742struct strbuf newpath = STRBUF_INIT; 743int suffix =0; 744size_t base_len; 745 746strbuf_addf(&newpath,"%s~", path); 747add_flattened_path(&newpath, branch); 748 749 base_len = newpath.len; 750while(hashmap_get_from_hash(&o->current_file_dir_set, 751path_hash(newpath.buf), newpath.buf) || 752(!o->call_depth &&file_exists(newpath.buf))) { 753strbuf_setlen(&newpath, base_len); 754strbuf_addf(&newpath,"_%d", suffix++); 755} 756 757FLEX_ALLOC_MEM(entry, path, newpath.buf, newpath.len); 758hashmap_entry_init(entry,path_hash(entry->path)); 759hashmap_add(&o->current_file_dir_set, entry); 760returnstrbuf_detach(&newpath, NULL); 761} 762 763/** 764 * Check whether a directory in the index is in the way of an incoming 765 * file. Return 1 if so. If check_working_copy is non-zero, also 766 * check the working directory. If empty_ok is non-zero, also return 767 * 0 in the case where the working-tree dir exists but is empty. 768 */ 769static intdir_in_way(const char*path,int check_working_copy,int empty_ok) 770{ 771int pos; 772struct strbuf dirpath = STRBUF_INIT; 773struct stat st; 774 775strbuf_addstr(&dirpath, path); 776strbuf_addch(&dirpath,'/'); 777 778 pos =cache_name_pos(dirpath.buf, dirpath.len); 779 780if(pos <0) 781 pos = -1- pos; 782if(pos < active_nr && 783!strncmp(dirpath.buf, active_cache[pos]->name, dirpath.len)) { 784strbuf_release(&dirpath); 785return1; 786} 787 788strbuf_release(&dirpath); 789return check_working_copy && !lstat(path, &st) &&S_ISDIR(st.st_mode) && 790!(empty_ok &&is_empty_dir(path)); 791} 792 793/* 794 * Returns whether path was tracked in the index before the merge started, 795 * and its oid and mode match the specified values 796 */ 797static intwas_tracked_and_matches(struct merge_options *o,const char*path, 798const struct object_id *oid,unsigned mode) 799{ 800int pos =index_name_pos(&o->orig_index, path,strlen(path)); 801struct cache_entry *ce; 802 803if(0> pos) 804/* we were not tracking this path before the merge */ 805return0; 806 807/* See if the file we were tracking before matches */ 808 ce = o->orig_index.cache[pos]; 809return(oid_eq(&ce->oid, oid) && ce->ce_mode == mode); 810} 811 812/* 813 * Returns whether path was tracked in the index before the merge started 814 */ 815static intwas_tracked(struct merge_options *o,const char*path) 816{ 817int pos =index_name_pos(&o->orig_index, path,strlen(path)); 818 819if(0<= pos) 820/* we were tracking this path before the merge */ 821return1; 822 823return0; 824} 825 826static intwould_lose_untracked(const char*path) 827{ 828/* 829 * This may look like it can be simplified to: 830 * return !was_tracked(o, path) && file_exists(path) 831 * but it can't. This function needs to know whether path was in 832 * the working tree due to EITHER having been tracked in the index 833 * before the merge OR having been put into the working copy and 834 * index by unpack_trees(). Due to that either-or requirement, we 835 * check the current index instead of the original one. 836 * 837 * Note that we do not need to worry about merge-recursive itself 838 * updating the index after unpack_trees() and before calling this 839 * function, because we strictly require all code paths in 840 * merge-recursive to update the working tree first and the index 841 * second. Doing otherwise would break 842 * update_file()/would_lose_untracked(); see every comment in this 843 * file which mentions "update_stages". 844 */ 845int pos =cache_name_pos(path,strlen(path)); 846 847if(pos <0) 848 pos = -1- pos; 849while(pos < active_nr && 850!strcmp(path, active_cache[pos]->name)) { 851/* 852 * If stage #0, it is definitely tracked. 853 * If it has stage #2 then it was tracked 854 * before this merge started. All other 855 * cases the path was not tracked. 856 */ 857switch(ce_stage(active_cache[pos])) { 858case0: 859case2: 860return0; 861} 862 pos++; 863} 864returnfile_exists(path); 865} 866 867static intwas_dirty(struct merge_options *o,const char*path) 868{ 869struct cache_entry *ce; 870int dirty =1; 871 872if(o->call_depth || !was_tracked(o, path)) 873return!dirty; 874 875 ce =index_file_exists(o->unpack_opts.src_index, 876 path,strlen(path), ignore_case); 877 dirty =verify_uptodate(ce, &o->unpack_opts) !=0; 878return dirty; 879} 880 881static intmake_room_for_path(struct merge_options *o,const char*path) 882{ 883int status, i; 884const char*msg =_("failed to create path '%s'%s"); 885 886/* Unlink any D/F conflict files that are in the way */ 887for(i =0; i < o->df_conflict_file_set.nr; i++) { 888const char*df_path = o->df_conflict_file_set.items[i].string; 889size_t pathlen =strlen(path); 890size_t df_pathlen =strlen(df_path); 891if(df_pathlen < pathlen && 892 path[df_pathlen] =='/'&& 893strncmp(path, df_path, df_pathlen) ==0) { 894output(o,3, 895_("Removing%sto make room for subdirectory\n"), 896 df_path); 897unlink(df_path); 898unsorted_string_list_delete_item(&o->df_conflict_file_set, 899 i,0); 900break; 901} 902} 903 904/* Make sure leading directories are created */ 905 status =safe_create_leading_directories_const(path); 906if(status) { 907if(status == SCLD_EXISTS) 908/* something else exists */ 909returnerr(o, msg, path,_(": perhaps a D/F conflict?")); 910returnerr(o, msg, path,""); 911} 912 913/* 914 * Do not unlink a file in the work tree if we are not 915 * tracking it. 916 */ 917if(would_lose_untracked(path)) 918returnerr(o,_("refusing to lose untracked file at '%s'"), 919 path); 920 921/* Successful unlink is good.. */ 922if(!unlink(path)) 923return0; 924/* .. and so is no existing file */ 925if(errno == ENOENT) 926return0; 927/* .. but not some other error (who really cares what?) */ 928returnerr(o, msg, path,_(": perhaps a D/F conflict?")); 929} 930 931static intupdate_file_flags(struct merge_options *o, 932const struct object_id *oid, 933unsigned mode, 934const char*path, 935int update_cache, 936int update_wd) 937{ 938int ret =0; 939 940if(o->call_depth) 941 update_wd =0; 942 943if(update_wd) { 944enum object_type type; 945void*buf; 946unsigned long size; 947 948if(S_ISGITLINK(mode)) { 949/* 950 * We may later decide to recursively descend into 951 * the submodule directory and update its index 952 * and/or work tree, but we do not do that now. 953 */ 954 update_wd =0; 955goto update_index; 956} 957 958 buf =read_object_file(oid, &type, &size); 959if(!buf) 960returnerr(o,_("cannot read object%s'%s'"),oid_to_hex(oid), path); 961if(type != OBJ_BLOB) { 962 ret =err(o,_("blob expected for%s'%s'"),oid_to_hex(oid), path); 963goto free_buf; 964} 965if(S_ISREG(mode)) { 966struct strbuf strbuf = STRBUF_INIT; 967if(convert_to_working_tree(path, buf, size, &strbuf)) { 968free(buf); 969 size = strbuf.len; 970 buf =strbuf_detach(&strbuf, NULL); 971} 972} 973 974if(make_room_for_path(o, path) <0) { 975 update_wd =0; 976goto free_buf; 977} 978if(S_ISREG(mode) || (!has_symlinks &&S_ISLNK(mode))) { 979int fd; 980if(mode &0100) 981 mode =0777; 982else 983 mode =0666; 984 fd =open(path, O_WRONLY | O_TRUNC | O_CREAT, mode); 985if(fd <0) { 986 ret =err(o,_("failed to open '%s':%s"), 987 path,strerror(errno)); 988goto free_buf; 989} 990write_in_full(fd, buf, size); 991close(fd); 992}else if(S_ISLNK(mode)) { 993char*lnk =xmemdupz(buf, size); 994safe_create_leading_directories_const(path); 995unlink(path); 996if(symlink(lnk, path)) 997 ret =err(o,_("failed to symlink '%s':%s"), 998 path,strerror(errno)); 999free(lnk);1000}else1001 ret =err(o,1002_("do not know what to do with%06o%s'%s'"),1003 mode,oid_to_hex(oid), path);1004 free_buf:1005free(buf);1006}1007 update_index:1008if(!ret && update_cache)1009if(add_cacheinfo(o, mode, oid, path,0, update_wd,1010 ADD_CACHE_OK_TO_ADD))1011return-1;1012return ret;1013}10141015static intupdate_file(struct merge_options *o,1016int clean,1017const struct object_id *oid,1018unsigned mode,1019const char*path)1020{1021returnupdate_file_flags(o, oid, mode, path, o->call_depth || clean, !o->call_depth);1022}10231024/* Low level file merging, update and removal */10251026struct merge_file_info {1027struct object_id oid;1028unsigned mode;1029unsigned clean:1,1030 merge:1;1031};10321033static intmerge_3way(struct merge_options *o,1034 mmbuffer_t *result_buf,1035const struct diff_filespec *one,1036const struct diff_filespec *a,1037const struct diff_filespec *b,1038const char*branch1,1039const char*branch2)1040{1041 mmfile_t orig, src1, src2;1042struct ll_merge_options ll_opts = {0};1043char*base_name, *name1, *name2;1044int merge_status;10451046 ll_opts.renormalize = o->renormalize;1047 ll_opts.xdl_opts = o->xdl_opts;10481049if(o->call_depth) {1050 ll_opts.virtual_ancestor =1;1051 ll_opts.variant =0;1052}else{1053switch(o->recursive_variant) {1054case MERGE_RECURSIVE_OURS:1055 ll_opts.variant = XDL_MERGE_FAVOR_OURS;1056break;1057case MERGE_RECURSIVE_THEIRS:1058 ll_opts.variant = XDL_MERGE_FAVOR_THEIRS;1059break;1060default:1061 ll_opts.variant =0;1062break;1063}1064}10651066if(strcmp(a->path, b->path) ||1067(o->ancestor != NULL &&strcmp(a->path, one->path) !=0)) {1068 base_name = o->ancestor == NULL ? NULL :1069mkpathdup("%s:%s", o->ancestor, one->path);1070 name1 =mkpathdup("%s:%s", branch1, a->path);1071 name2 =mkpathdup("%s:%s", branch2, b->path);1072}else{1073 base_name = o->ancestor == NULL ? NULL :1074mkpathdup("%s", o->ancestor);1075 name1 =mkpathdup("%s", branch1);1076 name2 =mkpathdup("%s", branch2);1077}10781079read_mmblob(&orig, &one->oid);1080read_mmblob(&src1, &a->oid);1081read_mmblob(&src2, &b->oid);10821083 merge_status =ll_merge(result_buf, a->path, &orig, base_name,1084&src1, name1, &src2, name2, &ll_opts);10851086free(base_name);1087free(name1);1088free(name2);1089free(orig.ptr);1090free(src1.ptr);1091free(src2.ptr);1092return merge_status;1093}10941095static intfind_first_merges(struct object_array *result,const char*path,1096struct commit *a,struct commit *b)1097{1098int i, j;1099struct object_array merges = OBJECT_ARRAY_INIT;1100struct commit *commit;1101int contains_another;11021103char merged_revision[42];1104const char*rev_args[] = {"rev-list","--merges","--ancestry-path",1105"--all", merged_revision, NULL };1106struct rev_info revs;1107struct setup_revision_opt rev_opts;11081109memset(result,0,sizeof(struct object_array));1110memset(&rev_opts,0,sizeof(rev_opts));11111112/* get all revisions that merge commit a */1113xsnprintf(merged_revision,sizeof(merged_revision),"^%s",1114oid_to_hex(&a->object.oid));1115init_revisions(&revs, NULL);1116 rev_opts.submodule = path;1117/* FIXME: can't handle linked worktrees in submodules yet */1118 revs.single_worktree = path != NULL;1119setup_revisions(ARRAY_SIZE(rev_args)-1, rev_args, &revs, &rev_opts);11201121/* save all revisions from the above list that contain b */1122if(prepare_revision_walk(&revs))1123die("revision walk setup failed");1124while((commit =get_revision(&revs)) != NULL) {1125struct object *o = &(commit->object);1126if(in_merge_bases(b, commit))1127add_object_array(o, NULL, &merges);1128}1129reset_revision_walk();11301131/* Now we've got all merges that contain a and b. Prune all1132 * merges that contain another found merge and save them in1133 * result.1134 */1135for(i =0; i < merges.nr; i++) {1136struct commit *m1 = (struct commit *) merges.objects[i].item;11371138 contains_another =0;1139for(j =0; j < merges.nr; j++) {1140struct commit *m2 = (struct commit *) merges.objects[j].item;1141if(i != j &&in_merge_bases(m2, m1)) {1142 contains_another =1;1143break;1144}1145}11461147if(!contains_another)1148add_object_array(merges.objects[i].item, NULL, result);1149}11501151object_array_clear(&merges);1152return result->nr;1153}11541155static voidprint_commit(struct commit *commit)1156{1157struct strbuf sb = STRBUF_INIT;1158struct pretty_print_context ctx = {0};1159 ctx.date_mode.type = DATE_NORMAL;1160format_commit_message(commit,"%h:%m %s", &sb, &ctx);1161fprintf(stderr,"%s\n", sb.buf);1162strbuf_release(&sb);1163}11641165static intmerge_submodule(struct merge_options *o,1166struct object_id *result,const char*path,1167const struct object_id *base,const struct object_id *a,1168const struct object_id *b)1169{1170struct commit *commit_base, *commit_a, *commit_b;1171int parent_count;1172struct object_array merges;11731174int i;1175int search = !o->call_depth;11761177/* store a in result in case we fail */1178oidcpy(result, a);11791180/* we can not handle deletion conflicts */1181if(is_null_oid(base))1182return0;1183if(is_null_oid(a))1184return0;1185if(is_null_oid(b))1186return0;11871188if(add_submodule_odb(path)) {1189output(o,1,_("Failed to merge submodule%s(not checked out)"), path);1190return0;1191}11921193if(!(commit_base =lookup_commit_reference(base)) ||1194!(commit_a =lookup_commit_reference(a)) ||1195!(commit_b =lookup_commit_reference(b))) {1196output(o,1,_("Failed to merge submodule%s(commits not present)"), path);1197return0;1198}11991200/* check whether both changes are forward */1201if(!in_merge_bases(commit_base, commit_a) ||1202!in_merge_bases(commit_base, commit_b)) {1203output(o,1,_("Failed to merge submodule%s(commits don't follow merge-base)"), path);1204return0;1205}12061207/* Case #1: a is contained in b or vice versa */1208if(in_merge_bases(commit_a, commit_b)) {1209oidcpy(result, b);1210if(show(o,3)) {1211output(o,3,_("Fast-forwarding submodule%sto the following commit:"), path);1212output_commit_title(o, commit_b);1213}else if(show(o,2))1214output(o,2,_("Fast-forwarding submodule%s"), path);1215else1216;/* no output */12171218return1;1219}1220if(in_merge_bases(commit_b, commit_a)) {1221oidcpy(result, a);1222if(show(o,3)) {1223output(o,3,_("Fast-forwarding submodule%sto the following commit:"), path);1224output_commit_title(o, commit_a);1225}else if(show(o,2))1226output(o,2,_("Fast-forwarding submodule%s"), path);1227else1228;/* no output */12291230return1;1231}12321233/*1234 * Case #2: There are one or more merges that contain a and b in1235 * the submodule. If there is only one, then present it as a1236 * suggestion to the user, but leave it marked unmerged so the1237 * user needs to confirm the resolution.1238 */12391240/* Skip the search if makes no sense to the calling context. */1241if(!search)1242return0;12431244/* find commit which merges them */1245 parent_count =find_first_merges(&merges, path, commit_a, commit_b);1246switch(parent_count) {1247case0:1248output(o,1,_("Failed to merge submodule%s(merge following commits not found)"), path);1249break;12501251case1:1252output(o,1,_("Failed to merge submodule%s(not fast-forward)"), path);1253output(o,2,_("Found a possible merge resolution for the submodule:\n"));1254print_commit((struct commit *) merges.objects[0].item);1255output(o,2,_(1256"If this is correct simply add it to the index "1257"for example\n"1258"by using:\n\n"1259" git update-index --cacheinfo 160000%s\"%s\"\n\n"1260"which will accept this suggestion.\n"),1261oid_to_hex(&merges.objects[0].item->oid), path);1262break;12631264default:1265output(o,1,_("Failed to merge submodule%s(multiple merges found)"), path);1266for(i =0; i < merges.nr; i++)1267print_commit((struct commit *) merges.objects[i].item);1268}12691270object_array_clear(&merges);1271return0;1272}12731274static intmerge_file_1(struct merge_options *o,1275const struct diff_filespec *one,1276const struct diff_filespec *a,1277const struct diff_filespec *b,1278const char*filename,1279const char*branch1,1280const char*branch2,1281struct merge_file_info *result)1282{1283 result->merge =0;1284 result->clean =1;12851286if((S_IFMT & a->mode) != (S_IFMT & b->mode)) {1287 result->clean =0;1288if(S_ISREG(a->mode)) {1289 result->mode = a->mode;1290oidcpy(&result->oid, &a->oid);1291}else{1292 result->mode = b->mode;1293oidcpy(&result->oid, &b->oid);1294}1295}else{1296if(!oid_eq(&a->oid, &one->oid) && !oid_eq(&b->oid, &one->oid))1297 result->merge =1;12981299/*1300 * Merge modes1301 */1302if(a->mode == b->mode || a->mode == one->mode)1303 result->mode = b->mode;1304else{1305 result->mode = a->mode;1306if(b->mode != one->mode) {1307 result->clean =0;1308 result->merge =1;1309}1310}13111312if(oid_eq(&a->oid, &b->oid) ||oid_eq(&a->oid, &one->oid))1313oidcpy(&result->oid, &b->oid);1314else if(oid_eq(&b->oid, &one->oid))1315oidcpy(&result->oid, &a->oid);1316else if(S_ISREG(a->mode)) {1317 mmbuffer_t result_buf;1318int ret =0, merge_status;13191320 merge_status =merge_3way(o, &result_buf, one, a, b,1321 branch1, branch2);13221323if((merge_status <0) || !result_buf.ptr)1324 ret =err(o,_("Failed to execute internal merge"));13251326if(!ret &&1327write_object_file(result_buf.ptr, result_buf.size,1328 blob_type, &result->oid))1329 ret =err(o,_("Unable to add%sto database"),1330 a->path);13311332free(result_buf.ptr);1333if(ret)1334return ret;1335 result->clean = (merge_status ==0);1336}else if(S_ISGITLINK(a->mode)) {1337 result->clean =merge_submodule(o, &result->oid,1338 one->path,1339&one->oid,1340&a->oid,1341&b->oid);1342}else if(S_ISLNK(a->mode)) {1343switch(o->recursive_variant) {1344case MERGE_RECURSIVE_NORMAL:1345oidcpy(&result->oid, &a->oid);1346if(!oid_eq(&a->oid, &b->oid))1347 result->clean =0;1348break;1349case MERGE_RECURSIVE_OURS:1350oidcpy(&result->oid, &a->oid);1351break;1352case MERGE_RECURSIVE_THEIRS:1353oidcpy(&result->oid, &b->oid);1354break;1355}1356}else1357BUG("unsupported object type in the tree");1358}13591360if(result->merge)1361output(o,2,_("Auto-merging%s"), filename);13621363return0;1364}13651366static intmerge_file_special_markers(struct merge_options *o,1367const struct diff_filespec *one,1368const struct diff_filespec *a,1369const struct diff_filespec *b,1370const char*target_filename,1371const char*branch1,1372const char*filename1,1373const char*branch2,1374const char*filename2,1375struct merge_file_info *mfi)1376{1377char*side1 = NULL;1378char*side2 = NULL;1379int ret;13801381if(filename1)1382 side1 =xstrfmt("%s:%s", branch1, filename1);1383if(filename2)1384 side2 =xstrfmt("%s:%s", branch2, filename2);13851386 ret =merge_file_1(o, one, a, b, target_filename,1387 side1 ? side1 : branch1,1388 side2 ? side2 : branch2, mfi);13891390free(side1);1391free(side2);1392return ret;1393}13941395static intmerge_file_one(struct merge_options *o,1396const char*path,1397const struct object_id *o_oid,int o_mode,1398const struct object_id *a_oid,int a_mode,1399const struct object_id *b_oid,int b_mode,1400const char*branch1,1401const char*branch2,1402struct merge_file_info *mfi)1403{1404struct diff_filespec one, a, b;14051406 one.path = a.path = b.path = (char*)path;1407oidcpy(&one.oid, o_oid);1408 one.mode = o_mode;1409oidcpy(&a.oid, a_oid);1410 a.mode = a_mode;1411oidcpy(&b.oid, b_oid);1412 b.mode = b_mode;1413returnmerge_file_1(o, &one, &a, &b, path, branch1, branch2, mfi);1414}14151416static intconflict_rename_dir(struct merge_options *o,1417struct diff_filepair *pair,1418const char*rename_branch,1419const char*other_branch)1420{1421const struct diff_filespec *dest = pair->two;14221423if(!o->call_depth &&would_lose_untracked(dest->path)) {1424char*alt_path =unique_path(o, dest->path, rename_branch);14251426output(o,1,_("Error: Refusing to lose untracked file at%s; "1427"writing to%sinstead."),1428 dest->path, alt_path);1429/*1430 * Write the file in worktree at alt_path, but not in the1431 * index. Instead, write to dest->path for the index but1432 * only at the higher appropriate stage.1433 */1434if(update_file(o,0, &dest->oid, dest->mode, alt_path))1435return-1;1436free(alt_path);1437returnupdate_stages(o, dest->path, NULL,1438 rename_branch == o->branch1 ? dest : NULL,1439 rename_branch == o->branch1 ? NULL : dest);1440}14411442/* Update dest->path both in index and in worktree */1443if(update_file(o,1, &dest->oid, dest->mode, dest->path))1444return-1;1445return0;1446}14471448static inthandle_change_delete(struct merge_options *o,1449const char*path,const char*old_path,1450const struct object_id *o_oid,int o_mode,1451const struct object_id *changed_oid,1452int changed_mode,1453const char*change_branch,1454const char*delete_branch,1455const char*change,const char*change_past)1456{1457char*alt_path = NULL;1458const char*update_path = path;1459int ret =0;14601461if(dir_in_way(path, !o->call_depth,0) ||1462(!o->call_depth &&would_lose_untracked(path))) {1463 update_path = alt_path =unique_path(o, path, change_branch);1464}14651466if(o->call_depth) {1467/*1468 * We cannot arbitrarily accept either a_sha or b_sha as1469 * correct; since there is no true "middle point" between1470 * them, simply reuse the base version for virtual merge base.1471 */1472 ret =remove_file_from_cache(path);1473if(!ret)1474 ret =update_file(o,0, o_oid, o_mode, update_path);1475}else{1476if(!alt_path) {1477if(!old_path) {1478output(o,1,_("CONFLICT (%s/delete):%sdeleted in%s"1479"and%sin%s. Version%sof%sleft in tree."),1480 change, path, delete_branch, change_past,1481 change_branch, change_branch, path);1482}else{1483output(o,1,_("CONFLICT (%s/delete):%sdeleted in%s"1484"and%sto%sin%s. Version%sof%sleft in tree."),1485 change, old_path, delete_branch, change_past, path,1486 change_branch, change_branch, path);1487}1488}else{1489if(!old_path) {1490output(o,1,_("CONFLICT (%s/delete):%sdeleted in%s"1491"and%sin%s. Version%sof%sleft in tree at%s."),1492 change, path, delete_branch, change_past,1493 change_branch, change_branch, path, alt_path);1494}else{1495output(o,1,_("CONFLICT (%s/delete):%sdeleted in%s"1496"and%sto%sin%s. Version%sof%sleft in tree at%s."),1497 change, old_path, delete_branch, change_past, path,1498 change_branch, change_branch, path, alt_path);1499}1500}1501/*1502 * No need to call update_file() on path when change_branch ==1503 * o->branch1 && !alt_path, since that would needlessly touch1504 * path. We could call update_file_flags() with update_cache=01505 * and update_wd=0, but that's a no-op.1506 */1507if(change_branch != o->branch1 || alt_path)1508 ret =update_file(o,0, changed_oid, changed_mode, update_path);1509}1510free(alt_path);15111512return ret;1513}15141515static intconflict_rename_delete(struct merge_options *o,1516struct diff_filepair *pair,1517const char*rename_branch,1518const char*delete_branch)1519{1520const struct diff_filespec *orig = pair->one;1521const struct diff_filespec *dest = pair->two;15221523if(handle_change_delete(o,1524 o->call_depth ? orig->path : dest->path,1525 o->call_depth ? NULL : orig->path,1526&orig->oid, orig->mode,1527&dest->oid, dest->mode,1528 rename_branch, delete_branch,1529_("rename"),_("renamed")))1530return-1;15311532if(o->call_depth)1533returnremove_file_from_cache(dest->path);1534else1535returnupdate_stages(o, dest->path, NULL,1536 rename_branch == o->branch1 ? dest : NULL,1537 rename_branch == o->branch1 ? NULL : dest);1538}15391540static struct diff_filespec *filespec_from_entry(struct diff_filespec *target,1541struct stage_data *entry,1542int stage)1543{1544struct object_id *oid = &entry->stages[stage].oid;1545unsigned mode = entry->stages[stage].mode;1546if(mode ==0||is_null_oid(oid))1547return NULL;1548oidcpy(&target->oid, oid);1549 target->mode = mode;1550return target;1551}15521553static inthandle_file(struct merge_options *o,1554struct diff_filespec *rename,1555int stage,1556struct rename_conflict_info *ci)1557{1558char*dst_name = rename->path;1559struct stage_data *dst_entry;1560const char*cur_branch, *other_branch;1561struct diff_filespec other;1562struct diff_filespec *add;1563int ret;15641565if(stage ==2) {1566 dst_entry = ci->dst_entry1;1567 cur_branch = ci->branch1;1568 other_branch = ci->branch2;1569}else{1570 dst_entry = ci->dst_entry2;1571 cur_branch = ci->branch2;1572 other_branch = ci->branch1;1573}15741575 add =filespec_from_entry(&other, dst_entry, stage ^1);1576if(add) {1577int ren_src_was_dirty =was_dirty(o, rename->path);1578char*add_name =unique_path(o, rename->path, other_branch);1579if(update_file(o,0, &add->oid, add->mode, add_name))1580return-1;15811582if(ren_src_was_dirty) {1583output(o,1,_("Refusing to lose dirty file at%s"),1584 rename->path);1585}1586/*1587 * Because the double negatives somehow keep confusing me...1588 * 1) update_wd iff !ren_src_was_dirty.1589 * 2) no_wd iff !update_wd1590 * 3) so, no_wd == !!ren_src_was_dirty == ren_src_was_dirty1591 */1592remove_file(o,0, rename->path, ren_src_was_dirty);1593 dst_name =unique_path(o, rename->path, cur_branch);1594}else{1595if(dir_in_way(rename->path, !o->call_depth,0)) {1596 dst_name =unique_path(o, rename->path, cur_branch);1597output(o,1,_("%sis a directory in%sadding as%sinstead"),1598 rename->path, other_branch, dst_name);1599}else if(!o->call_depth &&1600would_lose_untracked(rename->path)) {1601 dst_name =unique_path(o, rename->path, cur_branch);1602output(o,1,_("Refusing to lose untracked file at%s; "1603"adding as%sinstead"),1604 rename->path, dst_name);1605}1606}1607if((ret =update_file(o,0, &rename->oid, rename->mode, dst_name)))1608;/* fall through, do allow dst_name to be released */1609else if(stage ==2)1610 ret =update_stages(o, rename->path, NULL, rename, add);1611else1612 ret =update_stages(o, rename->path, NULL, add, rename);16131614if(dst_name != rename->path)1615free(dst_name);16161617return ret;1618}16191620static intconflict_rename_rename_1to2(struct merge_options *o,1621struct rename_conflict_info *ci)1622{1623/* One file was renamed in both branches, but to different names. */1624struct diff_filespec *one = ci->pair1->one;1625struct diff_filespec *a = ci->pair1->two;1626struct diff_filespec *b = ci->pair2->two;16271628output(o,1,_("CONFLICT (rename/rename): "1629"Rename\"%s\"->\"%s\"in branch\"%s\""1630"rename\"%s\"->\"%s\"in\"%s\"%s"),1631 one->path, a->path, ci->branch1,1632 one->path, b->path, ci->branch2,1633 o->call_depth ?_(" (left unresolved)") :"");1634if(o->call_depth) {1635struct merge_file_info mfi;1636struct diff_filespec other;1637struct diff_filespec *add;1638if(merge_file_one(o, one->path,1639&one->oid, one->mode,1640&a->oid, a->mode,1641&b->oid, b->mode,1642 ci->branch1, ci->branch2, &mfi))1643return-1;16441645/*1646 * FIXME: For rename/add-source conflicts (if we could detect1647 * such), this is wrong. We should instead find a unique1648 * pathname and then either rename the add-source file to that1649 * unique path, or use that unique path instead of src here.1650 */1651if(update_file(o,0, &mfi.oid, mfi.mode, one->path))1652return-1;16531654/*1655 * Above, we put the merged content at the merge-base's1656 * path. Now we usually need to delete both a->path and1657 * b->path. However, the rename on each side of the merge1658 * could also be involved in a rename/add conflict. In1659 * such cases, we should keep the added file around,1660 * resolving the conflict at that path in its favor.1661 */1662 add =filespec_from_entry(&other, ci->dst_entry1,2^1);1663if(add) {1664if(update_file(o,0, &add->oid, add->mode, a->path))1665return-1;1666}1667else1668remove_file_from_cache(a->path);1669 add =filespec_from_entry(&other, ci->dst_entry2,3^1);1670if(add) {1671if(update_file(o,0, &add->oid, add->mode, b->path))1672return-1;1673}1674else1675remove_file_from_cache(b->path);1676}else if(handle_file(o, a,2, ci) ||handle_file(o, b,3, ci))1677return-1;16781679return0;1680}16811682static intconflict_rename_rename_2to1(struct merge_options *o,1683struct rename_conflict_info *ci)1684{1685/* Two files, a & b, were renamed to the same thing, c. */1686struct diff_filespec *a = ci->pair1->one;1687struct diff_filespec *b = ci->pair2->one;1688struct diff_filespec *c1 = ci->pair1->two;1689struct diff_filespec *c2 = ci->pair2->two;1690char*path = c1->path;/* == c2->path */1691char*path_side_1_desc;1692char*path_side_2_desc;1693struct merge_file_info mfi_c1;1694struct merge_file_info mfi_c2;1695int ret;16961697output(o,1,_("CONFLICT (rename/rename): "1698"Rename%s->%sin%s. "1699"Rename%s->%sin%s"),1700 a->path, c1->path, ci->branch1,1701 b->path, c2->path, ci->branch2);17021703remove_file(o,1, a->path, o->call_depth ||would_lose_untracked(a->path));1704remove_file(o,1, b->path, o->call_depth ||would_lose_untracked(b->path));17051706 path_side_1_desc =xstrfmt("%s(was%s)", path, a->path);1707 path_side_2_desc =xstrfmt("%s(was%s)", path, b->path);1708if(merge_file_special_markers(o, a, c1, &ci->ren1_other,1709 path_side_1_desc,1710 o->branch1, c1->path,1711 o->branch2, ci->ren1_other.path, &mfi_c1) ||1712merge_file_special_markers(o, b, &ci->ren2_other, c2,1713 path_side_2_desc,1714 o->branch1, ci->ren2_other.path,1715 o->branch2, c2->path, &mfi_c2))1716return-1;1717free(path_side_1_desc);1718free(path_side_2_desc);17191720if(o->call_depth) {1721/*1722 * If mfi_c1.clean && mfi_c2.clean, then it might make1723 * sense to do a two-way merge of those results. But, I1724 * think in all cases, it makes sense to have the virtual1725 * merge base just undo the renames; they can be detected1726 * again later for the non-recursive merge.1727 */1728remove_file(o,0, path,0);1729 ret =update_file(o,0, &mfi_c1.oid, mfi_c1.mode, a->path);1730if(!ret)1731 ret =update_file(o,0, &mfi_c2.oid, mfi_c2.mode,1732 b->path);1733}else{1734char*new_path1 =unique_path(o, path, ci->branch1);1735char*new_path2 =unique_path(o, path, ci->branch2);1736output(o,1,_("Renaming%sto%sand%sto%sinstead"),1737 a->path, new_path1, b->path, new_path2);1738if(was_dirty(o, path))1739output(o,1,_("Refusing to lose dirty file at%s"),1740 path);1741else if(would_lose_untracked(path))1742/*1743 * Only way we get here is if both renames were from1744 * a directory rename AND user had an untracked file1745 * at the location where both files end up after the1746 * two directory renames. See testcase 10d of t6043.1747 */1748output(o,1,_("Refusing to lose untracked file at "1749"%s, even though it's in the way."),1750 path);1751else1752remove_file(o,0, path,0);1753 ret =update_file(o,0, &mfi_c1.oid, mfi_c1.mode, new_path1);1754if(!ret)1755 ret =update_file(o,0, &mfi_c2.oid, mfi_c2.mode,1756 new_path2);1757/*1758 * unpack_trees() actually populates the index for us for1759 * "normal" rename/rename(2to1) situtations so that the1760 * correct entries are at the higher stages, which would1761 * make the call below to update_stages_for_stage_data1762 * unnecessary. However, if either of the renames came1763 * from a directory rename, then unpack_trees() will not1764 * have gotten the right data loaded into the index, so we1765 * need to do so now. (While it'd be tempting to move this1766 * call to update_stages_for_stage_data() to1767 * apply_directory_rename_modifications(), that would break1768 * our intermediate calls to would_lose_untracked() since1769 * those rely on the current in-memory index. See also the1770 * big "NOTE" in update_stages()).1771 */1772if(update_stages_for_stage_data(o, path, ci->dst_entry1))1773 ret = -1;17741775free(new_path2);1776free(new_path1);1777}17781779return ret;1780}17811782/*1783 * Get the diff_filepairs changed between o_tree and tree.1784 */1785static struct diff_queue_struct *get_diffpairs(struct merge_options *o,1786struct tree *o_tree,1787struct tree *tree)1788{1789struct diff_queue_struct *ret;1790struct diff_options opts;17911792diff_setup(&opts);1793 opts.flags.recursive =1;1794 opts.flags.rename_empty =0;1795 opts.detect_rename =merge_detect_rename(o);1796/*1797 * We do not have logic to handle the detection of copies. In1798 * fact, it may not even make sense to add such logic: would we1799 * really want a change to a base file to be propagated through1800 * multiple other files by a merge?1801 */1802if(opts.detect_rename > DIFF_DETECT_RENAME)1803 opts.detect_rename = DIFF_DETECT_RENAME;1804 opts.rename_limit = o->merge_rename_limit >=0? o->merge_rename_limit :1805 o->diff_rename_limit >=0? o->diff_rename_limit :18061000;1807 opts.rename_score = o->rename_score;1808 opts.show_rename_progress = o->show_rename_progress;1809 opts.output_format = DIFF_FORMAT_NO_OUTPUT;1810diff_setup_done(&opts);1811diff_tree_oid(&o_tree->object.oid, &tree->object.oid,"", &opts);1812diffcore_std(&opts);1813if(opts.needed_rename_limit > o->needed_rename_limit)1814 o->needed_rename_limit = opts.needed_rename_limit;18151816 ret =xmalloc(sizeof(*ret));1817*ret = diff_queued_diff;18181819 opts.output_format = DIFF_FORMAT_NO_OUTPUT;1820 diff_queued_diff.nr =0;1821 diff_queued_diff.queue = NULL;1822diff_flush(&opts);1823return ret;1824}18251826static inttree_has_path(struct tree *tree,const char*path)1827{1828struct object_id hashy;1829unsigned int mode_o;18301831return!get_tree_entry(&tree->object.oid, path,1832&hashy, &mode_o);1833}18341835/*1836 * Return a new string that replaces the beginning portion (which matches1837 * entry->dir), with entry->new_dir. In perl-speak:1838 * new_path_name = (old_path =~ s/entry->dir/entry->new_dir/);1839 * NOTE:1840 * Caller must ensure that old_path starts with entry->dir + '/'.1841 */1842static char*apply_dir_rename(struct dir_rename_entry *entry,1843const char*old_path)1844{1845struct strbuf new_path = STRBUF_INIT;1846int oldlen, newlen;18471848if(entry->non_unique_new_dir)1849return NULL;18501851 oldlen =strlen(entry->dir);1852 newlen = entry->new_dir.len + (strlen(old_path) - oldlen) +1;1853strbuf_grow(&new_path, newlen);1854strbuf_addbuf(&new_path, &entry->new_dir);1855strbuf_addstr(&new_path, &old_path[oldlen]);18561857returnstrbuf_detach(&new_path, NULL);1858}18591860static voidget_renamed_dir_portion(const char*old_path,const char*new_path,1861char**old_dir,char**new_dir)1862{1863char*end_of_old, *end_of_new;1864int old_len, new_len;18651866*old_dir = NULL;1867*new_dir = NULL;18681869/*1870 * For1871 * "a/b/c/d/e/foo.c" -> "a/b/some/thing/else/e/foo.c"1872 * the "e/foo.c" part is the same, we just want to know that1873 * "a/b/c/d" was renamed to "a/b/some/thing/else"1874 * so, for this example, this function returns "a/b/c/d" in1875 * *old_dir and "a/b/some/thing/else" in *new_dir.1876 *1877 * Also, if the basename of the file changed, we don't care. We1878 * want to know which portion of the directory, if any, changed.1879 */1880 end_of_old =strrchr(old_path,'/');1881 end_of_new =strrchr(new_path,'/');18821883if(end_of_old == NULL || end_of_new == NULL)1884return;1885while(*--end_of_new == *--end_of_old &&1886 end_of_old != old_path &&1887 end_of_new != new_path)1888;/* Do nothing; all in the while loop */1889/*1890 * We've found the first non-matching character in the directory1891 * paths. That means the current directory we were comparing1892 * represents the rename. Move end_of_old and end_of_new back1893 * to the full directory name.1894 */1895if(*end_of_old =='/')1896 end_of_old++;1897if(*end_of_old !='/')1898 end_of_new++;1899 end_of_old =strchr(end_of_old,'/');1900 end_of_new =strchr(end_of_new,'/');19011902/*1903 * It may have been the case that old_path and new_path were the same1904 * directory all along. Don't claim a rename if they're the same.1905 */1906 old_len = end_of_old - old_path;1907 new_len = end_of_new - new_path;19081909if(old_len != new_len ||strncmp(old_path, new_path, old_len)) {1910*old_dir =xstrndup(old_path, old_len);1911*new_dir =xstrndup(new_path, new_len);1912}1913}19141915static voidremove_hashmap_entries(struct hashmap *dir_renames,1916struct string_list *items_to_remove)1917{1918int i;1919struct dir_rename_entry *entry;19201921for(i =0; i < items_to_remove->nr; i++) {1922 entry = items_to_remove->items[i].util;1923hashmap_remove(dir_renames, entry, NULL);1924}1925string_list_clear(items_to_remove,0);1926}19271928/*1929 * See if there is a directory rename for path, and if there are any file1930 * level conflicts for the renamed location. If there is a rename and1931 * there are no conflicts, return the new name. Otherwise, return NULL.1932 */1933static char*handle_path_level_conflicts(struct merge_options *o,1934const char*path,1935struct dir_rename_entry *entry,1936struct hashmap *collisions,1937struct tree *tree)1938{1939char*new_path = NULL;1940struct collision_entry *collision_ent;1941int clean =1;1942struct strbuf collision_paths = STRBUF_INIT;19431944/*1945 * entry has the mapping of old directory name to new directory name1946 * that we want to apply to path.1947 */1948 new_path =apply_dir_rename(entry, path);19491950if(!new_path) {1951/* This should only happen when entry->non_unique_new_dir set */1952if(!entry->non_unique_new_dir)1953BUG("entry->non_unqiue_dir not set and !new_path");1954output(o,1,_("CONFLICT (directory rename split): "1955"Unclear where to place%sbecause directory "1956"%swas renamed to multiple other directories, "1957"with no destination getting a majority of the "1958"files."),1959 path, entry->dir);1960 clean =0;1961return NULL;1962}19631964/*1965 * The caller needs to have ensured that it has pre-populated1966 * collisions with all paths that map to new_path. Do a quick check1967 * to ensure that's the case.1968 */1969 collision_ent =collision_find_entry(collisions, new_path);1970if(collision_ent == NULL)1971BUG("collision_ent is NULL");19721973/*1974 * Check for one-sided add/add/.../add conflicts, i.e.1975 * where implicit renames from the other side doing1976 * directory rename(s) can affect this side of history1977 * to put multiple paths into the same location. Warn1978 * and bail on directory renames for such paths.1979 */1980if(collision_ent->reported_already) {1981 clean =0;1982}else if(tree_has_path(tree, new_path)) {1983 collision_ent->reported_already =1;1984strbuf_add_separated_string_list(&collision_paths,", ",1985&collision_ent->source_files);1986output(o,1,_("CONFLICT (implicit dir rename): Existing "1987"file/dir at%sin the way of implicit "1988"directory rename(s) putting the following "1989"path(s) there:%s."),1990 new_path, collision_paths.buf);1991 clean =0;1992}else if(collision_ent->source_files.nr >1) {1993 collision_ent->reported_already =1;1994strbuf_add_separated_string_list(&collision_paths,", ",1995&collision_ent->source_files);1996output(o,1,_("CONFLICT (implicit dir rename): Cannot map "1997"more than one path to%s; implicit directory "1998"renames tried to put these paths there:%s"),1999 new_path, collision_paths.buf);2000 clean =0;2001}20022003/* Free memory we no longer need */2004strbuf_release(&collision_paths);2005if(!clean && new_path) {2006free(new_path);2007return NULL;2008}20092010return new_path;2011}20122013/*2014 * There are a couple things we want to do at the directory level:2015 * 1. Check for both sides renaming to the same thing, in order to avoid2016 * implicit renaming of files that should be left in place. (See2017 * testcase 6b in t6043 for details.)2018 * 2. Prune directory renames if there are still files left in the2019 * the original directory. These represent a partial directory rename,2020 * i.e. a rename where only some of the files within the directory2021 * were renamed elsewhere. (Technically, this could be done earlier2022 * in get_directory_renames(), except that would prevent us from2023 * doing the previous check and thus failing testcase 6b.)2024 * 3. Check for rename/rename(1to2) conflicts (at the directory level).2025 * In the future, we could potentially record this info as well and2026 * omit reporting rename/rename(1to2) conflicts for each path within2027 * the affected directories, thus cleaning up the merge output.2028 * NOTE: We do NOT check for rename/rename(2to1) conflicts at the2029 * directory level, because merging directories is fine. If it2030 * causes conflicts for files within those merged directories, then2031 * that should be detected at the individual path level.2032 */2033static voidhandle_directory_level_conflicts(struct merge_options *o,2034struct hashmap *dir_re_head,2035struct tree *head,2036struct hashmap *dir_re_merge,2037struct tree *merge)2038{2039struct hashmap_iter iter;2040struct dir_rename_entry *head_ent;2041struct dir_rename_entry *merge_ent;20422043struct string_list remove_from_head = STRING_LIST_INIT_NODUP;2044struct string_list remove_from_merge = STRING_LIST_INIT_NODUP;20452046hashmap_iter_init(dir_re_head, &iter);2047while((head_ent =hashmap_iter_next(&iter))) {2048 merge_ent =dir_rename_find_entry(dir_re_merge, head_ent->dir);2049if(merge_ent &&2050!head_ent->non_unique_new_dir &&2051!merge_ent->non_unique_new_dir &&2052!strbuf_cmp(&head_ent->new_dir, &merge_ent->new_dir)) {2053/* 1. Renamed identically; remove it from both sides */2054string_list_append(&remove_from_head,2055 head_ent->dir)->util = head_ent;2056strbuf_release(&head_ent->new_dir);2057string_list_append(&remove_from_merge,2058 merge_ent->dir)->util = merge_ent;2059strbuf_release(&merge_ent->new_dir);2060}else if(tree_has_path(head, head_ent->dir)) {2061/* 2. This wasn't a directory rename after all */2062string_list_append(&remove_from_head,2063 head_ent->dir)->util = head_ent;2064strbuf_release(&head_ent->new_dir);2065}2066}20672068remove_hashmap_entries(dir_re_head, &remove_from_head);2069remove_hashmap_entries(dir_re_merge, &remove_from_merge);20702071hashmap_iter_init(dir_re_merge, &iter);2072while((merge_ent =hashmap_iter_next(&iter))) {2073 head_ent =dir_rename_find_entry(dir_re_head, merge_ent->dir);2074if(tree_has_path(merge, merge_ent->dir)) {2075/* 2. This wasn't a directory rename after all */2076string_list_append(&remove_from_merge,2077 merge_ent->dir)->util = merge_ent;2078}else if(head_ent &&2079!head_ent->non_unique_new_dir &&2080!merge_ent->non_unique_new_dir) {2081/* 3. rename/rename(1to2) */2082/*2083 * We can assume it's not rename/rename(1to1) because2084 * that was case (1), already checked above. So we2085 * know that head_ent->new_dir and merge_ent->new_dir2086 * are different strings.2087 */2088output(o,1,_("CONFLICT (rename/rename): "2089"Rename directory%s->%sin%s. "2090"Rename directory%s->%sin%s"),2091 head_ent->dir, head_ent->new_dir.buf, o->branch1,2092 head_ent->dir, merge_ent->new_dir.buf, o->branch2);2093string_list_append(&remove_from_head,2094 head_ent->dir)->util = head_ent;2095strbuf_release(&head_ent->new_dir);2096string_list_append(&remove_from_merge,2097 merge_ent->dir)->util = merge_ent;2098strbuf_release(&merge_ent->new_dir);2099}2100}21012102remove_hashmap_entries(dir_re_head, &remove_from_head);2103remove_hashmap_entries(dir_re_merge, &remove_from_merge);2104}21052106static struct hashmap *get_directory_renames(struct diff_queue_struct *pairs,2107struct tree *tree)2108{2109struct hashmap *dir_renames;2110struct hashmap_iter iter;2111struct dir_rename_entry *entry;2112int i;21132114/*2115 * Typically, we think of a directory rename as all files from a2116 * certain directory being moved to a target directory. However,2117 * what if someone first moved two files from the original2118 * directory in one commit, and then renamed the directory2119 * somewhere else in a later commit? At merge time, we just know2120 * that files from the original directory went to two different2121 * places, and that the bulk of them ended up in the same place.2122 * We want each directory rename to represent where the bulk of the2123 * files from that directory end up; this function exists to find2124 * where the bulk of the files went.2125 *2126 * The first loop below simply iterates through the list of file2127 * renames, finding out how often each directory rename pair2128 * possibility occurs.2129 */2130 dir_renames =xmalloc(sizeof(*dir_renames));2131dir_rename_init(dir_renames);2132for(i =0; i < pairs->nr; ++i) {2133struct string_list_item *item;2134int*count;2135struct diff_filepair *pair = pairs->queue[i];2136char*old_dir, *new_dir;21372138/* File not part of directory rename if it wasn't renamed */2139if(pair->status !='R')2140continue;21412142get_renamed_dir_portion(pair->one->path, pair->two->path,2143&old_dir, &new_dir);2144if(!old_dir)2145/* Directory didn't change at all; ignore this one. */2146continue;21472148 entry =dir_rename_find_entry(dir_renames, old_dir);2149if(!entry) {2150 entry =xmalloc(sizeof(*entry));2151dir_rename_entry_init(entry, old_dir);2152hashmap_put(dir_renames, entry);2153}else{2154free(old_dir);2155}2156 item =string_list_lookup(&entry->possible_new_dirs, new_dir);2157if(!item) {2158 item =string_list_insert(&entry->possible_new_dirs,2159 new_dir);2160 item->util =xcalloc(1,sizeof(int));2161}else{2162free(new_dir);2163}2164 count = item->util;2165*count +=1;2166}21672168/*2169 * For each directory with files moved out of it, we find out which2170 * target directory received the most files so we can declare it to2171 * be the "winning" target location for the directory rename. This2172 * winner gets recorded in new_dir. If there is no winner2173 * (multiple target directories received the same number of files),2174 * we set non_unique_new_dir. Once we've determined the winner (or2175 * that there is no winner), we no longer need possible_new_dirs.2176 */2177hashmap_iter_init(dir_renames, &iter);2178while((entry =hashmap_iter_next(&iter))) {2179int max =0;2180int bad_max =0;2181char*best = NULL;21822183for(i =0; i < entry->possible_new_dirs.nr; i++) {2184int*count = entry->possible_new_dirs.items[i].util;21852186if(*count == max)2187 bad_max = max;2188else if(*count > max) {2189 max = *count;2190 best = entry->possible_new_dirs.items[i].string;2191}2192}2193if(bad_max == max)2194 entry->non_unique_new_dir =1;2195else{2196assert(entry->new_dir.len ==0);2197strbuf_addstr(&entry->new_dir, best);2198}2199/*2200 * The relevant directory sub-portion of the original full2201 * filepaths were xstrndup'ed before inserting into2202 * possible_new_dirs, and instead of manually iterating the2203 * list and free'ing each, just lie and tell2204 * possible_new_dirs that it did the strdup'ing so that it2205 * will free them for us.2206 */2207 entry->possible_new_dirs.strdup_strings =1;2208string_list_clear(&entry->possible_new_dirs,1);2209}22102211return dir_renames;2212}22132214static struct dir_rename_entry *check_dir_renamed(const char*path,2215struct hashmap *dir_renames)2216{2217char*temp =xstrdup(path);2218char*end;2219struct dir_rename_entry *entry = NULL;;22202221while((end =strrchr(temp,'/'))) {2222*end ='\0';2223 entry =dir_rename_find_entry(dir_renames, temp);2224if(entry)2225break;2226}2227free(temp);2228return entry;2229}22302231static voidcompute_collisions(struct hashmap *collisions,2232struct hashmap *dir_renames,2233struct diff_queue_struct *pairs)2234{2235int i;22362237/*2238 * Multiple files can be mapped to the same path due to directory2239 * renames done by the other side of history. Since that other2240 * side of history could have merged multiple directories into one,2241 * if our side of history added the same file basename to each of2242 * those directories, then all N of them would get implicitly2243 * renamed by the directory rename detection into the same path,2244 * and we'd get an add/add/.../add conflict, and all those adds2245 * from *this* side of history. This is not representable in the2246 * index, and users aren't going to easily be able to make sense of2247 * it. So we need to provide a good warning about what's2248 * happening, and fall back to no-directory-rename detection2249 * behavior for those paths.2250 *2251 * See testcases 9e and all of section 5 from t6043 for examples.2252 */2253collision_init(collisions);22542255for(i =0; i < pairs->nr; ++i) {2256struct dir_rename_entry *dir_rename_ent;2257struct collision_entry *collision_ent;2258char*new_path;2259struct diff_filepair *pair = pairs->queue[i];22602261if(pair->status !='A'&& pair->status !='R')2262continue;2263 dir_rename_ent =check_dir_renamed(pair->two->path,2264 dir_renames);2265if(!dir_rename_ent)2266continue;22672268 new_path =apply_dir_rename(dir_rename_ent, pair->two->path);2269if(!new_path)2270/*2271 * dir_rename_ent->non_unique_new_path is true, which2272 * means there is no directory rename for us to use,2273 * which means it won't cause us any additional2274 * collisions.2275 */2276continue;2277 collision_ent =collision_find_entry(collisions, new_path);2278if(!collision_ent) {2279 collision_ent =xcalloc(1,2280sizeof(struct collision_entry));2281hashmap_entry_init(collision_ent,strhash(new_path));2282hashmap_put(collisions, collision_ent);2283 collision_ent->target_file = new_path;2284}else{2285free(new_path);2286}2287string_list_insert(&collision_ent->source_files,2288 pair->two->path);2289}2290}22912292static char*check_for_directory_rename(struct merge_options *o,2293const char*path,2294struct tree *tree,2295struct hashmap *dir_renames,2296struct hashmap *dir_rename_exclusions,2297struct hashmap *collisions,2298int*clean_merge)2299{2300char*new_path = NULL;2301struct dir_rename_entry *entry =check_dir_renamed(path, dir_renames);2302struct dir_rename_entry *oentry = NULL;23032304if(!entry)2305return new_path;23062307/*2308 * This next part is a little weird. We do not want to do an2309 * implicit rename into a directory we renamed on our side, because2310 * that will result in a spurious rename/rename(1to2) conflict. An2311 * example:2312 * Base commit: dumbdir/afile, otherdir/bfile2313 * Side 1: smrtdir/afile, otherdir/bfile2314 * Side 2: dumbdir/afile, dumbdir/bfile2315 * Here, while working on Side 1, we could notice that otherdir was2316 * renamed/merged to dumbdir, and change the diff_filepair for2317 * otherdir/bfile into a rename into dumbdir/bfile. However, Side2318 * 2 will notice the rename from dumbdir to smrtdir, and do the2319 * transitive rename to move it from dumbdir/bfile to2320 * smrtdir/bfile. That gives us bfile in dumbdir vs being in2321 * smrtdir, a rename/rename(1to2) conflict. We really just want2322 * the file to end up in smrtdir. And the way to achieve that is2323 * to not let Side1 do the rename to dumbdir, since we know that is2324 * the source of one of our directory renames.2325 *2326 * That's why oentry and dir_rename_exclusions is here.2327 *2328 * As it turns out, this also prevents N-way transient rename2329 * confusion; See testcases 9c and 9d of t6043.2330 */2331 oentry =dir_rename_find_entry(dir_rename_exclusions, entry->new_dir.buf);2332if(oentry) {2333output(o,1,_("WARNING: Avoiding applying%s->%srename "2334"to%s, because%sitself was renamed."),2335 entry->dir, entry->new_dir.buf, path, entry->new_dir.buf);2336}else{2337 new_path =handle_path_level_conflicts(o, path, entry,2338 collisions, tree);2339*clean_merge &= (new_path != NULL);2340}23412342return new_path;2343}23442345static voidapply_directory_rename_modifications(struct merge_options *o,2346struct diff_filepair *pair,2347char*new_path,2348struct rename *re,2349struct tree *tree,2350struct tree *o_tree,2351struct tree *a_tree,2352struct tree *b_tree,2353struct string_list *entries,2354int*clean)2355{2356struct string_list_item *item;2357int stage = (tree == a_tree ?2:3);2358int update_wd;23592360/*2361 * In all cases where we can do directory rename detection,2362 * unpack_trees() will have read pair->two->path into the2363 * index and the working copy. We need to remove it so that2364 * we can instead place it at new_path. It is guaranteed to2365 * not be untracked (unpack_trees() would have errored out2366 * saying the file would have been overwritten), but it might2367 * be dirty, though.2368 */2369 update_wd = !was_dirty(o, pair->two->path);2370if(!update_wd)2371output(o,1,_("Refusing to lose dirty file at%s"),2372 pair->two->path);2373remove_file(o,1, pair->two->path, !update_wd);23742375/* Find or create a new re->dst_entry */2376 item =string_list_lookup(entries, new_path);2377if(item) {2378/*2379 * Since we're renaming on this side of history, and it's2380 * due to a directory rename on the other side of history2381 * (which we only allow when the directory in question no2382 * longer exists on the other side of history), the2383 * original entry for re->dst_entry is no longer2384 * necessary...2385 */2386 re->dst_entry->processed =1;23872388/*2389 * ...because we'll be using this new one.2390 */2391 re->dst_entry = item->util;2392}else{2393/*2394 * re->dst_entry is for the before-dir-rename path, and we2395 * need it to hold information for the after-dir-rename2396 * path. Before creating a new entry, we need to mark the2397 * old one as unnecessary (...unless it is shared by2398 * src_entry, i.e. this didn't use to be a rename, in which2399 * case we can just allow the normal processing to happen2400 * for it).2401 */2402if(pair->status =='R')2403 re->dst_entry->processed =1;24042405 re->dst_entry =insert_stage_data(new_path,2406 o_tree, a_tree, b_tree,2407 entries);2408 item =string_list_insert(entries, new_path);2409 item->util = re->dst_entry;2410}24112412/*2413 * Update the stage_data with the information about the path we are2414 * moving into place. That slot will be empty and available for us2415 * to write to because of the collision checks in2416 * handle_path_level_conflicts(). In other words,2417 * re->dst_entry->stages[stage].oid will be the null_oid, so it's2418 * open for us to write to.2419 *2420 * It may be tempting to actually update the index at this point as2421 * well, using update_stages_for_stage_data(), but as per the big2422 * "NOTE" in update_stages(), doing so will modify the current2423 * in-memory index which will break calls to would_lose_untracked()2424 * that we need to make. Instead, we need to just make sure that2425 * the various conflict_rename_*() functions update the index2426 * explicitly rather than relying on unpack_trees() to have done it.2427 */2428get_tree_entry(&tree->object.oid,2429 pair->two->path,2430&re->dst_entry->stages[stage].oid,2431&re->dst_entry->stages[stage].mode);24322433/* Update pair status */2434if(pair->status =='A') {2435/*2436 * Recording rename information for this add makes it look2437 * like a rename/delete conflict. Make sure we can2438 * correctly handle this as an add that was moved to a new2439 * directory instead of reporting a rename/delete conflict.2440 */2441 re->add_turned_into_rename =1;2442}2443/*2444 * We don't actually look at pair->status again, but it seems2445 * pedagogically correct to adjust it.2446 */2447 pair->status ='R';24482449/*2450 * Finally, record the new location.2451 */2452 pair->two->path = new_path;2453}24542455/*2456 * Get information of all renames which occurred in 'pairs', making use of2457 * any implicit directory renames inferred from the other side of history.2458 * We need the three trees in the merge ('o_tree', 'a_tree' and 'b_tree')2459 * to be able to associate the correct cache entries with the rename2460 * information; tree is always equal to either a_tree or b_tree.2461 */2462static struct string_list *get_renames(struct merge_options *o,2463struct diff_queue_struct *pairs,2464struct hashmap *dir_renames,2465struct hashmap *dir_rename_exclusions,2466struct tree *tree,2467struct tree *o_tree,2468struct tree *a_tree,2469struct tree *b_tree,2470struct string_list *entries,2471int*clean_merge)2472{2473int i;2474struct hashmap collisions;2475struct hashmap_iter iter;2476struct collision_entry *e;2477struct string_list *renames;24782479compute_collisions(&collisions, dir_renames, pairs);2480 renames =xcalloc(1,sizeof(struct string_list));24812482for(i =0; i < pairs->nr; ++i) {2483struct string_list_item *item;2484struct rename *re;2485struct diff_filepair *pair = pairs->queue[i];2486char*new_path;/* non-NULL only with directory renames */24872488if(pair->status !='A'&& pair->status !='R') {2489diff_free_filepair(pair);2490continue;2491}2492 new_path =check_for_directory_rename(o, pair->two->path, tree,2493 dir_renames,2494 dir_rename_exclusions,2495&collisions,2496 clean_merge);2497if(pair->status !='R'&& !new_path) {2498diff_free_filepair(pair);2499continue;2500}25012502 re =xmalloc(sizeof(*re));2503 re->processed =0;2504 re->add_turned_into_rename =0;2505 re->pair = pair;2506 item =string_list_lookup(entries, re->pair->one->path);2507if(!item)2508 re->src_entry =insert_stage_data(re->pair->one->path,2509 o_tree, a_tree, b_tree, entries);2510else2511 re->src_entry = item->util;25122513 item =string_list_lookup(entries, re->pair->two->path);2514if(!item)2515 re->dst_entry =insert_stage_data(re->pair->two->path,2516 o_tree, a_tree, b_tree, entries);2517else2518 re->dst_entry = item->util;2519 item =string_list_insert(renames, pair->one->path);2520 item->util = re;2521if(new_path)2522apply_directory_rename_modifications(o, pair, new_path,2523 re, tree, o_tree,2524 a_tree, b_tree,2525 entries,2526 clean_merge);2527}25282529hashmap_iter_init(&collisions, &iter);2530while((e =hashmap_iter_next(&iter))) {2531free(e->target_file);2532string_list_clear(&e->source_files,0);2533}2534hashmap_free(&collisions,1);2535return renames;2536}25372538static intprocess_renames(struct merge_options *o,2539struct string_list *a_renames,2540struct string_list *b_renames)2541{2542int clean_merge =1, i, j;2543struct string_list a_by_dst = STRING_LIST_INIT_NODUP;2544struct string_list b_by_dst = STRING_LIST_INIT_NODUP;2545const struct rename *sre;25462547for(i =0; i < a_renames->nr; i++) {2548 sre = a_renames->items[i].util;2549string_list_insert(&a_by_dst, sre->pair->two->path)->util2550= (void*)sre;2551}2552for(i =0; i < b_renames->nr; i++) {2553 sre = b_renames->items[i].util;2554string_list_insert(&b_by_dst, sre->pair->two->path)->util2555= (void*)sre;2556}25572558for(i =0, j =0; i < a_renames->nr || j < b_renames->nr;) {2559struct string_list *renames1, *renames2Dst;2560struct rename *ren1 = NULL, *ren2 = NULL;2561const char*branch1, *branch2;2562const char*ren1_src, *ren1_dst;2563struct string_list_item *lookup;25642565if(i >= a_renames->nr) {2566 ren2 = b_renames->items[j++].util;2567}else if(j >= b_renames->nr) {2568 ren1 = a_renames->items[i++].util;2569}else{2570int compare =strcmp(a_renames->items[i].string,2571 b_renames->items[j].string);2572if(compare <=0)2573 ren1 = a_renames->items[i++].util;2574if(compare >=0)2575 ren2 = b_renames->items[j++].util;2576}25772578/* TODO: refactor, so that 1/2 are not needed */2579if(ren1) {2580 renames1 = a_renames;2581 renames2Dst = &b_by_dst;2582 branch1 = o->branch1;2583 branch2 = o->branch2;2584}else{2585 renames1 = b_renames;2586 renames2Dst = &a_by_dst;2587 branch1 = o->branch2;2588 branch2 = o->branch1;2589SWAP(ren2, ren1);2590}25912592if(ren1->processed)2593continue;2594 ren1->processed =1;2595 ren1->dst_entry->processed =1;2596/* BUG: We should only mark src_entry as processed if we2597 * are not dealing with a rename + add-source case.2598 */2599 ren1->src_entry->processed =1;26002601 ren1_src = ren1->pair->one->path;2602 ren1_dst = ren1->pair->two->path;26032604if(ren2) {2605/* One file renamed on both sides */2606const char*ren2_src = ren2->pair->one->path;2607const char*ren2_dst = ren2->pair->two->path;2608enum rename_type rename_type;2609if(strcmp(ren1_src, ren2_src) !=0)2610BUG("ren1_src != ren2_src");2611 ren2->dst_entry->processed =1;2612 ren2->processed =1;2613if(strcmp(ren1_dst, ren2_dst) !=0) {2614 rename_type = RENAME_ONE_FILE_TO_TWO;2615 clean_merge =0;2616}else{2617 rename_type = RENAME_ONE_FILE_TO_ONE;2618/* BUG: We should only remove ren1_src in2619 * the base stage (think of rename +2620 * add-source cases).2621 */2622remove_file(o,1, ren1_src,1);2623update_entry(ren1->dst_entry,2624 ren1->pair->one,2625 ren1->pair->two,2626 ren2->pair->two);2627}2628setup_rename_conflict_info(rename_type,2629 ren1->pair,2630 ren2->pair,2631 branch1,2632 branch2,2633 ren1->dst_entry,2634 ren2->dst_entry,2635 o,2636 NULL,2637 NULL);2638}else if((lookup =string_list_lookup(renames2Dst, ren1_dst))) {2639/* Two different files renamed to the same thing */2640char*ren2_dst;2641 ren2 = lookup->util;2642 ren2_dst = ren2->pair->two->path;2643if(strcmp(ren1_dst, ren2_dst) !=0)2644BUG("ren1_dst != ren2_dst");26452646 clean_merge =0;2647 ren2->processed =1;2648/*2649 * BUG: We should only mark src_entry as processed2650 * if we are not dealing with a rename + add-source2651 * case.2652 */2653 ren2->src_entry->processed =1;26542655setup_rename_conflict_info(RENAME_TWO_FILES_TO_ONE,2656 ren1->pair,2657 ren2->pair,2658 branch1,2659 branch2,2660 ren1->dst_entry,2661 ren2->dst_entry,2662 o,2663 ren1->src_entry,2664 ren2->src_entry);26652666}else{2667/* Renamed in 1, maybe changed in 2 */2668/* we only use sha1 and mode of these */2669struct diff_filespec src_other, dst_other;2670int try_merge;26712672/*2673 * unpack_trees loads entries from common-commit2674 * into stage 1, from head-commit into stage 2, and2675 * from merge-commit into stage 3. We keep track2676 * of which side corresponds to the rename.2677 */2678int renamed_stage = a_renames == renames1 ?2:3;2679int other_stage = a_renames == renames1 ?3:2;26802681/* BUG: We should only remove ren1_src in the base2682 * stage and in other_stage (think of rename +2683 * add-source case).2684 */2685remove_file(o,1, ren1_src,2686 renamed_stage ==2|| !was_tracked(o, ren1_src));26872688oidcpy(&src_other.oid,2689&ren1->src_entry->stages[other_stage].oid);2690 src_other.mode = ren1->src_entry->stages[other_stage].mode;2691oidcpy(&dst_other.oid,2692&ren1->dst_entry->stages[other_stage].oid);2693 dst_other.mode = ren1->dst_entry->stages[other_stage].mode;2694 try_merge =0;26952696if(oid_eq(&src_other.oid, &null_oid) &&2697 ren1->add_turned_into_rename) {2698setup_rename_conflict_info(RENAME_DIR,2699 ren1->pair,2700 NULL,2701 branch1,2702 branch2,2703 ren1->dst_entry,2704 NULL,2705 o,2706 NULL,2707 NULL);2708}else if(oid_eq(&src_other.oid, &null_oid)) {2709setup_rename_conflict_info(RENAME_DELETE,2710 ren1->pair,2711 NULL,2712 branch1,2713 branch2,2714 ren1->dst_entry,2715 NULL,2716 o,2717 NULL,2718 NULL);2719}else if((dst_other.mode == ren1->pair->two->mode) &&2720oid_eq(&dst_other.oid, &ren1->pair->two->oid)) {2721/*2722 * Added file on the other side identical to2723 * the file being renamed: clean merge.2724 * Also, there is no need to overwrite the2725 * file already in the working copy, so call2726 * update_file_flags() instead of2727 * update_file().2728 */2729if(update_file_flags(o,2730&ren1->pair->two->oid,2731 ren1->pair->two->mode,2732 ren1_dst,27331,/* update_cache */27340/* update_wd */))2735 clean_merge = -1;2736}else if(!oid_eq(&dst_other.oid, &null_oid)) {2737 clean_merge =0;2738 try_merge =1;2739output(o,1,_("CONFLICT (rename/add): Rename%s->%sin%s. "2740"%sadded in%s"),2741 ren1_src, ren1_dst, branch1,2742 ren1_dst, branch2);2743if(o->call_depth) {2744struct merge_file_info mfi;2745if(merge_file_one(o, ren1_dst, &null_oid,0,2746&ren1->pair->two->oid,2747 ren1->pair->two->mode,2748&dst_other.oid,2749 dst_other.mode,2750 branch1, branch2, &mfi)) {2751 clean_merge = -1;2752goto cleanup_and_return;2753}2754output(o,1,_("Adding merged%s"), ren1_dst);2755if(update_file(o,0, &mfi.oid,2756 mfi.mode, ren1_dst))2757 clean_merge = -1;2758 try_merge =0;2759}else{2760char*new_path =unique_path(o, ren1_dst, branch2);2761output(o,1,_("Adding as%sinstead"), new_path);2762if(update_file(o,0, &dst_other.oid,2763 dst_other.mode, new_path))2764 clean_merge = -1;2765free(new_path);2766}2767}else2768 try_merge =1;27692770if(clean_merge <0)2771goto cleanup_and_return;2772if(try_merge) {2773struct diff_filespec *one, *a, *b;2774 src_other.path = (char*)ren1_src;27752776 one = ren1->pair->one;2777if(a_renames == renames1) {2778 a = ren1->pair->two;2779 b = &src_other;2780}else{2781 b = ren1->pair->two;2782 a = &src_other;2783}2784update_entry(ren1->dst_entry, one, a, b);2785setup_rename_conflict_info(RENAME_NORMAL,2786 ren1->pair,2787 NULL,2788 branch1,2789 NULL,2790 ren1->dst_entry,2791 NULL,2792 o,2793 NULL,2794 NULL);2795}2796}2797}2798cleanup_and_return:2799string_list_clear(&a_by_dst,0);2800string_list_clear(&b_by_dst,0);28012802return clean_merge;2803}28042805struct rename_info {2806struct string_list *head_renames;2807struct string_list *merge_renames;2808};28092810static voidinitial_cleanup_rename(struct diff_queue_struct *pairs,2811struct hashmap *dir_renames)2812{2813struct hashmap_iter iter;2814struct dir_rename_entry *e;28152816hashmap_iter_init(dir_renames, &iter);2817while((e =hashmap_iter_next(&iter))) {2818free(e->dir);2819strbuf_release(&e->new_dir);2820/* possible_new_dirs already cleared in get_directory_renames */2821}2822hashmap_free(dir_renames,1);2823free(dir_renames);28242825free(pairs->queue);2826free(pairs);2827}28282829static inthandle_renames(struct merge_options *o,2830struct tree *common,2831struct tree *head,2832struct tree *merge,2833struct string_list *entries,2834struct rename_info *ri)2835{2836struct diff_queue_struct *head_pairs, *merge_pairs;2837struct hashmap *dir_re_head, *dir_re_merge;2838int clean =1;28392840 ri->head_renames = NULL;2841 ri->merge_renames = NULL;28422843if(!merge_detect_rename(o))2844return1;28452846 head_pairs =get_diffpairs(o, common, head);2847 merge_pairs =get_diffpairs(o, common, merge);28482849 dir_re_head =get_directory_renames(head_pairs, head);2850 dir_re_merge =get_directory_renames(merge_pairs, merge);28512852handle_directory_level_conflicts(o,2853 dir_re_head, head,2854 dir_re_merge, merge);28552856 ri->head_renames =get_renames(o, head_pairs,2857 dir_re_merge, dir_re_head, head,2858 common, head, merge, entries,2859&clean);2860if(clean <0)2861goto cleanup;2862 ri->merge_renames =get_renames(o, merge_pairs,2863 dir_re_head, dir_re_merge, merge,2864 common, head, merge, entries,2865&clean);2866if(clean <0)2867goto cleanup;2868 clean &=process_renames(o, ri->head_renames, ri->merge_renames);28692870cleanup:2871/*2872 * Some cleanup is deferred until cleanup_renames() because the2873 * data structures are still needed and referenced in2874 * process_entry(). But there are a few things we can free now.2875 */2876initial_cleanup_rename(head_pairs, dir_re_head);2877initial_cleanup_rename(merge_pairs, dir_re_merge);28782879return clean;2880}28812882static voidfinal_cleanup_rename(struct string_list *rename)2883{2884const struct rename *re;2885int i;28862887if(rename == NULL)2888return;28892890for(i =0; i < rename->nr; i++) {2891 re = rename->items[i].util;2892diff_free_filepair(re->pair);2893}2894string_list_clear(rename,1);2895free(rename);2896}28972898static voidfinal_cleanup_renames(struct rename_info *re_info)2899{2900final_cleanup_rename(re_info->head_renames);2901final_cleanup_rename(re_info->merge_renames);2902}29032904static struct object_id *stage_oid(const struct object_id *oid,unsigned mode)2905{2906return(is_null_oid(oid) || mode ==0) ? NULL: (struct object_id *)oid;2907}29082909static intread_oid_strbuf(struct merge_options *o,2910const struct object_id *oid,struct strbuf *dst)2911{2912void*buf;2913enum object_type type;2914unsigned long size;2915 buf =read_object_file(oid, &type, &size);2916if(!buf)2917returnerr(o,_("cannot read object%s"),oid_to_hex(oid));2918if(type != OBJ_BLOB) {2919free(buf);2920returnerr(o,_("object%sis not a blob"),oid_to_hex(oid));2921}2922strbuf_attach(dst, buf, size, size +1);2923return0;2924}29252926static intblob_unchanged(struct merge_options *opt,2927const struct object_id *o_oid,2928unsigned o_mode,2929const struct object_id *a_oid,2930unsigned a_mode,2931int renormalize,const char*path)2932{2933struct strbuf o = STRBUF_INIT;2934struct strbuf a = STRBUF_INIT;2935int ret =0;/* assume changed for safety */29362937if(a_mode != o_mode)2938return0;2939if(oid_eq(o_oid, a_oid))2940return1;2941if(!renormalize)2942return0;29432944assert(o_oid && a_oid);2945if(read_oid_strbuf(opt, o_oid, &o) ||read_oid_strbuf(opt, a_oid, &a))2946goto error_return;2947/*2948 * Note: binary | is used so that both renormalizations are2949 * performed. Comparison can be skipped if both files are2950 * unchanged since their sha1s have already been compared.2951 */2952if(renormalize_buffer(&the_index, path, o.buf, o.len, &o) |2953renormalize_buffer(&the_index, path, a.buf, a.len, &a))2954 ret = (o.len == a.len && !memcmp(o.buf, a.buf, o.len));29552956error_return:2957strbuf_release(&o);2958strbuf_release(&a);2959return ret;2960}29612962static inthandle_modify_delete(struct merge_options *o,2963const char*path,2964struct object_id *o_oid,int o_mode,2965struct object_id *a_oid,int a_mode,2966struct object_id *b_oid,int b_mode)2967{2968const char*modify_branch, *delete_branch;2969struct object_id *changed_oid;2970int changed_mode;29712972if(a_oid) {2973 modify_branch = o->branch1;2974 delete_branch = o->branch2;2975 changed_oid = a_oid;2976 changed_mode = a_mode;2977}else{2978 modify_branch = o->branch2;2979 delete_branch = o->branch1;2980 changed_oid = b_oid;2981 changed_mode = b_mode;2982}29832984returnhandle_change_delete(o,2985 path, NULL,2986 o_oid, o_mode,2987 changed_oid, changed_mode,2988 modify_branch, delete_branch,2989_("modify"),_("modified"));2990}29912992static intmerge_content(struct merge_options *o,2993const char*path,2994int is_dirty,2995struct object_id *o_oid,int o_mode,2996struct object_id *a_oid,int a_mode,2997struct object_id *b_oid,int b_mode,2998struct rename_conflict_info *rename_conflict_info)2999{3000const char*reason =_("content");3001const char*path1 = NULL, *path2 = NULL;3002struct merge_file_info mfi;3003struct diff_filespec one, a, b;3004unsigned df_conflict_remains =0;30053006if(!o_oid) {3007 reason =_("add/add");3008 o_oid = (struct object_id *)&null_oid;3009}3010 one.path = a.path = b.path = (char*)path;3011oidcpy(&one.oid, o_oid);3012 one.mode = o_mode;3013oidcpy(&a.oid, a_oid);3014 a.mode = a_mode;3015oidcpy(&b.oid, b_oid);3016 b.mode = b_mode;30173018if(rename_conflict_info) {3019struct diff_filepair *pair1 = rename_conflict_info->pair1;30203021 path1 = (o->branch1 == rename_conflict_info->branch1) ?3022 pair1->two->path : pair1->one->path;3023/* If rename_conflict_info->pair2 != NULL, we are in3024 * RENAME_ONE_FILE_TO_ONE case. Otherwise, we have a3025 * normal rename.3026 */3027 path2 = (rename_conflict_info->pair2 ||3028 o->branch2 == rename_conflict_info->branch1) ?3029 pair1->two->path : pair1->one->path;30303031if(dir_in_way(path, !o->call_depth,3032S_ISGITLINK(pair1->two->mode)))3033 df_conflict_remains =1;3034}3035if(merge_file_special_markers(o, &one, &a, &b, path,3036 o->branch1, path1,3037 o->branch2, path2, &mfi))3038return-1;30393040/*3041 * We can skip updating the working tree file iff:3042 * a) The merge is clean3043 * b) The merge matches what was in HEAD (content, mode, pathname)3044 * c) The target path is usable (i.e. not involved in D/F conflict)3045 */3046if(mfi.clean &&3047was_tracked_and_matches(o, path, &mfi.oid, mfi.mode) &&3048!df_conflict_remains) {3049output(o,3,_("Skipped%s(merged same as existing)"), path);3050if(add_cacheinfo(o, mfi.mode, &mfi.oid, path,30510, (!o->call_depth && !is_dirty),0))3052return-1;3053return mfi.clean;3054}30553056if(!mfi.clean) {3057if(S_ISGITLINK(mfi.mode))3058 reason =_("submodule");3059output(o,1,_("CONFLICT (%s): Merge conflict in%s"),3060 reason, path);3061if(rename_conflict_info && !df_conflict_remains)3062if(update_stages(o, path, &one, &a, &b))3063return-1;3064}30653066if(df_conflict_remains || is_dirty) {3067char*new_path;3068if(o->call_depth) {3069remove_file_from_cache(path);3070}else{3071if(!mfi.clean) {3072if(update_stages(o, path, &one, &a, &b))3073return-1;3074}else{3075int file_from_stage2 =was_tracked(o, path);3076struct diff_filespec merged;3077oidcpy(&merged.oid, &mfi.oid);3078 merged.mode = mfi.mode;30793080if(update_stages(o, path, NULL,3081 file_from_stage2 ? &merged : NULL,3082 file_from_stage2 ? NULL : &merged))3083return-1;3084}30853086}3087 new_path =unique_path(o, path, rename_conflict_info->branch1);3088if(is_dirty) {3089output(o,1,_("Refusing to lose dirty file at%s"),3090 path);3091}3092output(o,1,_("Adding as%sinstead"), new_path);3093if(update_file(o,0, &mfi.oid, mfi.mode, new_path)) {3094free(new_path);3095return-1;3096}3097free(new_path);3098 mfi.clean =0;3099}else if(update_file(o, mfi.clean, &mfi.oid, mfi.mode, path))3100return-1;3101return!is_dirty && mfi.clean;3102}31033104static intconflict_rename_normal(struct merge_options *o,3105const char*path,3106struct object_id *o_oid,unsigned int o_mode,3107struct object_id *a_oid,unsigned int a_mode,3108struct object_id *b_oid,unsigned int b_mode,3109struct rename_conflict_info *ci)3110{3111/* Merge the content and write it out */3112returnmerge_content(o, path,was_dirty(o, path),3113 o_oid, o_mode, a_oid, a_mode, b_oid, b_mode,3114 ci);3115}31163117/* Per entry merge function */3118static intprocess_entry(struct merge_options *o,3119const char*path,struct stage_data *entry)3120{3121int clean_merge =1;3122int normalize = o->renormalize;3123unsigned o_mode = entry->stages[1].mode;3124unsigned a_mode = entry->stages[2].mode;3125unsigned b_mode = entry->stages[3].mode;3126struct object_id *o_oid =stage_oid(&entry->stages[1].oid, o_mode);3127struct object_id *a_oid =stage_oid(&entry->stages[2].oid, a_mode);3128struct object_id *b_oid =stage_oid(&entry->stages[3].oid, b_mode);31293130 entry->processed =1;3131if(entry->rename_conflict_info) {3132struct rename_conflict_info *conflict_info = entry->rename_conflict_info;3133switch(conflict_info->rename_type) {3134case RENAME_NORMAL:3135case RENAME_ONE_FILE_TO_ONE:3136 clean_merge =conflict_rename_normal(o,3137 path,3138 o_oid, o_mode,3139 a_oid, a_mode,3140 b_oid, b_mode,3141 conflict_info);3142break;3143case RENAME_DIR:3144 clean_merge =1;3145if(conflict_rename_dir(o,3146 conflict_info->pair1,3147 conflict_info->branch1,3148 conflict_info->branch2))3149 clean_merge = -1;3150break;3151case RENAME_DELETE:3152 clean_merge =0;3153if(conflict_rename_delete(o,3154 conflict_info->pair1,3155 conflict_info->branch1,3156 conflict_info->branch2))3157 clean_merge = -1;3158break;3159case RENAME_ONE_FILE_TO_TWO:3160 clean_merge =0;3161if(conflict_rename_rename_1to2(o, conflict_info))3162 clean_merge = -1;3163break;3164case RENAME_TWO_FILES_TO_ONE:3165 clean_merge =0;3166if(conflict_rename_rename_2to1(o, conflict_info))3167 clean_merge = -1;3168break;3169default:3170 entry->processed =0;3171break;3172}3173}else if(o_oid && (!a_oid || !b_oid)) {3174/* Case A: Deleted in one */3175if((!a_oid && !b_oid) ||3176(!b_oid &&blob_unchanged(o, o_oid, o_mode, a_oid, a_mode, normalize, path)) ||3177(!a_oid &&blob_unchanged(o, o_oid, o_mode, b_oid, b_mode, normalize, path))) {3178/* Deleted in both or deleted in one and3179 * unchanged in the other */3180if(a_oid)3181output(o,2,_("Removing%s"), path);3182/* do not touch working file if it did not exist */3183remove_file(o,1, path, !a_oid);3184}else{3185/* Modify/delete; deleted side may have put a directory in the way */3186 clean_merge =0;3187if(handle_modify_delete(o, path, o_oid, o_mode,3188 a_oid, a_mode, b_oid, b_mode))3189 clean_merge = -1;3190}3191}else if((!o_oid && a_oid && !b_oid) ||3192(!o_oid && !a_oid && b_oid)) {3193/* Case B: Added in one. */3194/* [nothing|directory] -> ([nothing|directory], file) */31953196const char*add_branch;3197const char*other_branch;3198unsigned mode;3199const struct object_id *oid;3200const char*conf;32013202if(a_oid) {3203 add_branch = o->branch1;3204 other_branch = o->branch2;3205 mode = a_mode;3206 oid = a_oid;3207 conf =_("file/directory");3208}else{3209 add_branch = o->branch2;3210 other_branch = o->branch1;3211 mode = b_mode;3212 oid = b_oid;3213 conf =_("directory/file");3214}3215if(dir_in_way(path,3216!o->call_depth && !S_ISGITLINK(a_mode),32170)) {3218char*new_path =unique_path(o, path, add_branch);3219 clean_merge =0;3220output(o,1,_("CONFLICT (%s): There is a directory with name%sin%s. "3221"Adding%sas%s"),3222 conf, path, other_branch, path, new_path);3223if(update_file(o,0, oid, mode, new_path))3224 clean_merge = -1;3225else if(o->call_depth)3226remove_file_from_cache(path);3227free(new_path);3228}else{3229output(o,2,_("Adding%s"), path);3230/* do not overwrite file if already present */3231if(update_file_flags(o, oid, mode, path,1, !a_oid))3232 clean_merge = -1;3233}3234}else if(a_oid && b_oid) {3235/* Case C: Added in both (check for same permissions) and */3236/* case D: Modified in both, but differently. */3237int is_dirty =0;/* unpack_trees would have bailed if dirty */3238 clean_merge =merge_content(o, path, is_dirty,3239 o_oid, o_mode, a_oid, a_mode, b_oid, b_mode,3240 NULL);3241}else if(!o_oid && !a_oid && !b_oid) {3242/*3243 * this entry was deleted altogether. a_mode == 0 means3244 * we had that path and want to actively remove it.3245 */3246remove_file(o,1, path, !a_mode);3247}else3248BUG("fatal merge failure, shouldn't happen.");32493250return clean_merge;3251}32523253intmerge_trees(struct merge_options *o,3254struct tree *head,3255struct tree *merge,3256struct tree *common,3257struct tree **result)3258{3259int code, clean;32603261if(o->subtree_shift) {3262 merge =shift_tree_object(head, merge, o->subtree_shift);3263 common =shift_tree_object(head, common, o->subtree_shift);3264}32653266if(oid_eq(&common->object.oid, &merge->object.oid)) {3267struct strbuf sb = STRBUF_INIT;32683269if(!o->call_depth &&index_has_changes(&sb)) {3270err(o,_("Dirty index: cannot merge (dirty:%s)"),3271 sb.buf);3272return0;3273}3274output(o,0,_("Already up to date!"));3275*result = head;3276return1;3277}32783279 code =unpack_trees_start(o, common, head, merge);32803281if(code !=0) {3282if(show(o,4) || o->call_depth)3283err(o,_("merging of trees%sand%sfailed"),3284oid_to_hex(&head->object.oid),3285oid_to_hex(&merge->object.oid));3286unpack_trees_finish(o);3287return-1;3288}32893290if(unmerged_cache()) {3291struct string_list *entries;3292struct rename_info re_info;3293int i;3294/*3295 * Only need the hashmap while processing entries, so3296 * initialize it here and free it when we are done running3297 * through the entries. Keeping it in the merge_options as3298 * opposed to decaring a local hashmap is for convenience3299 * so that we don't have to pass it to around.3300 */3301hashmap_init(&o->current_file_dir_set, path_hashmap_cmp, NULL,512);3302get_files_dirs(o, head);3303get_files_dirs(o, merge);33043305 entries =get_unmerged();3306 clean =handle_renames(o, common, head, merge, entries,3307&re_info);3308record_df_conflict_files(o, entries);3309if(clean <0)3310goto cleanup;3311for(i = entries->nr-1;0<= i; i--) {3312const char*path = entries->items[i].string;3313struct stage_data *e = entries->items[i].util;3314if(!e->processed) {3315int ret =process_entry(o, path, e);3316if(!ret)3317 clean =0;3318else if(ret <0) {3319 clean = ret;3320goto cleanup;3321}3322}3323}3324for(i =0; i < entries->nr; i++) {3325struct stage_data *e = entries->items[i].util;3326if(!e->processed)3327BUG("unprocessed path???%s",3328 entries->items[i].string);3329}33303331cleanup:3332final_cleanup_renames(&re_info);33333334string_list_clear(entries,1);3335free(entries);33363337hashmap_free(&o->current_file_dir_set,1);33383339if(clean <0) {3340unpack_trees_finish(o);3341return clean;3342}3343}3344else3345 clean =1;33463347unpack_trees_finish(o);33483349if(o->call_depth && !(*result =write_tree_from_memory(o)))3350return-1;33513352return clean;3353}33543355static struct commit_list *reverse_commit_list(struct commit_list *list)3356{3357struct commit_list *next = NULL, *current, *backup;3358for(current = list; current; current = backup) {3359 backup = current->next;3360 current->next = next;3361 next = current;3362}3363return next;3364}33653366/*3367 * Merge the commits h1 and h2, return the resulting virtual3368 * commit object and a flag indicating the cleanness of the merge.3369 */3370intmerge_recursive(struct merge_options *o,3371struct commit *h1,3372struct commit *h2,3373struct commit_list *ca,3374struct commit **result)3375{3376struct commit_list *iter;3377struct commit *merged_common_ancestors;3378struct tree *mrtree;3379int clean;33803381if(show(o,4)) {3382output(o,4,_("Merging:"));3383output_commit_title(o, h1);3384output_commit_title(o, h2);3385}33863387if(!ca) {3388 ca =get_merge_bases(h1, h2);3389 ca =reverse_commit_list(ca);3390}33913392if(show(o,5)) {3393unsigned cnt =commit_list_count(ca);33943395output(o,5,Q_("found%ucommon ancestor:",3396"found%ucommon ancestors:", cnt), cnt);3397for(iter = ca; iter; iter = iter->next)3398output_commit_title(o, iter->item);3399}34003401 merged_common_ancestors =pop_commit(&ca);3402if(merged_common_ancestors == NULL) {3403/* if there is no common ancestor, use an empty tree */3404struct tree *tree;34053406 tree =lookup_tree(the_hash_algo->empty_tree);3407 merged_common_ancestors =make_virtual_commit(tree,"ancestor");3408}34093410for(iter = ca; iter; iter = iter->next) {3411const char*saved_b1, *saved_b2;3412 o->call_depth++;3413/*3414 * When the merge fails, the result contains files3415 * with conflict markers. The cleanness flag is3416 * ignored (unless indicating an error), it was never3417 * actually used, as result of merge_trees has always3418 * overwritten it: the committed "conflicts" were3419 * already resolved.3420 */3421discard_cache();3422 saved_b1 = o->branch1;3423 saved_b2 = o->branch2;3424 o->branch1 ="Temporary merge branch 1";3425 o->branch2 ="Temporary merge branch 2";3426if(merge_recursive(o, merged_common_ancestors, iter->item,3427 NULL, &merged_common_ancestors) <0)3428return-1;3429 o->branch1 = saved_b1;3430 o->branch2 = saved_b2;3431 o->call_depth--;34323433if(!merged_common_ancestors)3434returnerr(o,_("merge returned no commit"));3435}34363437discard_cache();3438if(!o->call_depth)3439read_cache();34403441 o->ancestor ="merged common ancestors";3442 clean =merge_trees(o,get_commit_tree(h1),get_commit_tree(h2),3443get_commit_tree(merged_common_ancestors),3444&mrtree);3445if(clean <0) {3446flush_output(o);3447return clean;3448}34493450if(o->call_depth) {3451*result =make_virtual_commit(mrtree,"merged tree");3452commit_list_insert(h1, &(*result)->parents);3453commit_list_insert(h2, &(*result)->parents->next);3454}3455flush_output(o);3456if(!o->call_depth && o->buffer_output <2)3457strbuf_release(&o->obuf);3458if(show(o,2))3459diff_warn_rename_limit("merge.renamelimit",3460 o->needed_rename_limit,0);3461return clean;3462}34633464static struct commit *get_ref(const struct object_id *oid,const char*name)3465{3466struct object *object;34673468 object =deref_tag(parse_object(oid), name,strlen(name));3469if(!object)3470return NULL;3471if(object->type == OBJ_TREE)3472returnmake_virtual_commit((struct tree*)object, name);3473if(object->type != OBJ_COMMIT)3474return NULL;3475if(parse_commit((struct commit *)object))3476return NULL;3477return(struct commit *)object;3478}34793480intmerge_recursive_generic(struct merge_options *o,3481const struct object_id *head,3482const struct object_id *merge,3483int num_base_list,3484const struct object_id **base_list,3485struct commit **result)3486{3487int clean;3488struct lock_file lock = LOCK_INIT;3489struct commit *head_commit =get_ref(head, o->branch1);3490struct commit *next_commit =get_ref(merge, o->branch2);3491struct commit_list *ca = NULL;34923493if(base_list) {3494int i;3495for(i =0; i < num_base_list; ++i) {3496struct commit *base;3497if(!(base =get_ref(base_list[i],oid_to_hex(base_list[i]))))3498returnerr(o,_("Could not parse object '%s'"),3499oid_to_hex(base_list[i]));3500commit_list_insert(base, &ca);3501}3502}35033504hold_locked_index(&lock, LOCK_DIE_ON_ERROR);3505 clean =merge_recursive(o, head_commit, next_commit, ca,3506 result);3507if(clean <0) {3508rollback_lock_file(&lock);3509return clean;3510}35113512if(write_locked_index(&the_index, &lock,3513 COMMIT_LOCK | SKIP_IF_UNCHANGED))3514returnerr(o,_("Unable to write index."));35153516return clean ?0:1;3517}35183519static voidmerge_recursive_config(struct merge_options *o)3520{3521char*value = NULL;3522git_config_get_int("merge.verbosity", &o->verbosity);3523git_config_get_int("diff.renamelimit", &o->diff_rename_limit);3524git_config_get_int("merge.renamelimit", &o->merge_rename_limit);3525if(!git_config_get_string("diff.renames", &value)) {3526 o->diff_detect_rename =git_config_rename("diff.renames", value);3527free(value);3528}3529if(!git_config_get_string("merge.renames", &value)) {3530 o->merge_detect_rename =git_config_rename("merge.renames", value);3531free(value);3532}3533git_config(git_xmerge_config, NULL);3534}35353536voidinit_merge_options(struct merge_options *o)3537{3538const char*merge_verbosity;3539memset(o,0,sizeof(struct merge_options));3540 o->verbosity =2;3541 o->buffer_output =1;3542 o->diff_rename_limit = -1;3543 o->merge_rename_limit = -1;3544 o->renormalize =0;3545 o->diff_detect_rename = -1;3546 o->merge_detect_rename = -1;3547merge_recursive_config(o);3548 merge_verbosity =getenv("GIT_MERGE_VERBOSITY");3549if(merge_verbosity)3550 o->verbosity =strtol(merge_verbosity, NULL,10);3551if(o->verbosity >=5)3552 o->buffer_output =0;3553strbuf_init(&o->obuf,0);3554string_list_init(&o->df_conflict_file_set,1);3555}35563557intparse_merge_opt(struct merge_options *o,const char*s)3558{3559const char*arg;35603561if(!s || !*s)3562return-1;3563if(!strcmp(s,"ours"))3564 o->recursive_variant = MERGE_RECURSIVE_OURS;3565else if(!strcmp(s,"theirs"))3566 o->recursive_variant = MERGE_RECURSIVE_THEIRS;3567else if(!strcmp(s,"subtree"))3568 o->subtree_shift ="";3569else if(skip_prefix(s,"subtree=", &arg))3570 o->subtree_shift = arg;3571else if(!strcmp(s,"patience"))3572 o->xdl_opts =DIFF_WITH_ALG(o, PATIENCE_DIFF);3573else if(!strcmp(s,"histogram"))3574 o->xdl_opts =DIFF_WITH_ALG(o, HISTOGRAM_DIFF);3575else if(skip_prefix(s,"diff-algorithm=", &arg)) {3576long value =parse_algorithm_value(arg);3577if(value <0)3578return-1;3579/* clear out previous settings */3580DIFF_XDL_CLR(o, NEED_MINIMAL);3581 o->xdl_opts &= ~XDF_DIFF_ALGORITHM_MASK;3582 o->xdl_opts |= value;3583}3584else if(!strcmp(s,"ignore-space-change"))3585DIFF_XDL_SET(o, IGNORE_WHITESPACE_CHANGE);3586else if(!strcmp(s,"ignore-all-space"))3587DIFF_XDL_SET(o, IGNORE_WHITESPACE);3588else if(!strcmp(s,"ignore-space-at-eol"))3589DIFF_XDL_SET(o, IGNORE_WHITESPACE_AT_EOL);3590else if(!strcmp(s,"ignore-cr-at-eol"))3591DIFF_XDL_SET(o, IGNORE_CR_AT_EOL);3592else if(!strcmp(s,"renormalize"))3593 o->renormalize =1;3594else if(!strcmp(s,"no-renormalize"))3595 o->renormalize =0;3596else if(!strcmp(s,"no-renames"))3597 o->merge_detect_rename =0;3598else if(!strcmp(s,"find-renames")) {3599 o->merge_detect_rename =1;3600 o->rename_score =0;3601}3602else if(skip_prefix(s,"find-renames=", &arg) ||3603skip_prefix(s,"rename-threshold=", &arg)) {3604if((o->rename_score =parse_rename_score(&arg)) == -1|| *arg !=0)3605return-1;3606 o->merge_detect_rename =1;3607}3608else3609return-1;3610return0;3611}