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"unpack-trees.h" 19#include"string-list.h" 20#include"xdiff-interface.h" 21#include"ll-merge.h" 22#include"attr.h" 23#include"merge-recursive.h" 24#include"dir.h" 25#include"submodule.h" 26#include"revision.h" 27 28struct path_hashmap_entry { 29struct hashmap_entry e; 30char path[FLEX_ARRAY]; 31}; 32 33static intpath_hashmap_cmp(const void*cmp_data, 34const void*entry, 35const void*entry_or_key, 36const void*keydata) 37{ 38const struct path_hashmap_entry *a = entry; 39const struct path_hashmap_entry *b = entry_or_key; 40const char*key = keydata; 41 42if(ignore_case) 43returnstrcasecmp(a->path, key ? key : b->path); 44else 45returnstrcmp(a->path, key ? key : b->path); 46} 47 48static unsigned intpath_hash(const char*path) 49{ 50return ignore_case ?strihash(path) :strhash(path); 51} 52 53static struct dir_rename_entry *dir_rename_find_entry(struct hashmap *hashmap, 54char*dir) 55{ 56struct dir_rename_entry key; 57 58if(dir == NULL) 59return NULL; 60hashmap_entry_init(&key,strhash(dir)); 61 key.dir = dir; 62returnhashmap_get(hashmap, &key, NULL); 63} 64 65static intdir_rename_cmp(const void*unused_cmp_data, 66const void*entry, 67const void*entry_or_key, 68const void*unused_keydata) 69{ 70const struct dir_rename_entry *e1 = entry; 71const struct dir_rename_entry *e2 = entry_or_key; 72 73returnstrcmp(e1->dir, e2->dir); 74} 75 76static voiddir_rename_init(struct hashmap *map) 77{ 78hashmap_init(map, dir_rename_cmp, NULL,0); 79} 80 81static voiddir_rename_entry_init(struct dir_rename_entry *entry, 82char*directory) 83{ 84hashmap_entry_init(entry,strhash(directory)); 85 entry->dir = directory; 86 entry->non_unique_new_dir =0; 87strbuf_init(&entry->new_dir,0); 88string_list_init(&entry->possible_new_dirs,0); 89} 90 91static struct collision_entry *collision_find_entry(struct hashmap *hashmap, 92char*target_file) 93{ 94struct collision_entry key; 95 96hashmap_entry_init(&key,strhash(target_file)); 97 key.target_file = target_file; 98returnhashmap_get(hashmap, &key, NULL); 99} 100 101static intcollision_cmp(void*unused_cmp_data, 102const struct collision_entry *e1, 103const struct collision_entry *e2, 104const void*unused_keydata) 105{ 106returnstrcmp(e1->target_file, e2->target_file); 107} 108 109static voidcollision_init(struct hashmap *map) 110{ 111hashmap_init(map, (hashmap_cmp_fn) collision_cmp, NULL,0); 112} 113 114static voidflush_output(struct merge_options *o) 115{ 116if(o->buffer_output <2&& o->obuf.len) { 117fputs(o->obuf.buf, stdout); 118strbuf_reset(&o->obuf); 119} 120} 121 122static interr(struct merge_options *o,const char*err, ...) 123{ 124va_list params; 125 126if(o->buffer_output <2) 127flush_output(o); 128else{ 129strbuf_complete(&o->obuf,'\n'); 130strbuf_addstr(&o->obuf,"error: "); 131} 132va_start(params, err); 133strbuf_vaddf(&o->obuf, err, params); 134va_end(params); 135if(o->buffer_output >1) 136strbuf_addch(&o->obuf,'\n'); 137else{ 138error("%s", o->obuf.buf); 139strbuf_reset(&o->obuf); 140} 141 142return-1; 143} 144 145static struct tree *shift_tree_object(struct tree *one,struct tree *two, 146const char*subtree_shift) 147{ 148struct object_id shifted; 149 150if(!*subtree_shift) { 151shift_tree(&one->object.oid, &two->object.oid, &shifted,0); 152}else{ 153shift_tree_by(&one->object.oid, &two->object.oid, &shifted, 154 subtree_shift); 155} 156if(!oidcmp(&two->object.oid, &shifted)) 157return two; 158returnlookup_tree(&shifted); 159} 160 161static struct commit *make_virtual_commit(struct tree *tree,const char*comment) 162{ 163struct commit *commit =alloc_commit_node(); 164 165set_merge_remote_desc(commit, comment, (struct object *)commit); 166 commit->maybe_tree = tree; 167 commit->object.parsed =1; 168return commit; 169} 170 171/* 172 * Since we use get_tree_entry(), which does not put the read object into 173 * the object pool, we cannot rely on a == b. 174 */ 175static intoid_eq(const struct object_id *a,const struct object_id *b) 176{ 177if(!a && !b) 178return2; 179return a && b &&oidcmp(a, b) ==0; 180} 181 182enum rename_type { 183 RENAME_NORMAL =0, 184 RENAME_DIR, 185 RENAME_DELETE, 186 RENAME_ONE_FILE_TO_ONE, 187 RENAME_ONE_FILE_TO_TWO, 188 RENAME_TWO_FILES_TO_ONE 189}; 190 191struct rename_conflict_info { 192enum rename_type rename_type; 193struct diff_filepair *pair1; 194struct diff_filepair *pair2; 195const char*branch1; 196const char*branch2; 197struct stage_data *dst_entry1; 198struct stage_data *dst_entry2; 199struct diff_filespec ren1_other; 200struct diff_filespec ren2_other; 201}; 202 203/* 204 * Since we want to write the index eventually, we cannot reuse the index 205 * for these (temporary) data. 206 */ 207struct stage_data { 208struct{ 209unsigned mode; 210struct object_id oid; 211} stages[4]; 212struct rename_conflict_info *rename_conflict_info; 213unsigned processed:1; 214}; 215 216staticinlinevoidsetup_rename_conflict_info(enum rename_type rename_type, 217struct diff_filepair *pair1, 218struct diff_filepair *pair2, 219const char*branch1, 220const char*branch2, 221struct stage_data *dst_entry1, 222struct stage_data *dst_entry2, 223struct merge_options *o, 224struct stage_data *src_entry1, 225struct stage_data *src_entry2) 226{ 227struct rename_conflict_info *ci =xcalloc(1,sizeof(struct rename_conflict_info)); 228 ci->rename_type = rename_type; 229 ci->pair1 = pair1; 230 ci->branch1 = branch1; 231 ci->branch2 = branch2; 232 233 ci->dst_entry1 = dst_entry1; 234 dst_entry1->rename_conflict_info = ci; 235 dst_entry1->processed =0; 236 237assert(!pair2 == !dst_entry2); 238if(dst_entry2) { 239 ci->dst_entry2 = dst_entry2; 240 ci->pair2 = pair2; 241 dst_entry2->rename_conflict_info = ci; 242} 243 244if(rename_type == RENAME_TWO_FILES_TO_ONE) { 245/* 246 * For each rename, there could have been 247 * modifications on the side of history where that 248 * file was not renamed. 249 */ 250int ostage1 = o->branch1 == branch1 ?3:2; 251int ostage2 = ostage1 ^1; 252 253 ci->ren1_other.path = pair1->one->path; 254oidcpy(&ci->ren1_other.oid, &src_entry1->stages[ostage1].oid); 255 ci->ren1_other.mode = src_entry1->stages[ostage1].mode; 256 257 ci->ren2_other.path = pair2->one->path; 258oidcpy(&ci->ren2_other.oid, &src_entry2->stages[ostage2].oid); 259 ci->ren2_other.mode = src_entry2->stages[ostage2].mode; 260} 261} 262 263static intshow(struct merge_options *o,int v) 264{ 265return(!o->call_depth && o->verbosity >= v) || o->verbosity >=5; 266} 267 268__attribute__((format(printf,3,4))) 269static voidoutput(struct merge_options *o,int v,const char*fmt, ...) 270{ 271va_list ap; 272 273if(!show(o, v)) 274return; 275 276strbuf_addchars(&o->obuf,' ', o->call_depth *2); 277 278va_start(ap, fmt); 279strbuf_vaddf(&o->obuf, fmt, ap); 280va_end(ap); 281 282strbuf_addch(&o->obuf,'\n'); 283if(!o->buffer_output) 284flush_output(o); 285} 286 287static voidoutput_commit_title(struct merge_options *o,struct commit *commit) 288{ 289strbuf_addchars(&o->obuf,' ', o->call_depth *2); 290if(commit->util) 291strbuf_addf(&o->obuf,"virtual%s\n", 292merge_remote_util(commit)->name); 293else{ 294strbuf_add_unique_abbrev(&o->obuf, &commit->object.oid, 295 DEFAULT_ABBREV); 296strbuf_addch(&o->obuf,' '); 297if(parse_commit(commit) !=0) 298strbuf_addstr(&o->obuf,_("(bad commit)\n")); 299else{ 300const char*title; 301const char*msg =get_commit_buffer(commit, NULL); 302int len =find_commit_subject(msg, &title); 303if(len) 304strbuf_addf(&o->obuf,"%.*s\n", len, title); 305unuse_commit_buffer(commit, msg); 306} 307} 308flush_output(o); 309} 310 311static intadd_cacheinfo(struct merge_options *o, 312unsigned int mode,const struct object_id *oid, 313const char*path,int stage,int refresh,int options) 314{ 315struct cache_entry *ce; 316int ret; 317 318 ce =make_cache_entry(mode, oid ? oid->hash : null_sha1, path, stage,0); 319if(!ce) 320returnerr(o,_("add_cacheinfo failed for path '%s'; merge aborting."), path); 321 322 ret =add_cache_entry(ce, options); 323if(refresh) { 324struct cache_entry *nce; 325 326 nce =refresh_cache_entry(ce, CE_MATCH_REFRESH | CE_MATCH_IGNORE_MISSING); 327if(!nce) 328returnerr(o,_("add_cacheinfo failed to refresh for path '%s'; merge aborting."), path); 329if(nce != ce) 330 ret =add_cache_entry(nce, options); 331} 332return ret; 333} 334 335static voidinit_tree_desc_from_tree(struct tree_desc *desc,struct tree *tree) 336{ 337parse_tree(tree); 338init_tree_desc(desc, tree->buffer, tree->size); 339} 340 341static intgit_merge_trees(struct merge_options *o, 342struct tree *common, 343struct tree *head, 344struct tree *merge) 345{ 346int rc; 347struct tree_desc t[3]; 348struct index_state tmp_index = { NULL }; 349 350memset(&o->unpack_opts,0,sizeof(o->unpack_opts)); 351if(o->call_depth) 352 o->unpack_opts.index_only =1; 353else 354 o->unpack_opts.update =1; 355 o->unpack_opts.merge =1; 356 o->unpack_opts.head_idx =2; 357 o->unpack_opts.fn = threeway_merge; 358 o->unpack_opts.src_index = &the_index; 359 o->unpack_opts.dst_index = &tmp_index; 360 o->unpack_opts.aggressive = !merge_detect_rename(o); 361setup_unpack_trees_porcelain(&o->unpack_opts,"merge"); 362 363init_tree_desc_from_tree(t+0, common); 364init_tree_desc_from_tree(t+1, head); 365init_tree_desc_from_tree(t+2, merge); 366 367 rc =unpack_trees(3, t, &o->unpack_opts); 368cache_tree_free(&active_cache_tree); 369 370/* 371 * Update the_index to match the new results, AFTER saving a copy 372 * in o->orig_index. Update src_index to point to the saved copy. 373 * (verify_uptodate() checks src_index, and the original index is 374 * the one that had the necessary modification timestamps.) 375 */ 376 o->orig_index = the_index; 377 the_index = tmp_index; 378 o->unpack_opts.src_index = &o->orig_index; 379 380return rc; 381} 382 383struct tree *write_tree_from_memory(struct merge_options *o) 384{ 385struct tree *result = NULL; 386 387if(unmerged_cache()) { 388int i; 389fprintf(stderr,"BUG: There are unmerged index entries:\n"); 390for(i =0; i < active_nr; i++) { 391const struct cache_entry *ce = active_cache[i]; 392if(ce_stage(ce)) 393fprintf(stderr,"BUG:%d%.*s\n",ce_stage(ce), 394(int)ce_namelen(ce), ce->name); 395} 396BUG("unmerged index entries in merge-recursive.c"); 397} 398 399if(!active_cache_tree) 400 active_cache_tree =cache_tree(); 401 402if(!cache_tree_fully_valid(active_cache_tree) && 403cache_tree_update(&the_index,0) <0) { 404err(o,_("error building trees")); 405return NULL; 406} 407 408 result =lookup_tree(&active_cache_tree->oid); 409 410return result; 411} 412 413static intsave_files_dirs(const struct object_id *oid, 414struct strbuf *base,const char*path, 415unsigned int mode,int stage,void*context) 416{ 417struct path_hashmap_entry *entry; 418int baselen = base->len; 419struct merge_options *o = context; 420 421strbuf_addstr(base, path); 422 423FLEX_ALLOC_MEM(entry, path, base->buf, base->len); 424hashmap_entry_init(entry,path_hash(entry->path)); 425hashmap_add(&o->current_file_dir_set, entry); 426 427strbuf_setlen(base, baselen); 428return(S_ISDIR(mode) ? READ_TREE_RECURSIVE :0); 429} 430 431static voidget_files_dirs(struct merge_options *o,struct tree *tree) 432{ 433struct pathspec match_all; 434memset(&match_all,0,sizeof(match_all)); 435read_tree_recursive(tree,"",0,0, &match_all, save_files_dirs, o); 436} 437 438static intget_tree_entry_if_blob(const struct object_id *tree, 439const char*path, 440struct object_id *hashy, 441unsigned int*mode_o) 442{ 443int ret; 444 445 ret =get_tree_entry(tree, path, hashy, mode_o); 446if(S_ISDIR(*mode_o)) { 447oidcpy(hashy, &null_oid); 448*mode_o =0; 449} 450return ret; 451} 452 453/* 454 * Returns an index_entry instance which doesn't have to correspond to 455 * a real cache entry in Git's index. 456 */ 457static struct stage_data *insert_stage_data(const char*path, 458struct tree *o,struct tree *a,struct tree *b, 459struct string_list *entries) 460{ 461struct string_list_item *item; 462struct stage_data *e =xcalloc(1,sizeof(struct stage_data)); 463get_tree_entry_if_blob(&o->object.oid, path, 464&e->stages[1].oid, &e->stages[1].mode); 465get_tree_entry_if_blob(&a->object.oid, path, 466&e->stages[2].oid, &e->stages[2].mode); 467get_tree_entry_if_blob(&b->object.oid, path, 468&e->stages[3].oid, &e->stages[3].mode); 469 item =string_list_insert(entries, path); 470 item->util = e; 471return e; 472} 473 474/* 475 * Create a dictionary mapping file names to stage_data objects. The 476 * dictionary contains one entry for every path with a non-zero stage entry. 477 */ 478static struct string_list *get_unmerged(void) 479{ 480struct string_list *unmerged =xcalloc(1,sizeof(struct string_list)); 481int i; 482 483 unmerged->strdup_strings =1; 484 485for(i =0; i < active_nr; i++) { 486struct string_list_item *item; 487struct stage_data *e; 488const struct cache_entry *ce = active_cache[i]; 489if(!ce_stage(ce)) 490continue; 491 492 item =string_list_lookup(unmerged, ce->name); 493if(!item) { 494 item =string_list_insert(unmerged, ce->name); 495 item->util =xcalloc(1,sizeof(struct stage_data)); 496} 497 e = item->util; 498 e->stages[ce_stage(ce)].mode = ce->ce_mode; 499oidcpy(&e->stages[ce_stage(ce)].oid, &ce->oid); 500} 501 502return unmerged; 503} 504 505static intstring_list_df_name_compare(const char*one,const char*two) 506{ 507int onelen =strlen(one); 508int twolen =strlen(two); 509/* 510 * Here we only care that entries for D/F conflicts are 511 * adjacent, in particular with the file of the D/F conflict 512 * appearing before files below the corresponding directory. 513 * The order of the rest of the list is irrelevant for us. 514 * 515 * To achieve this, we sort with df_name_compare and provide 516 * the mode S_IFDIR so that D/F conflicts will sort correctly. 517 * We use the mode S_IFDIR for everything else for simplicity, 518 * since in other cases any changes in their order due to 519 * sorting cause no problems for us. 520 */ 521int cmp =df_name_compare(one, onelen, S_IFDIR, 522 two, twolen, S_IFDIR); 523/* 524 * Now that 'foo' and 'foo/bar' compare equal, we have to make sure 525 * that 'foo' comes before 'foo/bar'. 526 */ 527if(cmp) 528return cmp; 529return onelen - twolen; 530} 531 532static voidrecord_df_conflict_files(struct merge_options *o, 533struct string_list *entries) 534{ 535/* If there is a D/F conflict and the file for such a conflict 536 * currently exist in the working tree, we want to allow it to be 537 * removed to make room for the corresponding directory if needed. 538 * The files underneath the directories of such D/F conflicts will 539 * be processed before the corresponding file involved in the D/F 540 * conflict. If the D/F directory ends up being removed by the 541 * merge, then we won't have to touch the D/F file. If the D/F 542 * directory needs to be written to the working copy, then the D/F 543 * file will simply be removed (in make_room_for_path()) to make 544 * room for the necessary paths. Note that if both the directory 545 * and the file need to be present, then the D/F file will be 546 * reinstated with a new unique name at the time it is processed. 547 */ 548struct string_list df_sorted_entries = STRING_LIST_INIT_NODUP; 549const char*last_file = NULL; 550int last_len =0; 551int i; 552 553/* 554 * If we're merging merge-bases, we don't want to bother with 555 * any working directory changes. 556 */ 557if(o->call_depth) 558return; 559 560/* Ensure D/F conflicts are adjacent in the entries list. */ 561for(i =0; i < entries->nr; i++) { 562struct string_list_item *next = &entries->items[i]; 563string_list_append(&df_sorted_entries, next->string)->util = 564 next->util; 565} 566 df_sorted_entries.cmp = string_list_df_name_compare; 567string_list_sort(&df_sorted_entries); 568 569string_list_clear(&o->df_conflict_file_set,1); 570for(i =0; i < df_sorted_entries.nr; i++) { 571const char*path = df_sorted_entries.items[i].string; 572int len =strlen(path); 573struct stage_data *e = df_sorted_entries.items[i].util; 574 575/* 576 * Check if last_file & path correspond to a D/F conflict; 577 * i.e. whether path is last_file+'/'+<something>. 578 * If so, record that it's okay to remove last_file to make 579 * room for path and friends if needed. 580 */ 581if(last_file && 582 len > last_len && 583memcmp(path, last_file, last_len) ==0&& 584 path[last_len] =='/') { 585string_list_insert(&o->df_conflict_file_set, last_file); 586} 587 588/* 589 * Determine whether path could exist as a file in the 590 * working directory as a possible D/F conflict. This 591 * will only occur when it exists in stage 2 as a 592 * file. 593 */ 594if(S_ISREG(e->stages[2].mode) ||S_ISLNK(e->stages[2].mode)) { 595 last_file = path; 596 last_len = len; 597}else{ 598 last_file = NULL; 599} 600} 601string_list_clear(&df_sorted_entries,0); 602} 603 604struct rename { 605struct diff_filepair *pair; 606/* 607 * Purpose of src_entry and dst_entry: 608 * 609 * If 'before' is renamed to 'after' then src_entry will contain 610 * the versions of 'before' from the merge_base, HEAD, and MERGE in 611 * stages 1, 2, and 3; dst_entry will contain the respective 612 * versions of 'after' in corresponding locations. Thus, we have a 613 * total of six modes and oids, though some will be null. (Stage 0 614 * is ignored; we're interested in handling conflicts.) 615 * 616 * Since we don't turn on break-rewrites by default, neither 617 * src_entry nor dst_entry can have all three of their stages have 618 * non-null oids, meaning at most four of the six will be non-null. 619 * Also, since this is a rename, both src_entry and dst_entry will 620 * have at least one non-null oid, meaning at least two will be 621 * non-null. Of the six oids, a typical rename will have three be 622 * non-null. Only two implies a rename/delete, and four implies a 623 * rename/add. 624 */ 625struct stage_data *src_entry; 626struct stage_data *dst_entry; 627unsigned add_turned_into_rename:1; 628unsigned processed:1; 629}; 630 631static intupdate_stages(struct merge_options *opt,const char*path, 632const struct diff_filespec *o, 633const struct diff_filespec *a, 634const struct diff_filespec *b) 635{ 636 637/* 638 * NOTE: It is usually a bad idea to call update_stages on a path 639 * before calling update_file on that same path, since it can 640 * sometimes lead to spurious "refusing to lose untracked file..." 641 * messages from update_file (via make_room_for path via 642 * would_lose_untracked). Instead, reverse the order of the calls 643 * (executing update_file first and then update_stages). 644 */ 645int clear =1; 646int options = ADD_CACHE_OK_TO_ADD | ADD_CACHE_SKIP_DFCHECK; 647if(clear) 648if(remove_file_from_cache(path)) 649return-1; 650if(o) 651if(add_cacheinfo(opt, o->mode, &o->oid, path,1,0, options)) 652return-1; 653if(a) 654if(add_cacheinfo(opt, a->mode, &a->oid, path,2,0, options)) 655return-1; 656if(b) 657if(add_cacheinfo(opt, b->mode, &b->oid, path,3,0, options)) 658return-1; 659return0; 660} 661 662static intupdate_stages_for_stage_data(struct merge_options *opt, 663const char*path, 664const struct stage_data *stage_data) 665{ 666struct diff_filespec o, a, b; 667 668 o.mode = stage_data->stages[1].mode; 669oidcpy(&o.oid, &stage_data->stages[1].oid); 670 671 a.mode = stage_data->stages[2].mode; 672oidcpy(&a.oid, &stage_data->stages[2].oid); 673 674 b.mode = stage_data->stages[3].mode; 675oidcpy(&b.oid, &stage_data->stages[3].oid); 676 677returnupdate_stages(opt, path, 678is_null_oid(&o.oid) ? NULL : &o, 679is_null_oid(&a.oid) ? NULL : &a, 680is_null_oid(&b.oid) ? NULL : &b); 681} 682 683static voidupdate_entry(struct stage_data *entry, 684struct diff_filespec *o, 685struct diff_filespec *a, 686struct diff_filespec *b) 687{ 688 entry->processed =0; 689 entry->stages[1].mode = o->mode; 690 entry->stages[2].mode = a->mode; 691 entry->stages[3].mode = b->mode; 692oidcpy(&entry->stages[1].oid, &o->oid); 693oidcpy(&entry->stages[2].oid, &a->oid); 694oidcpy(&entry->stages[3].oid, &b->oid); 695} 696 697static intremove_file(struct merge_options *o,int clean, 698const char*path,int no_wd) 699{ 700int update_cache = o->call_depth || clean; 701int update_working_directory = !o->call_depth && !no_wd; 702 703if(update_cache) { 704if(remove_file_from_cache(path)) 705return-1; 706} 707if(update_working_directory) { 708if(ignore_case) { 709struct cache_entry *ce; 710 ce =cache_file_exists(path,strlen(path), ignore_case); 711if(ce &&ce_stage(ce) ==0&&strcmp(path, ce->name)) 712return0; 713} 714if(remove_path(path)) 715return-1; 716} 717return0; 718} 719 720/* add a string to a strbuf, but converting "/" to "_" */ 721static voidadd_flattened_path(struct strbuf *out,const char*s) 722{ 723size_t i = out->len; 724strbuf_addstr(out, s); 725for(; i < out->len; i++) 726if(out->buf[i] =='/') 727 out->buf[i] ='_'; 728} 729 730static char*unique_path(struct merge_options *o,const char*path,const char*branch) 731{ 732struct path_hashmap_entry *entry; 733struct strbuf newpath = STRBUF_INIT; 734int suffix =0; 735size_t base_len; 736 737strbuf_addf(&newpath,"%s~", path); 738add_flattened_path(&newpath, branch); 739 740 base_len = newpath.len; 741while(hashmap_get_from_hash(&o->current_file_dir_set, 742path_hash(newpath.buf), newpath.buf) || 743(!o->call_depth &&file_exists(newpath.buf))) { 744strbuf_setlen(&newpath, base_len); 745strbuf_addf(&newpath,"_%d", suffix++); 746} 747 748FLEX_ALLOC_MEM(entry, path, newpath.buf, newpath.len); 749hashmap_entry_init(entry,path_hash(entry->path)); 750hashmap_add(&o->current_file_dir_set, entry); 751returnstrbuf_detach(&newpath, NULL); 752} 753 754/** 755 * Check whether a directory in the index is in the way of an incoming 756 * file. Return 1 if so. If check_working_copy is non-zero, also 757 * check the working directory. If empty_ok is non-zero, also return 758 * 0 in the case where the working-tree dir exists but is empty. 759 */ 760static intdir_in_way(const char*path,int check_working_copy,int empty_ok) 761{ 762int pos; 763struct strbuf dirpath = STRBUF_INIT; 764struct stat st; 765 766strbuf_addstr(&dirpath, path); 767strbuf_addch(&dirpath,'/'); 768 769 pos =cache_name_pos(dirpath.buf, dirpath.len); 770 771if(pos <0) 772 pos = -1- pos; 773if(pos < active_nr && 774!strncmp(dirpath.buf, active_cache[pos]->name, dirpath.len)) { 775strbuf_release(&dirpath); 776return1; 777} 778 779strbuf_release(&dirpath); 780return check_working_copy && !lstat(path, &st) &&S_ISDIR(st.st_mode) && 781!(empty_ok &&is_empty_dir(path)); 782} 783 784/* 785 * Returns whether path was tracked in the index before the merge started, 786 * and its oid and mode match the specified values 787 */ 788static intwas_tracked_and_matches(struct merge_options *o,const char*path, 789const struct object_id *oid,unsigned mode) 790{ 791int pos =index_name_pos(&o->orig_index, path,strlen(path)); 792struct cache_entry *ce; 793 794if(0> pos) 795/* we were not tracking this path before the merge */ 796return0; 797 798/* See if the file we were tracking before matches */ 799 ce = o->orig_index.cache[pos]; 800return(oid_eq(&ce->oid, oid) && ce->ce_mode == mode); 801} 802 803/* 804 * Returns whether path was tracked in the index before the merge started 805 */ 806static intwas_tracked(struct merge_options *o,const char*path) 807{ 808int pos =index_name_pos(&o->orig_index, path,strlen(path)); 809 810if(0<= pos) 811/* we were tracking this path before the merge */ 812return1; 813 814return0; 815} 816 817static intwould_lose_untracked(const char*path) 818{ 819/* 820 * This may look like it can be simplified to: 821 * return !was_tracked(o, path) && file_exists(path) 822 * but it can't. This function needs to know whether path was in 823 * the working tree due to EITHER having been tracked in the index 824 * before the merge OR having been put into the working copy and 825 * index by unpack_trees(). Due to that either-or requirement, we 826 * check the current index instead of the original one. 827 * 828 * Note that we do not need to worry about merge-recursive itself 829 * updating the index after unpack_trees() and before calling this 830 * function, because we strictly require all code paths in 831 * merge-recursive to update the working tree first and the index 832 * second. Doing otherwise would break 833 * update_file()/would_lose_untracked(); see every comment in this 834 * file which mentions "update_stages". 835 */ 836int pos =cache_name_pos(path,strlen(path)); 837 838if(pos <0) 839 pos = -1- pos; 840while(pos < active_nr && 841!strcmp(path, active_cache[pos]->name)) { 842/* 843 * If stage #0, it is definitely tracked. 844 * If it has stage #2 then it was tracked 845 * before this merge started. All other 846 * cases the path was not tracked. 847 */ 848switch(ce_stage(active_cache[pos])) { 849case0: 850case2: 851return0; 852} 853 pos++; 854} 855returnfile_exists(path); 856} 857 858static intwas_dirty(struct merge_options *o,const char*path) 859{ 860struct cache_entry *ce; 861int dirty =1; 862 863if(o->call_depth || !was_tracked(o, path)) 864return!dirty; 865 866 ce =index_file_exists(o->unpack_opts.src_index, 867 path,strlen(path), ignore_case); 868 dirty =verify_uptodate(ce, &o->unpack_opts) !=0; 869return dirty; 870} 871 872static intmake_room_for_path(struct merge_options *o,const char*path) 873{ 874int status, i; 875const char*msg =_("failed to create path '%s'%s"); 876 877/* Unlink any D/F conflict files that are in the way */ 878for(i =0; i < o->df_conflict_file_set.nr; i++) { 879const char*df_path = o->df_conflict_file_set.items[i].string; 880size_t pathlen =strlen(path); 881size_t df_pathlen =strlen(df_path); 882if(df_pathlen < pathlen && 883 path[df_pathlen] =='/'&& 884strncmp(path, df_path, df_pathlen) ==0) { 885output(o,3, 886_("Removing%sto make room for subdirectory\n"), 887 df_path); 888unlink(df_path); 889unsorted_string_list_delete_item(&o->df_conflict_file_set, 890 i,0); 891break; 892} 893} 894 895/* Make sure leading directories are created */ 896 status =safe_create_leading_directories_const(path); 897if(status) { 898if(status == SCLD_EXISTS) 899/* something else exists */ 900returnerr(o, msg, path,_(": perhaps a D/F conflict?")); 901returnerr(o, msg, path,""); 902} 903 904/* 905 * Do not unlink a file in the work tree if we are not 906 * tracking it. 907 */ 908if(would_lose_untracked(path)) 909returnerr(o,_("refusing to lose untracked file at '%s'"), 910 path); 911 912/* Successful unlink is good.. */ 913if(!unlink(path)) 914return0; 915/* .. and so is no existing file */ 916if(errno == ENOENT) 917return0; 918/* .. but not some other error (who really cares what?) */ 919returnerr(o, msg, path,_(": perhaps a D/F conflict?")); 920} 921 922static intupdate_file_flags(struct merge_options *o, 923const struct object_id *oid, 924unsigned mode, 925const char*path, 926int update_cache, 927int update_wd) 928{ 929int ret =0; 930 931if(o->call_depth) 932 update_wd =0; 933 934if(update_wd) { 935enum object_type type; 936void*buf; 937unsigned long size; 938 939if(S_ISGITLINK(mode)) { 940/* 941 * We may later decide to recursively descend into 942 * the submodule directory and update its index 943 * and/or work tree, but we do not do that now. 944 */ 945 update_wd =0; 946goto update_index; 947} 948 949 buf =read_object_file(oid, &type, &size); 950if(!buf) 951returnerr(o,_("cannot read object%s'%s'"),oid_to_hex(oid), path); 952if(type != OBJ_BLOB) { 953 ret =err(o,_("blob expected for%s'%s'"),oid_to_hex(oid), path); 954goto free_buf; 955} 956if(S_ISREG(mode)) { 957struct strbuf strbuf = STRBUF_INIT; 958if(convert_to_working_tree(path, buf, size, &strbuf)) { 959free(buf); 960 size = strbuf.len; 961 buf =strbuf_detach(&strbuf, NULL); 962} 963} 964 965if(make_room_for_path(o, path) <0) { 966 update_wd =0; 967goto free_buf; 968} 969if(S_ISREG(mode) || (!has_symlinks &&S_ISLNK(mode))) { 970int fd; 971if(mode &0100) 972 mode =0777; 973else 974 mode =0666; 975 fd =open(path, O_WRONLY | O_TRUNC | O_CREAT, mode); 976if(fd <0) { 977 ret =err(o,_("failed to open '%s':%s"), 978 path,strerror(errno)); 979goto free_buf; 980} 981write_in_full(fd, buf, size); 982close(fd); 983}else if(S_ISLNK(mode)) { 984char*lnk =xmemdupz(buf, size); 985safe_create_leading_directories_const(path); 986unlink(path); 987if(symlink(lnk, path)) 988 ret =err(o,_("failed to symlink '%s':%s"), 989 path,strerror(errno)); 990free(lnk); 991}else 992 ret =err(o, 993_("do not know what to do with%06o%s'%s'"), 994 mode,oid_to_hex(oid), path); 995 free_buf: 996free(buf); 997} 998 update_index: 999if(!ret && update_cache)1000if(add_cacheinfo(o, mode, oid, path,0, update_wd,1001 ADD_CACHE_OK_TO_ADD))1002return-1;1003return ret;1004}10051006static intupdate_file(struct merge_options *o,1007int clean,1008const struct object_id *oid,1009unsigned mode,1010const char*path)1011{1012returnupdate_file_flags(o, oid, mode, path, o->call_depth || clean, !o->call_depth);1013}10141015/* Low level file merging, update and removal */10161017struct merge_file_info {1018struct object_id oid;1019unsigned mode;1020unsigned clean:1,1021 merge:1;1022};10231024static intmerge_3way(struct merge_options *o,1025 mmbuffer_t *result_buf,1026const struct diff_filespec *one,1027const struct diff_filespec *a,1028const struct diff_filespec *b,1029const char*branch1,1030const char*branch2)1031{1032 mmfile_t orig, src1, src2;1033struct ll_merge_options ll_opts = {0};1034char*base_name, *name1, *name2;1035int merge_status;10361037 ll_opts.renormalize = o->renormalize;1038 ll_opts.xdl_opts = o->xdl_opts;10391040if(o->call_depth) {1041 ll_opts.virtual_ancestor =1;1042 ll_opts.variant =0;1043}else{1044switch(o->recursive_variant) {1045case MERGE_RECURSIVE_OURS:1046 ll_opts.variant = XDL_MERGE_FAVOR_OURS;1047break;1048case MERGE_RECURSIVE_THEIRS:1049 ll_opts.variant = XDL_MERGE_FAVOR_THEIRS;1050break;1051default:1052 ll_opts.variant =0;1053break;1054}1055}10561057if(strcmp(a->path, b->path) ||1058(o->ancestor != NULL &&strcmp(a->path, one->path) !=0)) {1059 base_name = o->ancestor == NULL ? NULL :1060mkpathdup("%s:%s", o->ancestor, one->path);1061 name1 =mkpathdup("%s:%s", branch1, a->path);1062 name2 =mkpathdup("%s:%s", branch2, b->path);1063}else{1064 base_name = o->ancestor == NULL ? NULL :1065mkpathdup("%s", o->ancestor);1066 name1 =mkpathdup("%s", branch1);1067 name2 =mkpathdup("%s", branch2);1068}10691070read_mmblob(&orig, &one->oid);1071read_mmblob(&src1, &a->oid);1072read_mmblob(&src2, &b->oid);10731074 merge_status =ll_merge(result_buf, a->path, &orig, base_name,1075&src1, name1, &src2, name2, &ll_opts);10761077free(base_name);1078free(name1);1079free(name2);1080free(orig.ptr);1081free(src1.ptr);1082free(src2.ptr);1083return merge_status;1084}10851086static intfind_first_merges(struct object_array *result,const char*path,1087struct commit *a,struct commit *b)1088{1089int i, j;1090struct object_array merges = OBJECT_ARRAY_INIT;1091struct commit *commit;1092int contains_another;10931094char merged_revision[42];1095const char*rev_args[] = {"rev-list","--merges","--ancestry-path",1096"--all", merged_revision, NULL };1097struct rev_info revs;1098struct setup_revision_opt rev_opts;10991100memset(result,0,sizeof(struct object_array));1101memset(&rev_opts,0,sizeof(rev_opts));11021103/* get all revisions that merge commit a */1104xsnprintf(merged_revision,sizeof(merged_revision),"^%s",1105oid_to_hex(&a->object.oid));1106init_revisions(&revs, NULL);1107 rev_opts.submodule = path;1108/* FIXME: can't handle linked worktrees in submodules yet */1109 revs.single_worktree = path != NULL;1110setup_revisions(ARRAY_SIZE(rev_args)-1, rev_args, &revs, &rev_opts);11111112/* save all revisions from the above list that contain b */1113if(prepare_revision_walk(&revs))1114die("revision walk setup failed");1115while((commit =get_revision(&revs)) != NULL) {1116struct object *o = &(commit->object);1117if(in_merge_bases(b, commit))1118add_object_array(o, NULL, &merges);1119}1120reset_revision_walk();11211122/* Now we've got all merges that contain a and b. Prune all1123 * merges that contain another found merge and save them in1124 * result.1125 */1126for(i =0; i < merges.nr; i++) {1127struct commit *m1 = (struct commit *) merges.objects[i].item;11281129 contains_another =0;1130for(j =0; j < merges.nr; j++) {1131struct commit *m2 = (struct commit *) merges.objects[j].item;1132if(i != j &&in_merge_bases(m2, m1)) {1133 contains_another =1;1134break;1135}1136}11371138if(!contains_another)1139add_object_array(merges.objects[i].item, NULL, result);1140}11411142object_array_clear(&merges);1143return result->nr;1144}11451146static voidprint_commit(struct commit *commit)1147{1148struct strbuf sb = STRBUF_INIT;1149struct pretty_print_context ctx = {0};1150 ctx.date_mode.type = DATE_NORMAL;1151format_commit_message(commit,"%h:%m %s", &sb, &ctx);1152fprintf(stderr,"%s\n", sb.buf);1153strbuf_release(&sb);1154}11551156static intmerge_submodule(struct merge_options *o,1157struct object_id *result,const char*path,1158const struct object_id *base,const struct object_id *a,1159const struct object_id *b)1160{1161struct commit *commit_base, *commit_a, *commit_b;1162int parent_count;1163struct object_array merges;11641165int i;1166int search = !o->call_depth;11671168/* store a in result in case we fail */1169oidcpy(result, a);11701171/* we can not handle deletion conflicts */1172if(is_null_oid(base))1173return0;1174if(is_null_oid(a))1175return0;1176if(is_null_oid(b))1177return0;11781179if(add_submodule_odb(path)) {1180output(o,1,_("Failed to merge submodule%s(not checked out)"), path);1181return0;1182}11831184if(!(commit_base =lookup_commit_reference(base)) ||1185!(commit_a =lookup_commit_reference(a)) ||1186!(commit_b =lookup_commit_reference(b))) {1187output(o,1,_("Failed to merge submodule%s(commits not present)"), path);1188return0;1189}11901191/* check whether both changes are forward */1192if(!in_merge_bases(commit_base, commit_a) ||1193!in_merge_bases(commit_base, commit_b)) {1194output(o,1,_("Failed to merge submodule%s(commits don't follow merge-base)"), path);1195return0;1196}11971198/* Case #1: a is contained in b or vice versa */1199if(in_merge_bases(commit_a, commit_b)) {1200oidcpy(result, b);1201if(show(o,3)) {1202output(o,3,_("Fast-forwarding submodule%sto the following commit:"), path);1203output_commit_title(o, commit_b);1204}else if(show(o,2))1205output(o,2,_("Fast-forwarding submodule%sto%s"), path,oid_to_hex(b));1206else1207;/* no output */12081209return1;1210}1211if(in_merge_bases(commit_b, commit_a)) {1212oidcpy(result, a);1213if(show(o,3)) {1214output(o,3,_("Fast-forwarding submodule%sto the following commit:"), path);1215output_commit_title(o, commit_a);1216}else if(show(o,2))1217output(o,2,_("Fast-forwarding submodule%sto%s"), path,oid_to_hex(a));1218else1219;/* no output */12201221return1;1222}12231224/*1225 * Case #2: There are one or more merges that contain a and b in1226 * the submodule. If there is only one, then present it as a1227 * suggestion to the user, but leave it marked unmerged so the1228 * user needs to confirm the resolution.1229 */12301231/* Skip the search if makes no sense to the calling context. */1232if(!search)1233return0;12341235/* find commit which merges them */1236 parent_count =find_first_merges(&merges, path, commit_a, commit_b);1237switch(parent_count) {1238case0:1239output(o,1,_("Failed to merge submodule%s(merge following commits not found)"), path);1240break;12411242case1:1243output(o,1,_("Failed to merge submodule%s(not fast-forward)"), path);1244output(o,2,_("Found a possible merge resolution for the submodule:\n"));1245print_commit((struct commit *) merges.objects[0].item);1246output(o,2,_(1247"If this is correct simply add it to the index "1248"for example\n"1249"by using:\n\n"1250" git update-index --cacheinfo 160000%s\"%s\"\n\n"1251"which will accept this suggestion.\n"),1252oid_to_hex(&merges.objects[0].item->oid), path);1253break;12541255default:1256output(o,1,_("Failed to merge submodule%s(multiple merges found)"), path);1257for(i =0; i < merges.nr; i++)1258print_commit((struct commit *) merges.objects[i].item);1259}12601261object_array_clear(&merges);1262return0;1263}12641265static intmerge_file_1(struct merge_options *o,1266const struct diff_filespec *one,1267const struct diff_filespec *a,1268const struct diff_filespec *b,1269const char*filename,1270const char*branch1,1271const char*branch2,1272struct merge_file_info *result)1273{1274 result->merge =0;1275 result->clean =1;12761277if((S_IFMT & a->mode) != (S_IFMT & b->mode)) {1278 result->clean =0;1279if(S_ISREG(a->mode)) {1280 result->mode = a->mode;1281oidcpy(&result->oid, &a->oid);1282}else{1283 result->mode = b->mode;1284oidcpy(&result->oid, &b->oid);1285}1286}else{1287if(!oid_eq(&a->oid, &one->oid) && !oid_eq(&b->oid, &one->oid))1288 result->merge =1;12891290/*1291 * Merge modes1292 */1293if(a->mode == b->mode || a->mode == one->mode)1294 result->mode = b->mode;1295else{1296 result->mode = a->mode;1297if(b->mode != one->mode) {1298 result->clean =0;1299 result->merge =1;1300}1301}13021303if(oid_eq(&a->oid, &b->oid) ||oid_eq(&a->oid, &one->oid))1304oidcpy(&result->oid, &b->oid);1305else if(oid_eq(&b->oid, &one->oid))1306oidcpy(&result->oid, &a->oid);1307else if(S_ISREG(a->mode)) {1308 mmbuffer_t result_buf;1309int ret =0, merge_status;13101311 merge_status =merge_3way(o, &result_buf, one, a, b,1312 branch1, branch2);13131314if((merge_status <0) || !result_buf.ptr)1315 ret =err(o,_("Failed to execute internal merge"));13161317if(!ret &&1318write_object_file(result_buf.ptr, result_buf.size,1319 blob_type, &result->oid))1320 ret =err(o,_("Unable to add%sto database"),1321 a->path);13221323free(result_buf.ptr);1324if(ret)1325return ret;1326 result->clean = (merge_status ==0);1327}else if(S_ISGITLINK(a->mode)) {1328 result->clean =merge_submodule(o, &result->oid,1329 one->path,1330&one->oid,1331&a->oid,1332&b->oid);1333}else if(S_ISLNK(a->mode)) {1334switch(o->recursive_variant) {1335case MERGE_RECURSIVE_NORMAL:1336oidcpy(&result->oid, &a->oid);1337if(!oid_eq(&a->oid, &b->oid))1338 result->clean =0;1339break;1340case MERGE_RECURSIVE_OURS:1341oidcpy(&result->oid, &a->oid);1342break;1343case MERGE_RECURSIVE_THEIRS:1344oidcpy(&result->oid, &b->oid);1345break;1346}1347}else1348BUG("unsupported object type in the tree");1349}13501351if(result->merge)1352output(o,2,_("Auto-merging%s"), filename);13531354return0;1355}13561357static intmerge_file_special_markers(struct merge_options *o,1358const struct diff_filespec *one,1359const struct diff_filespec *a,1360const struct diff_filespec *b,1361const char*target_filename,1362const char*branch1,1363const char*filename1,1364const char*branch2,1365const char*filename2,1366struct merge_file_info *mfi)1367{1368char*side1 = NULL;1369char*side2 = NULL;1370int ret;13711372if(filename1)1373 side1 =xstrfmt("%s:%s", branch1, filename1);1374if(filename2)1375 side2 =xstrfmt("%s:%s", branch2, filename2);13761377 ret =merge_file_1(o, one, a, b, target_filename,1378 side1 ? side1 : branch1,1379 side2 ? side2 : branch2, mfi);13801381free(side1);1382free(side2);1383return ret;1384}13851386static intmerge_file_one(struct merge_options *o,1387const char*path,1388const struct object_id *o_oid,int o_mode,1389const struct object_id *a_oid,int a_mode,1390const struct object_id *b_oid,int b_mode,1391const char*branch1,1392const char*branch2,1393struct merge_file_info *mfi)1394{1395struct diff_filespec one, a, b;13961397 one.path = a.path = b.path = (char*)path;1398oidcpy(&one.oid, o_oid);1399 one.mode = o_mode;1400oidcpy(&a.oid, a_oid);1401 a.mode = a_mode;1402oidcpy(&b.oid, b_oid);1403 b.mode = b_mode;1404returnmerge_file_1(o, &one, &a, &b, path, branch1, branch2, mfi);1405}14061407static intconflict_rename_dir(struct merge_options *o,1408struct diff_filepair *pair,1409const char*rename_branch,1410const char*other_branch)1411{1412const struct diff_filespec *dest = pair->two;14131414if(!o->call_depth &&would_lose_untracked(dest->path)) {1415char*alt_path =unique_path(o, dest->path, rename_branch);14161417output(o,1,_("Error: Refusing to lose untracked file at%s; "1418"writing to%sinstead."),1419 dest->path, alt_path);1420/*1421 * Write the file in worktree at alt_path, but not in the1422 * index. Instead, write to dest->path for the index but1423 * only at the higher appropriate stage.1424 */1425if(update_file(o,0, &dest->oid, dest->mode, alt_path))1426return-1;1427free(alt_path);1428returnupdate_stages(o, dest->path, NULL,1429 rename_branch == o->branch1 ? dest : NULL,1430 rename_branch == o->branch1 ? NULL : dest);1431}14321433/* Update dest->path both in index and in worktree */1434if(update_file(o,1, &dest->oid, dest->mode, dest->path))1435return-1;1436return0;1437}14381439static inthandle_change_delete(struct merge_options *o,1440const char*path,const char*old_path,1441const struct object_id *o_oid,int o_mode,1442const struct object_id *changed_oid,1443int changed_mode,1444const char*change_branch,1445const char*delete_branch,1446const char*change,const char*change_past)1447{1448char*alt_path = NULL;1449const char*update_path = path;1450int ret =0;14511452if(dir_in_way(path, !o->call_depth,0) ||1453(!o->call_depth &&would_lose_untracked(path))) {1454 update_path = alt_path =unique_path(o, path, change_branch);1455}14561457if(o->call_depth) {1458/*1459 * We cannot arbitrarily accept either a_sha or b_sha as1460 * correct; since there is no true "middle point" between1461 * them, simply reuse the base version for virtual merge base.1462 */1463 ret =remove_file_from_cache(path);1464if(!ret)1465 ret =update_file(o,0, o_oid, o_mode, update_path);1466}else{1467if(!alt_path) {1468if(!old_path) {1469output(o,1,_("CONFLICT (%s/delete):%sdeleted in%s"1470"and%sin%s. Version%sof%sleft in tree."),1471 change, path, delete_branch, change_past,1472 change_branch, change_branch, path);1473}else{1474output(o,1,_("CONFLICT (%s/delete):%sdeleted in%s"1475"and%sto%sin%s. Version%sof%sleft in tree."),1476 change, old_path, delete_branch, change_past, path,1477 change_branch, change_branch, path);1478}1479}else{1480if(!old_path) {1481output(o,1,_("CONFLICT (%s/delete):%sdeleted in%s"1482"and%sin%s. Version%sof%sleft in tree at%s."),1483 change, path, delete_branch, change_past,1484 change_branch, change_branch, path, alt_path);1485}else{1486output(o,1,_("CONFLICT (%s/delete):%sdeleted in%s"1487"and%sto%sin%s. Version%sof%sleft in tree at%s."),1488 change, old_path, delete_branch, change_past, path,1489 change_branch, change_branch, path, alt_path);1490}1491}1492/*1493 * No need to call update_file() on path when change_branch ==1494 * o->branch1 && !alt_path, since that would needlessly touch1495 * path. We could call update_file_flags() with update_cache=01496 * and update_wd=0, but that's a no-op.1497 */1498if(change_branch != o->branch1 || alt_path)1499 ret =update_file(o,0, changed_oid, changed_mode, update_path);1500}1501free(alt_path);15021503return ret;1504}15051506static intconflict_rename_delete(struct merge_options *o,1507struct diff_filepair *pair,1508const char*rename_branch,1509const char*delete_branch)1510{1511const struct diff_filespec *orig = pair->one;1512const struct diff_filespec *dest = pair->two;15131514if(handle_change_delete(o,1515 o->call_depth ? orig->path : dest->path,1516 o->call_depth ? NULL : orig->path,1517&orig->oid, orig->mode,1518&dest->oid, dest->mode,1519 rename_branch, delete_branch,1520_("rename"),_("renamed")))1521return-1;15221523if(o->call_depth)1524returnremove_file_from_cache(dest->path);1525else1526returnupdate_stages(o, dest->path, NULL,1527 rename_branch == o->branch1 ? dest : NULL,1528 rename_branch == o->branch1 ? NULL : dest);1529}15301531static struct diff_filespec *filespec_from_entry(struct diff_filespec *target,1532struct stage_data *entry,1533int stage)1534{1535struct object_id *oid = &entry->stages[stage].oid;1536unsigned mode = entry->stages[stage].mode;1537if(mode ==0||is_null_oid(oid))1538return NULL;1539oidcpy(&target->oid, oid);1540 target->mode = mode;1541return target;1542}15431544static inthandle_file(struct merge_options *o,1545struct diff_filespec *rename,1546int stage,1547struct rename_conflict_info *ci)1548{1549char*dst_name = rename->path;1550struct stage_data *dst_entry;1551const char*cur_branch, *other_branch;1552struct diff_filespec other;1553struct diff_filespec *add;1554int ret;15551556if(stage ==2) {1557 dst_entry = ci->dst_entry1;1558 cur_branch = ci->branch1;1559 other_branch = ci->branch2;1560}else{1561 dst_entry = ci->dst_entry2;1562 cur_branch = ci->branch2;1563 other_branch = ci->branch1;1564}15651566 add =filespec_from_entry(&other, dst_entry, stage ^1);1567if(add) {1568int ren_src_was_dirty =was_dirty(o, rename->path);1569char*add_name =unique_path(o, rename->path, other_branch);1570if(update_file(o,0, &add->oid, add->mode, add_name))1571return-1;15721573if(ren_src_was_dirty) {1574output(o,1,_("Refusing to lose dirty file at%s"),1575 rename->path);1576}1577/*1578 * Because the double negatives somehow keep confusing me...1579 * 1) update_wd iff !ren_src_was_dirty.1580 * 2) no_wd iff !update_wd1581 * 3) so, no_wd == !!ren_src_was_dirty == ren_src_was_dirty1582 */1583remove_file(o,0, rename->path, ren_src_was_dirty);1584 dst_name =unique_path(o, rename->path, cur_branch);1585}else{1586if(dir_in_way(rename->path, !o->call_depth,0)) {1587 dst_name =unique_path(o, rename->path, cur_branch);1588output(o,1,_("%sis a directory in%sadding as%sinstead"),1589 rename->path, other_branch, dst_name);1590}else if(!o->call_depth &&1591would_lose_untracked(rename->path)) {1592 dst_name =unique_path(o, rename->path, cur_branch);1593output(o,1,_("Refusing to lose untracked file at%s; "1594"adding as%sinstead"),1595 rename->path, dst_name);1596}1597}1598if((ret =update_file(o,0, &rename->oid, rename->mode, dst_name)))1599;/* fall through, do allow dst_name to be released */1600else if(stage ==2)1601 ret =update_stages(o, rename->path, NULL, rename, add);1602else1603 ret =update_stages(o, rename->path, NULL, add, rename);16041605if(dst_name != rename->path)1606free(dst_name);16071608return ret;1609}16101611static intconflict_rename_rename_1to2(struct merge_options *o,1612struct rename_conflict_info *ci)1613{1614/* One file was renamed in both branches, but to different names. */1615struct diff_filespec *one = ci->pair1->one;1616struct diff_filespec *a = ci->pair1->two;1617struct diff_filespec *b = ci->pair2->two;16181619output(o,1,_("CONFLICT (rename/rename): "1620"Rename\"%s\"->\"%s\"in branch\"%s\""1621"rename\"%s\"->\"%s\"in\"%s\"%s"),1622 one->path, a->path, ci->branch1,1623 one->path, b->path, ci->branch2,1624 o->call_depth ?_(" (left unresolved)") :"");1625if(o->call_depth) {1626struct merge_file_info mfi;1627struct diff_filespec other;1628struct diff_filespec *add;1629if(merge_file_one(o, one->path,1630&one->oid, one->mode,1631&a->oid, a->mode,1632&b->oid, b->mode,1633 ci->branch1, ci->branch2, &mfi))1634return-1;16351636/*1637 * FIXME: For rename/add-source conflicts (if we could detect1638 * such), this is wrong. We should instead find a unique1639 * pathname and then either rename the add-source file to that1640 * unique path, or use that unique path instead of src here.1641 */1642if(update_file(o,0, &mfi.oid, mfi.mode, one->path))1643return-1;16441645/*1646 * Above, we put the merged content at the merge-base's1647 * path. Now we usually need to delete both a->path and1648 * b->path. However, the rename on each side of the merge1649 * could also be involved in a rename/add conflict. In1650 * such cases, we should keep the added file around,1651 * resolving the conflict at that path in its favor.1652 */1653 add =filespec_from_entry(&other, ci->dst_entry1,2^1);1654if(add) {1655if(update_file(o,0, &add->oid, add->mode, a->path))1656return-1;1657}1658else1659remove_file_from_cache(a->path);1660 add =filespec_from_entry(&other, ci->dst_entry2,3^1);1661if(add) {1662if(update_file(o,0, &add->oid, add->mode, b->path))1663return-1;1664}1665else1666remove_file_from_cache(b->path);1667}else if(handle_file(o, a,2, ci) ||handle_file(o, b,3, ci))1668return-1;16691670return0;1671}16721673static intconflict_rename_rename_2to1(struct merge_options *o,1674struct rename_conflict_info *ci)1675{1676/* Two files, a & b, were renamed to the same thing, c. */1677struct diff_filespec *a = ci->pair1->one;1678struct diff_filespec *b = ci->pair2->one;1679struct diff_filespec *c1 = ci->pair1->two;1680struct diff_filespec *c2 = ci->pair2->two;1681char*path = c1->path;/* == c2->path */1682char*path_side_1_desc;1683char*path_side_2_desc;1684struct merge_file_info mfi_c1;1685struct merge_file_info mfi_c2;1686int ret;16871688output(o,1,_("CONFLICT (rename/rename): "1689"Rename%s->%sin%s. "1690"Rename%s->%sin%s"),1691 a->path, c1->path, ci->branch1,1692 b->path, c2->path, ci->branch2);16931694remove_file(o,1, a->path, o->call_depth ||would_lose_untracked(a->path));1695remove_file(o,1, b->path, o->call_depth ||would_lose_untracked(b->path));16961697 path_side_1_desc =xstrfmt("%s(was%s)", path, a->path);1698 path_side_2_desc =xstrfmt("%s(was%s)", path, b->path);1699if(merge_file_special_markers(o, a, c1, &ci->ren1_other,1700 path_side_1_desc,1701 o->branch1, c1->path,1702 o->branch2, ci->ren1_other.path, &mfi_c1) ||1703merge_file_special_markers(o, b, &ci->ren2_other, c2,1704 path_side_2_desc,1705 o->branch1, ci->ren2_other.path,1706 o->branch2, c2->path, &mfi_c2))1707return-1;1708free(path_side_1_desc);1709free(path_side_2_desc);17101711if(o->call_depth) {1712/*1713 * If mfi_c1.clean && mfi_c2.clean, then it might make1714 * sense to do a two-way merge of those results. But, I1715 * think in all cases, it makes sense to have the virtual1716 * merge base just undo the renames; they can be detected1717 * again later for the non-recursive merge.1718 */1719remove_file(o,0, path,0);1720 ret =update_file(o,0, &mfi_c1.oid, mfi_c1.mode, a->path);1721if(!ret)1722 ret =update_file(o,0, &mfi_c2.oid, mfi_c2.mode,1723 b->path);1724}else{1725char*new_path1 =unique_path(o, path, ci->branch1);1726char*new_path2 =unique_path(o, path, ci->branch2);1727output(o,1,_("Renaming%sto%sand%sto%sinstead"),1728 a->path, new_path1, b->path, new_path2);1729if(was_dirty(o, path))1730output(o,1,_("Refusing to lose dirty file at%s"),1731 path);1732else if(would_lose_untracked(path))1733/*1734 * Only way we get here is if both renames were from1735 * a directory rename AND user had an untracked file1736 * at the location where both files end up after the1737 * two directory renames. See testcase 10d of t6043.1738 */1739output(o,1,_("Refusing to lose untracked file at "1740"%s, even though it's in the way."),1741 path);1742else1743remove_file(o,0, path,0);1744 ret =update_file(o,0, &mfi_c1.oid, mfi_c1.mode, new_path1);1745if(!ret)1746 ret =update_file(o,0, &mfi_c2.oid, mfi_c2.mode,1747 new_path2);1748/*1749 * unpack_trees() actually populates the index for us for1750 * "normal" rename/rename(2to1) situtations so that the1751 * correct entries are at the higher stages, which would1752 * make the call below to update_stages_for_stage_data1753 * unnecessary. However, if either of the renames came1754 * from a directory rename, then unpack_trees() will not1755 * have gotten the right data loaded into the index, so we1756 * need to do so now. (While it'd be tempting to move this1757 * call to update_stages_for_stage_data() to1758 * apply_directory_rename_modifications(), that would break1759 * our intermediate calls to would_lose_untracked() since1760 * those rely on the current in-memory index. See also the1761 * big "NOTE" in update_stages()).1762 */1763if(update_stages_for_stage_data(o, path, ci->dst_entry1))1764 ret = -1;17651766free(new_path2);1767free(new_path1);1768}17691770return ret;1771}17721773/*1774 * Get the diff_filepairs changed between o_tree and tree.1775 */1776static struct diff_queue_struct *get_diffpairs(struct merge_options *o,1777struct tree *o_tree,1778struct tree *tree)1779{1780struct diff_queue_struct *ret;1781struct diff_options opts;17821783diff_setup(&opts);1784 opts.flags.recursive =1;1785 opts.flags.rename_empty =0;1786 opts.detect_rename =merge_detect_rename(o);1787/*1788 * We do not have logic to handle the detection of copies. In1789 * fact, it may not even make sense to add such logic: would we1790 * really want a change to a base file to be propagated through1791 * multiple other files by a merge?1792 */1793if(opts.detect_rename > DIFF_DETECT_RENAME)1794 opts.detect_rename = DIFF_DETECT_RENAME;1795 opts.rename_limit = o->merge_rename_limit >=0? o->merge_rename_limit :1796 o->diff_rename_limit >=0? o->diff_rename_limit :17971000;1798 opts.rename_score = o->rename_score;1799 opts.show_rename_progress = o->show_rename_progress;1800 opts.output_format = DIFF_FORMAT_NO_OUTPUT;1801diff_setup_done(&opts);1802diff_tree_oid(&o_tree->object.oid, &tree->object.oid,"", &opts);1803diffcore_std(&opts);1804if(opts.needed_rename_limit > o->needed_rename_limit)1805 o->needed_rename_limit = opts.needed_rename_limit;18061807 ret =xmalloc(sizeof(*ret));1808*ret = diff_queued_diff;18091810 opts.output_format = DIFF_FORMAT_NO_OUTPUT;1811 diff_queued_diff.nr =0;1812 diff_queued_diff.queue = NULL;1813diff_flush(&opts);1814return ret;1815}18161817static inttree_has_path(struct tree *tree,const char*path)1818{1819struct object_id hashy;1820unsigned int mode_o;18211822return!get_tree_entry(&tree->object.oid, path,1823&hashy, &mode_o);1824}18251826/*1827 * Return a new string that replaces the beginning portion (which matches1828 * entry->dir), with entry->new_dir. In perl-speak:1829 * new_path_name = (old_path =~ s/entry->dir/entry->new_dir/);1830 * NOTE:1831 * Caller must ensure that old_path starts with entry->dir + '/'.1832 */1833static char*apply_dir_rename(struct dir_rename_entry *entry,1834const char*old_path)1835{1836struct strbuf new_path = STRBUF_INIT;1837int oldlen, newlen;18381839if(entry->non_unique_new_dir)1840return NULL;18411842 oldlen =strlen(entry->dir);1843 newlen = entry->new_dir.len + (strlen(old_path) - oldlen) +1;1844strbuf_grow(&new_path, newlen);1845strbuf_addbuf(&new_path, &entry->new_dir);1846strbuf_addstr(&new_path, &old_path[oldlen]);18471848returnstrbuf_detach(&new_path, NULL);1849}18501851static voidget_renamed_dir_portion(const char*old_path,const char*new_path,1852char**old_dir,char**new_dir)1853{1854char*end_of_old, *end_of_new;1855int old_len, new_len;18561857*old_dir = NULL;1858*new_dir = NULL;18591860/*1861 * For1862 * "a/b/c/d/e/foo.c" -> "a/b/some/thing/else/e/foo.c"1863 * the "e/foo.c" part is the same, we just want to know that1864 * "a/b/c/d" was renamed to "a/b/some/thing/else"1865 * so, for this example, this function returns "a/b/c/d" in1866 * *old_dir and "a/b/some/thing/else" in *new_dir.1867 *1868 * Also, if the basename of the file changed, we don't care. We1869 * want to know which portion of the directory, if any, changed.1870 */1871 end_of_old =strrchr(old_path,'/');1872 end_of_new =strrchr(new_path,'/');18731874if(end_of_old == NULL || end_of_new == NULL)1875return;1876while(*--end_of_new == *--end_of_old &&1877 end_of_old != old_path &&1878 end_of_new != new_path)1879;/* Do nothing; all in the while loop */1880/*1881 * We've found the first non-matching character in the directory1882 * paths. That means the current directory we were comparing1883 * represents the rename. Move end_of_old and end_of_new back1884 * to the full directory name.1885 */1886if(*end_of_old =='/')1887 end_of_old++;1888if(*end_of_old !='/')1889 end_of_new++;1890 end_of_old =strchr(end_of_old,'/');1891 end_of_new =strchr(end_of_new,'/');18921893/*1894 * It may have been the case that old_path and new_path were the same1895 * directory all along. Don't claim a rename if they're the same.1896 */1897 old_len = end_of_old - old_path;1898 new_len = end_of_new - new_path;18991900if(old_len != new_len ||strncmp(old_path, new_path, old_len)) {1901*old_dir =xstrndup(old_path, old_len);1902*new_dir =xstrndup(new_path, new_len);1903}1904}19051906static voidremove_hashmap_entries(struct hashmap *dir_renames,1907struct string_list *items_to_remove)1908{1909int i;1910struct dir_rename_entry *entry;19111912for(i =0; i < items_to_remove->nr; i++) {1913 entry = items_to_remove->items[i].util;1914hashmap_remove(dir_renames, entry, NULL);1915}1916string_list_clear(items_to_remove,0);1917}19181919/*1920 * See if there is a directory rename for path, and if there are any file1921 * level conflicts for the renamed location. If there is a rename and1922 * there are no conflicts, return the new name. Otherwise, return NULL.1923 */1924static char*handle_path_level_conflicts(struct merge_options *o,1925const char*path,1926struct dir_rename_entry *entry,1927struct hashmap *collisions,1928struct tree *tree)1929{1930char*new_path = NULL;1931struct collision_entry *collision_ent;1932int clean =1;1933struct strbuf collision_paths = STRBUF_INIT;19341935/*1936 * entry has the mapping of old directory name to new directory name1937 * that we want to apply to path.1938 */1939 new_path =apply_dir_rename(entry, path);19401941if(!new_path) {1942/* This should only happen when entry->non_unique_new_dir set */1943if(!entry->non_unique_new_dir)1944BUG("entry->non_unqiue_dir not set and !new_path");1945output(o,1,_("CONFLICT (directory rename split): "1946"Unclear where to place%sbecause directory "1947"%swas renamed to multiple other directories, "1948"with no destination getting a majority of the "1949"files."),1950 path, entry->dir);1951 clean =0;1952return NULL;1953}19541955/*1956 * The caller needs to have ensured that it has pre-populated1957 * collisions with all paths that map to new_path. Do a quick check1958 * to ensure that's the case.1959 */1960 collision_ent =collision_find_entry(collisions, new_path);1961if(collision_ent == NULL)1962BUG("collision_ent is NULL");19631964/*1965 * Check for one-sided add/add/.../add conflicts, i.e.1966 * where implicit renames from the other side doing1967 * directory rename(s) can affect this side of history1968 * to put multiple paths into the same location. Warn1969 * and bail on directory renames for such paths.1970 */1971if(collision_ent->reported_already) {1972 clean =0;1973}else if(tree_has_path(tree, new_path)) {1974 collision_ent->reported_already =1;1975strbuf_add_separated_string_list(&collision_paths,", ",1976&collision_ent->source_files);1977output(o,1,_("CONFLICT (implicit dir rename): Existing "1978"file/dir at%sin the way of implicit "1979"directory rename(s) putting the following "1980"path(s) there:%s."),1981 new_path, collision_paths.buf);1982 clean =0;1983}else if(collision_ent->source_files.nr >1) {1984 collision_ent->reported_already =1;1985strbuf_add_separated_string_list(&collision_paths,", ",1986&collision_ent->source_files);1987output(o,1,_("CONFLICT (implicit dir rename): Cannot map "1988"more than one path to%s; implicit directory "1989"renames tried to put these paths there:%s"),1990 new_path, collision_paths.buf);1991 clean =0;1992}19931994/* Free memory we no longer need */1995strbuf_release(&collision_paths);1996if(!clean && new_path) {1997free(new_path);1998return NULL;1999}20002001return new_path;2002}20032004/*2005 * There are a couple things we want to do at the directory level:2006 * 1. Check for both sides renaming to the same thing, in order to avoid2007 * implicit renaming of files that should be left in place. (See2008 * testcase 6b in t6043 for details.)2009 * 2. Prune directory renames if there are still files left in the2010 * the original directory. These represent a partial directory rename,2011 * i.e. a rename where only some of the files within the directory2012 * were renamed elsewhere. (Technically, this could be done earlier2013 * in get_directory_renames(), except that would prevent us from2014 * doing the previous check and thus failing testcase 6b.)2015 * 3. Check for rename/rename(1to2) conflicts (at the directory level).2016 * In the future, we could potentially record this info as well and2017 * omit reporting rename/rename(1to2) conflicts for each path within2018 * the affected directories, thus cleaning up the merge output.2019 * NOTE: We do NOT check for rename/rename(2to1) conflicts at the2020 * directory level, because merging directories is fine. If it2021 * causes conflicts for files within those merged directories, then2022 * that should be detected at the individual path level.2023 */2024static voidhandle_directory_level_conflicts(struct merge_options *o,2025struct hashmap *dir_re_head,2026struct tree *head,2027struct hashmap *dir_re_merge,2028struct tree *merge)2029{2030struct hashmap_iter iter;2031struct dir_rename_entry *head_ent;2032struct dir_rename_entry *merge_ent;20332034struct string_list remove_from_head = STRING_LIST_INIT_NODUP;2035struct string_list remove_from_merge = STRING_LIST_INIT_NODUP;20362037hashmap_iter_init(dir_re_head, &iter);2038while((head_ent =hashmap_iter_next(&iter))) {2039 merge_ent =dir_rename_find_entry(dir_re_merge, head_ent->dir);2040if(merge_ent &&2041!head_ent->non_unique_new_dir &&2042!merge_ent->non_unique_new_dir &&2043!strbuf_cmp(&head_ent->new_dir, &merge_ent->new_dir)) {2044/* 1. Renamed identically; remove it from both sides */2045string_list_append(&remove_from_head,2046 head_ent->dir)->util = head_ent;2047strbuf_release(&head_ent->new_dir);2048string_list_append(&remove_from_merge,2049 merge_ent->dir)->util = merge_ent;2050strbuf_release(&merge_ent->new_dir);2051}else if(tree_has_path(head, head_ent->dir)) {2052/* 2. This wasn't a directory rename after all */2053string_list_append(&remove_from_head,2054 head_ent->dir)->util = head_ent;2055strbuf_release(&head_ent->new_dir);2056}2057}20582059remove_hashmap_entries(dir_re_head, &remove_from_head);2060remove_hashmap_entries(dir_re_merge, &remove_from_merge);20612062hashmap_iter_init(dir_re_merge, &iter);2063while((merge_ent =hashmap_iter_next(&iter))) {2064 head_ent =dir_rename_find_entry(dir_re_head, merge_ent->dir);2065if(tree_has_path(merge, merge_ent->dir)) {2066/* 2. This wasn't a directory rename after all */2067string_list_append(&remove_from_merge,2068 merge_ent->dir)->util = merge_ent;2069}else if(head_ent &&2070!head_ent->non_unique_new_dir &&2071!merge_ent->non_unique_new_dir) {2072/* 3. rename/rename(1to2) */2073/*2074 * We can assume it's not rename/rename(1to1) because2075 * that was case (1), already checked above. So we2076 * know that head_ent->new_dir and merge_ent->new_dir2077 * are different strings.2078 */2079output(o,1,_("CONFLICT (rename/rename): "2080"Rename directory%s->%sin%s. "2081"Rename directory%s->%sin%s"),2082 head_ent->dir, head_ent->new_dir.buf, o->branch1,2083 head_ent->dir, merge_ent->new_dir.buf, o->branch2);2084string_list_append(&remove_from_head,2085 head_ent->dir)->util = head_ent;2086strbuf_release(&head_ent->new_dir);2087string_list_append(&remove_from_merge,2088 merge_ent->dir)->util = merge_ent;2089strbuf_release(&merge_ent->new_dir);2090}2091}20922093remove_hashmap_entries(dir_re_head, &remove_from_head);2094remove_hashmap_entries(dir_re_merge, &remove_from_merge);2095}20962097static struct hashmap *get_directory_renames(struct diff_queue_struct *pairs,2098struct tree *tree)2099{2100struct hashmap *dir_renames;2101struct hashmap_iter iter;2102struct dir_rename_entry *entry;2103int i;21042105/*2106 * Typically, we think of a directory rename as all files from a2107 * certain directory being moved to a target directory. However,2108 * what if someone first moved two files from the original2109 * directory in one commit, and then renamed the directory2110 * somewhere else in a later commit? At merge time, we just know2111 * that files from the original directory went to two different2112 * places, and that the bulk of them ended up in the same place.2113 * We want each directory rename to represent where the bulk of the2114 * files from that directory end up; this function exists to find2115 * where the bulk of the files went.2116 *2117 * The first loop below simply iterates through the list of file2118 * renames, finding out how often each directory rename pair2119 * possibility occurs.2120 */2121 dir_renames =xmalloc(sizeof(*dir_renames));2122dir_rename_init(dir_renames);2123for(i =0; i < pairs->nr; ++i) {2124struct string_list_item *item;2125int*count;2126struct diff_filepair *pair = pairs->queue[i];2127char*old_dir, *new_dir;21282129/* File not part of directory rename if it wasn't renamed */2130if(pair->status !='R')2131continue;21322133get_renamed_dir_portion(pair->one->path, pair->two->path,2134&old_dir, &new_dir);2135if(!old_dir)2136/* Directory didn't change at all; ignore this one. */2137continue;21382139 entry =dir_rename_find_entry(dir_renames, old_dir);2140if(!entry) {2141 entry =xmalloc(sizeof(*entry));2142dir_rename_entry_init(entry, old_dir);2143hashmap_put(dir_renames, entry);2144}else{2145free(old_dir);2146}2147 item =string_list_lookup(&entry->possible_new_dirs, new_dir);2148if(!item) {2149 item =string_list_insert(&entry->possible_new_dirs,2150 new_dir);2151 item->util =xcalloc(1,sizeof(int));2152}else{2153free(new_dir);2154}2155 count = item->util;2156*count +=1;2157}21582159/*2160 * For each directory with files moved out of it, we find out which2161 * target directory received the most files so we can declare it to2162 * be the "winning" target location for the directory rename. This2163 * winner gets recorded in new_dir. If there is no winner2164 * (multiple target directories received the same number of files),2165 * we set non_unique_new_dir. Once we've determined the winner (or2166 * that there is no winner), we no longer need possible_new_dirs.2167 */2168hashmap_iter_init(dir_renames, &iter);2169while((entry =hashmap_iter_next(&iter))) {2170int max =0;2171int bad_max =0;2172char*best = NULL;21732174for(i =0; i < entry->possible_new_dirs.nr; i++) {2175int*count = entry->possible_new_dirs.items[i].util;21762177if(*count == max)2178 bad_max = max;2179else if(*count > max) {2180 max = *count;2181 best = entry->possible_new_dirs.items[i].string;2182}2183}2184if(bad_max == max)2185 entry->non_unique_new_dir =1;2186else{2187assert(entry->new_dir.len ==0);2188strbuf_addstr(&entry->new_dir, best);2189}2190/*2191 * The relevant directory sub-portion of the original full2192 * filepaths were xstrndup'ed before inserting into2193 * possible_new_dirs, and instead of manually iterating the2194 * list and free'ing each, just lie and tell2195 * possible_new_dirs that it did the strdup'ing so that it2196 * will free them for us.2197 */2198 entry->possible_new_dirs.strdup_strings =1;2199string_list_clear(&entry->possible_new_dirs,1);2200}22012202return dir_renames;2203}22042205static struct dir_rename_entry *check_dir_renamed(const char*path,2206struct hashmap *dir_renames)2207{2208char temp[PATH_MAX];2209char*end;2210struct dir_rename_entry *entry;22112212strcpy(temp, path);2213while((end =strrchr(temp,'/'))) {2214*end ='\0';2215 entry =dir_rename_find_entry(dir_renames, temp);2216if(entry)2217return entry;2218}2219return NULL;2220}22212222static voidcompute_collisions(struct hashmap *collisions,2223struct hashmap *dir_renames,2224struct diff_queue_struct *pairs)2225{2226int i;22272228/*2229 * Multiple files can be mapped to the same path due to directory2230 * renames done by the other side of history. Since that other2231 * side of history could have merged multiple directories into one,2232 * if our side of history added the same file basename to each of2233 * those directories, then all N of them would get implicitly2234 * renamed by the directory rename detection into the same path,2235 * and we'd get an add/add/.../add conflict, and all those adds2236 * from *this* side of history. This is not representable in the2237 * index, and users aren't going to easily be able to make sense of2238 * it. So we need to provide a good warning about what's2239 * happening, and fall back to no-directory-rename detection2240 * behavior for those paths.2241 *2242 * See testcases 9e and all of section 5 from t6043 for examples.2243 */2244collision_init(collisions);22452246for(i =0; i < pairs->nr; ++i) {2247struct dir_rename_entry *dir_rename_ent;2248struct collision_entry *collision_ent;2249char*new_path;2250struct diff_filepair *pair = pairs->queue[i];22512252if(pair->status !='A'&& pair->status !='R')2253continue;2254 dir_rename_ent =check_dir_renamed(pair->two->path,2255 dir_renames);2256if(!dir_rename_ent)2257continue;22582259 new_path =apply_dir_rename(dir_rename_ent, pair->two->path);2260if(!new_path)2261/*2262 * dir_rename_ent->non_unique_new_path is true, which2263 * means there is no directory rename for us to use,2264 * which means it won't cause us any additional2265 * collisions.2266 */2267continue;2268 collision_ent =collision_find_entry(collisions, new_path);2269if(!collision_ent) {2270 collision_ent =xcalloc(1,2271sizeof(struct collision_entry));2272hashmap_entry_init(collision_ent,strhash(new_path));2273hashmap_put(collisions, collision_ent);2274 collision_ent->target_file = new_path;2275}else{2276free(new_path);2277}2278string_list_insert(&collision_ent->source_files,2279 pair->two->path);2280}2281}22822283static char*check_for_directory_rename(struct merge_options *o,2284const char*path,2285struct tree *tree,2286struct hashmap *dir_renames,2287struct hashmap *dir_rename_exclusions,2288struct hashmap *collisions,2289int*clean_merge)2290{2291char*new_path = NULL;2292struct dir_rename_entry *entry =check_dir_renamed(path, dir_renames);2293struct dir_rename_entry *oentry = NULL;22942295if(!entry)2296return new_path;22972298/*2299 * This next part is a little weird. We do not want to do an2300 * implicit rename into a directory we renamed on our side, because2301 * that will result in a spurious rename/rename(1to2) conflict. An2302 * example:2303 * Base commit: dumbdir/afile, otherdir/bfile2304 * Side 1: smrtdir/afile, otherdir/bfile2305 * Side 2: dumbdir/afile, dumbdir/bfile2306 * Here, while working on Side 1, we could notice that otherdir was2307 * renamed/merged to dumbdir, and change the diff_filepair for2308 * otherdir/bfile into a rename into dumbdir/bfile. However, Side2309 * 2 will notice the rename from dumbdir to smrtdir, and do the2310 * transitive rename to move it from dumbdir/bfile to2311 * smrtdir/bfile. That gives us bfile in dumbdir vs being in2312 * smrtdir, a rename/rename(1to2) conflict. We really just want2313 * the file to end up in smrtdir. And the way to achieve that is2314 * to not let Side1 do the rename to dumbdir, since we know that is2315 * the source of one of our directory renames.2316 *2317 * That's why oentry and dir_rename_exclusions is here.2318 *2319 * As it turns out, this also prevents N-way transient rename2320 * confusion; See testcases 9c and 9d of t6043.2321 */2322 oentry =dir_rename_find_entry(dir_rename_exclusions, entry->new_dir.buf);2323if(oentry) {2324output(o,1,_("WARNING: Avoiding applying%s->%srename "2325"to%s, because%sitself was renamed."),2326 entry->dir, entry->new_dir.buf, path, entry->new_dir.buf);2327}else{2328 new_path =handle_path_level_conflicts(o, path, entry,2329 collisions, tree);2330*clean_merge &= (new_path != NULL);2331}23322333return new_path;2334}23352336static voidapply_directory_rename_modifications(struct merge_options *o,2337struct diff_filepair *pair,2338char*new_path,2339struct rename *re,2340struct tree *tree,2341struct tree *o_tree,2342struct tree *a_tree,2343struct tree *b_tree,2344struct string_list *entries,2345int*clean)2346{2347struct string_list_item *item;2348int stage = (tree == a_tree ?2:3);2349int update_wd;23502351/*2352 * In all cases where we can do directory rename detection,2353 * unpack_trees() will have read pair->two->path into the2354 * index and the working copy. We need to remove it so that2355 * we can instead place it at new_path. It is guaranteed to2356 * not be untracked (unpack_trees() would have errored out2357 * saying the file would have been overwritten), but it might2358 * be dirty, though.2359 */2360 update_wd = !was_dirty(o, pair->two->path);2361if(!update_wd)2362output(o,1,_("Refusing to lose dirty file at%s"),2363 pair->two->path);2364remove_file(o,1, pair->two->path, !update_wd);23652366/* Find or create a new re->dst_entry */2367 item =string_list_lookup(entries, new_path);2368if(item) {2369/*2370 * Since we're renaming on this side of history, and it's2371 * due to a directory rename on the other side of history2372 * (which we only allow when the directory in question no2373 * longer exists on the other side of history), the2374 * original entry for re->dst_entry is no longer2375 * necessary...2376 */2377 re->dst_entry->processed =1;23782379/*2380 * ...because we'll be using this new one.2381 */2382 re->dst_entry = item->util;2383}else{2384/*2385 * re->dst_entry is for the before-dir-rename path, and we2386 * need it to hold information for the after-dir-rename2387 * path. Before creating a new entry, we need to mark the2388 * old one as unnecessary (...unless it is shared by2389 * src_entry, i.e. this didn't use to be a rename, in which2390 * case we can just allow the normal processing to happen2391 * for it).2392 */2393if(pair->status =='R')2394 re->dst_entry->processed =1;23952396 re->dst_entry =insert_stage_data(new_path,2397 o_tree, a_tree, b_tree,2398 entries);2399 item =string_list_insert(entries, new_path);2400 item->util = re->dst_entry;2401}24022403/*2404 * Update the stage_data with the information about the path we are2405 * moving into place. That slot will be empty and available for us2406 * to write to because of the collision checks in2407 * handle_path_level_conflicts(). In other words,2408 * re->dst_entry->stages[stage].oid will be the null_oid, so it's2409 * open for us to write to.2410 *2411 * It may be tempting to actually update the index at this point as2412 * well, using update_stages_for_stage_data(), but as per the big2413 * "NOTE" in update_stages(), doing so will modify the current2414 * in-memory index which will break calls to would_lose_untracked()2415 * that we need to make. Instead, we need to just make sure that2416 * the various conflict_rename_*() functions update the index2417 * explicitly rather than relying on unpack_trees() to have done it.2418 */2419get_tree_entry(&tree->object.oid,2420 pair->two->path,2421&re->dst_entry->stages[stage].oid,2422&re->dst_entry->stages[stage].mode);24232424/* Update pair status */2425if(pair->status =='A') {2426/*2427 * Recording rename information for this add makes it look2428 * like a rename/delete conflict. Make sure we can2429 * correctly handle this as an add that was moved to a new2430 * directory instead of reporting a rename/delete conflict.2431 */2432 re->add_turned_into_rename =1;2433}2434/*2435 * We don't actually look at pair->status again, but it seems2436 * pedagogically correct to adjust it.2437 */2438 pair->status ='R';24392440/*2441 * Finally, record the new location.2442 */2443 pair->two->path = new_path;2444}24452446/*2447 * Get information of all renames which occurred in 'pairs', making use of2448 * any implicit directory renames inferred from the other side of history.2449 * We need the three trees in the merge ('o_tree', 'a_tree' and 'b_tree')2450 * to be able to associate the correct cache entries with the rename2451 * information; tree is always equal to either a_tree or b_tree.2452 */2453static struct string_list *get_renames(struct merge_options *o,2454struct diff_queue_struct *pairs,2455struct hashmap *dir_renames,2456struct hashmap *dir_rename_exclusions,2457struct tree *tree,2458struct tree *o_tree,2459struct tree *a_tree,2460struct tree *b_tree,2461struct string_list *entries,2462int*clean_merge)2463{2464int i;2465struct hashmap collisions;2466struct hashmap_iter iter;2467struct collision_entry *e;2468struct string_list *renames;24692470compute_collisions(&collisions, dir_renames, pairs);2471 renames =xcalloc(1,sizeof(struct string_list));24722473for(i =0; i < pairs->nr; ++i) {2474struct string_list_item *item;2475struct rename *re;2476struct diff_filepair *pair = pairs->queue[i];2477char*new_path;/* non-NULL only with directory renames */24782479if(pair->status !='A'&& pair->status !='R') {2480diff_free_filepair(pair);2481continue;2482}2483 new_path =check_for_directory_rename(o, pair->two->path, tree,2484 dir_renames,2485 dir_rename_exclusions,2486&collisions,2487 clean_merge);2488if(pair->status !='R'&& !new_path) {2489diff_free_filepair(pair);2490continue;2491}24922493 re =xmalloc(sizeof(*re));2494 re->processed =0;2495 re->add_turned_into_rename =0;2496 re->pair = pair;2497 item =string_list_lookup(entries, re->pair->one->path);2498if(!item)2499 re->src_entry =insert_stage_data(re->pair->one->path,2500 o_tree, a_tree, b_tree, entries);2501else2502 re->src_entry = item->util;25032504 item =string_list_lookup(entries, re->pair->two->path);2505if(!item)2506 re->dst_entry =insert_stage_data(re->pair->two->path,2507 o_tree, a_tree, b_tree, entries);2508else2509 re->dst_entry = item->util;2510 item =string_list_insert(renames, pair->one->path);2511 item->util = re;2512if(new_path)2513apply_directory_rename_modifications(o, pair, new_path,2514 re, tree, o_tree,2515 a_tree, b_tree,2516 entries,2517 clean_merge);2518}25192520hashmap_iter_init(&collisions, &iter);2521while((e =hashmap_iter_next(&iter))) {2522free(e->target_file);2523string_list_clear(&e->source_files,0);2524}2525hashmap_free(&collisions,1);2526return renames;2527}25282529static intprocess_renames(struct merge_options *o,2530struct string_list *a_renames,2531struct string_list *b_renames)2532{2533int clean_merge =1, i, j;2534struct string_list a_by_dst = STRING_LIST_INIT_NODUP;2535struct string_list b_by_dst = STRING_LIST_INIT_NODUP;2536const struct rename *sre;25372538for(i =0; i < a_renames->nr; i++) {2539 sre = a_renames->items[i].util;2540string_list_insert(&a_by_dst, sre->pair->two->path)->util2541= (void*)sre;2542}2543for(i =0; i < b_renames->nr; i++) {2544 sre = b_renames->items[i].util;2545string_list_insert(&b_by_dst, sre->pair->two->path)->util2546= (void*)sre;2547}25482549for(i =0, j =0; i < a_renames->nr || j < b_renames->nr;) {2550struct string_list *renames1, *renames2Dst;2551struct rename *ren1 = NULL, *ren2 = NULL;2552const char*branch1, *branch2;2553const char*ren1_src, *ren1_dst;2554struct string_list_item *lookup;25552556if(i >= a_renames->nr) {2557 ren2 = b_renames->items[j++].util;2558}else if(j >= b_renames->nr) {2559 ren1 = a_renames->items[i++].util;2560}else{2561int compare =strcmp(a_renames->items[i].string,2562 b_renames->items[j].string);2563if(compare <=0)2564 ren1 = a_renames->items[i++].util;2565if(compare >=0)2566 ren2 = b_renames->items[j++].util;2567}25682569/* TODO: refactor, so that 1/2 are not needed */2570if(ren1) {2571 renames1 = a_renames;2572 renames2Dst = &b_by_dst;2573 branch1 = o->branch1;2574 branch2 = o->branch2;2575}else{2576 renames1 = b_renames;2577 renames2Dst = &a_by_dst;2578 branch1 = o->branch2;2579 branch2 = o->branch1;2580SWAP(ren2, ren1);2581}25822583if(ren1->processed)2584continue;2585 ren1->processed =1;2586 ren1->dst_entry->processed =1;2587/* BUG: We should only mark src_entry as processed if we2588 * are not dealing with a rename + add-source case.2589 */2590 ren1->src_entry->processed =1;25912592 ren1_src = ren1->pair->one->path;2593 ren1_dst = ren1->pair->two->path;25942595if(ren2) {2596/* One file renamed on both sides */2597const char*ren2_src = ren2->pair->one->path;2598const char*ren2_dst = ren2->pair->two->path;2599enum rename_type rename_type;2600if(strcmp(ren1_src, ren2_src) !=0)2601BUG("ren1_src != ren2_src");2602 ren2->dst_entry->processed =1;2603 ren2->processed =1;2604if(strcmp(ren1_dst, ren2_dst) !=0) {2605 rename_type = RENAME_ONE_FILE_TO_TWO;2606 clean_merge =0;2607}else{2608 rename_type = RENAME_ONE_FILE_TO_ONE;2609/* BUG: We should only remove ren1_src in2610 * the base stage (think of rename +2611 * add-source cases).2612 */2613remove_file(o,1, ren1_src,1);2614update_entry(ren1->dst_entry,2615 ren1->pair->one,2616 ren1->pair->two,2617 ren2->pair->two);2618}2619setup_rename_conflict_info(rename_type,2620 ren1->pair,2621 ren2->pair,2622 branch1,2623 branch2,2624 ren1->dst_entry,2625 ren2->dst_entry,2626 o,2627 NULL,2628 NULL);2629}else if((lookup =string_list_lookup(renames2Dst, ren1_dst))) {2630/* Two different files renamed to the same thing */2631char*ren2_dst;2632 ren2 = lookup->util;2633 ren2_dst = ren2->pair->two->path;2634if(strcmp(ren1_dst, ren2_dst) !=0)2635BUG("ren1_dst != ren2_dst");26362637 clean_merge =0;2638 ren2->processed =1;2639/*2640 * BUG: We should only mark src_entry as processed2641 * if we are not dealing with a rename + add-source2642 * case.2643 */2644 ren2->src_entry->processed =1;26452646setup_rename_conflict_info(RENAME_TWO_FILES_TO_ONE,2647 ren1->pair,2648 ren2->pair,2649 branch1,2650 branch2,2651 ren1->dst_entry,2652 ren2->dst_entry,2653 o,2654 ren1->src_entry,2655 ren2->src_entry);26562657}else{2658/* Renamed in 1, maybe changed in 2 */2659/* we only use sha1 and mode of these */2660struct diff_filespec src_other, dst_other;2661int try_merge;26622663/*2664 * unpack_trees loads entries from common-commit2665 * into stage 1, from head-commit into stage 2, and2666 * from merge-commit into stage 3. We keep track2667 * of which side corresponds to the rename.2668 */2669int renamed_stage = a_renames == renames1 ?2:3;2670int other_stage = a_renames == renames1 ?3:2;26712672/* BUG: We should only remove ren1_src in the base2673 * stage and in other_stage (think of rename +2674 * add-source case).2675 */2676remove_file(o,1, ren1_src,2677 renamed_stage ==2|| !was_tracked(o, ren1_src));26782679oidcpy(&src_other.oid,2680&ren1->src_entry->stages[other_stage].oid);2681 src_other.mode = ren1->src_entry->stages[other_stage].mode;2682oidcpy(&dst_other.oid,2683&ren1->dst_entry->stages[other_stage].oid);2684 dst_other.mode = ren1->dst_entry->stages[other_stage].mode;2685 try_merge =0;26862687if(oid_eq(&src_other.oid, &null_oid) &&2688 ren1->add_turned_into_rename) {2689setup_rename_conflict_info(RENAME_DIR,2690 ren1->pair,2691 NULL,2692 branch1,2693 branch2,2694 ren1->dst_entry,2695 NULL,2696 o,2697 NULL,2698 NULL);2699}else if(oid_eq(&src_other.oid, &null_oid)) {2700setup_rename_conflict_info(RENAME_DELETE,2701 ren1->pair,2702 NULL,2703 branch1,2704 branch2,2705 ren1->dst_entry,2706 NULL,2707 o,2708 NULL,2709 NULL);2710}else if((dst_other.mode == ren1->pair->two->mode) &&2711oid_eq(&dst_other.oid, &ren1->pair->two->oid)) {2712/*2713 * Added file on the other side identical to2714 * the file being renamed: clean merge.2715 * Also, there is no need to overwrite the2716 * file already in the working copy, so call2717 * update_file_flags() instead of2718 * update_file().2719 */2720if(update_file_flags(o,2721&ren1->pair->two->oid,2722 ren1->pair->two->mode,2723 ren1_dst,27241,/* update_cache */27250/* update_wd */))2726 clean_merge = -1;2727}else if(!oid_eq(&dst_other.oid, &null_oid)) {2728 clean_merge =0;2729 try_merge =1;2730output(o,1,_("CONFLICT (rename/add): Rename%s->%sin%s. "2731"%sadded in%s"),2732 ren1_src, ren1_dst, branch1,2733 ren1_dst, branch2);2734if(o->call_depth) {2735struct merge_file_info mfi;2736if(merge_file_one(o, ren1_dst, &null_oid,0,2737&ren1->pair->two->oid,2738 ren1->pair->two->mode,2739&dst_other.oid,2740 dst_other.mode,2741 branch1, branch2, &mfi)) {2742 clean_merge = -1;2743goto cleanup_and_return;2744}2745output(o,1,_("Adding merged%s"), ren1_dst);2746if(update_file(o,0, &mfi.oid,2747 mfi.mode, ren1_dst))2748 clean_merge = -1;2749 try_merge =0;2750}else{2751char*new_path =unique_path(o, ren1_dst, branch2);2752output(o,1,_("Adding as%sinstead"), new_path);2753if(update_file(o,0, &dst_other.oid,2754 dst_other.mode, new_path))2755 clean_merge = -1;2756free(new_path);2757}2758}else2759 try_merge =1;27602761if(clean_merge <0)2762goto cleanup_and_return;2763if(try_merge) {2764struct diff_filespec *one, *a, *b;2765 src_other.path = (char*)ren1_src;27662767 one = ren1->pair->one;2768if(a_renames == renames1) {2769 a = ren1->pair->two;2770 b = &src_other;2771}else{2772 b = ren1->pair->two;2773 a = &src_other;2774}2775update_entry(ren1->dst_entry, one, a, b);2776setup_rename_conflict_info(RENAME_NORMAL,2777 ren1->pair,2778 NULL,2779 branch1,2780 NULL,2781 ren1->dst_entry,2782 NULL,2783 o,2784 NULL,2785 NULL);2786}2787}2788}2789cleanup_and_return:2790string_list_clear(&a_by_dst,0);2791string_list_clear(&b_by_dst,0);27922793return clean_merge;2794}27952796struct rename_info {2797struct string_list *head_renames;2798struct string_list *merge_renames;2799};28002801static voidinitial_cleanup_rename(struct diff_queue_struct *pairs,2802struct hashmap *dir_renames)2803{2804struct hashmap_iter iter;2805struct dir_rename_entry *e;28062807hashmap_iter_init(dir_renames, &iter);2808while((e =hashmap_iter_next(&iter))) {2809free(e->dir);2810strbuf_release(&e->new_dir);2811/* possible_new_dirs already cleared in get_directory_renames */2812}2813hashmap_free(dir_renames,1);2814free(dir_renames);28152816free(pairs->queue);2817free(pairs);2818}28192820static inthandle_renames(struct merge_options *o,2821struct tree *common,2822struct tree *head,2823struct tree *merge,2824struct string_list *entries,2825struct rename_info *ri)2826{2827struct diff_queue_struct *head_pairs, *merge_pairs;2828struct hashmap *dir_re_head, *dir_re_merge;2829int clean =1;28302831 ri->head_renames = NULL;2832 ri->merge_renames = NULL;28332834if(!merge_detect_rename(o))2835return1;28362837 head_pairs =get_diffpairs(o, common, head);2838 merge_pairs =get_diffpairs(o, common, merge);28392840 dir_re_head =get_directory_renames(head_pairs, head);2841 dir_re_merge =get_directory_renames(merge_pairs, merge);28422843handle_directory_level_conflicts(o,2844 dir_re_head, head,2845 dir_re_merge, merge);28462847 ri->head_renames =get_renames(o, head_pairs,2848 dir_re_merge, dir_re_head, head,2849 common, head, merge, entries,2850&clean);2851if(clean <0)2852goto cleanup;2853 ri->merge_renames =get_renames(o, merge_pairs,2854 dir_re_head, dir_re_merge, merge,2855 common, head, merge, entries,2856&clean);2857if(clean <0)2858goto cleanup;2859 clean &=process_renames(o, ri->head_renames, ri->merge_renames);28602861cleanup:2862/*2863 * Some cleanup is deferred until cleanup_renames() because the2864 * data structures are still needed and referenced in2865 * process_entry(). But there are a few things we can free now.2866 */2867initial_cleanup_rename(head_pairs, dir_re_head);2868initial_cleanup_rename(merge_pairs, dir_re_merge);28692870return clean;2871}28722873static voidfinal_cleanup_rename(struct string_list *rename)2874{2875const struct rename *re;2876int i;28772878if(rename == NULL)2879return;28802881for(i =0; i < rename->nr; i++) {2882 re = rename->items[i].util;2883diff_free_filepair(re->pair);2884}2885string_list_clear(rename,1);2886free(rename);2887}28882889static voidfinal_cleanup_renames(struct rename_info *re_info)2890{2891final_cleanup_rename(re_info->head_renames);2892final_cleanup_rename(re_info->merge_renames);2893}28942895static struct object_id *stage_oid(const struct object_id *oid,unsigned mode)2896{2897return(is_null_oid(oid) || mode ==0) ? NULL: (struct object_id *)oid;2898}28992900static intread_oid_strbuf(struct merge_options *o,2901const struct object_id *oid,struct strbuf *dst)2902{2903void*buf;2904enum object_type type;2905unsigned long size;2906 buf =read_object_file(oid, &type, &size);2907if(!buf)2908returnerr(o,_("cannot read object%s"),oid_to_hex(oid));2909if(type != OBJ_BLOB) {2910free(buf);2911returnerr(o,_("object%sis not a blob"),oid_to_hex(oid));2912}2913strbuf_attach(dst, buf, size, size +1);2914return0;2915}29162917static intblob_unchanged(struct merge_options *opt,2918const struct object_id *o_oid,2919unsigned o_mode,2920const struct object_id *a_oid,2921unsigned a_mode,2922int renormalize,const char*path)2923{2924struct strbuf o = STRBUF_INIT;2925struct strbuf a = STRBUF_INIT;2926int ret =0;/* assume changed for safety */29272928if(a_mode != o_mode)2929return0;2930if(oid_eq(o_oid, a_oid))2931return1;2932if(!renormalize)2933return0;29342935assert(o_oid && a_oid);2936if(read_oid_strbuf(opt, o_oid, &o) ||read_oid_strbuf(opt, a_oid, &a))2937goto error_return;2938/*2939 * Note: binary | is used so that both renormalizations are2940 * performed. Comparison can be skipped if both files are2941 * unchanged since their sha1s have already been compared.2942 */2943if(renormalize_buffer(&the_index, path, o.buf, o.len, &o) |2944renormalize_buffer(&the_index, path, a.buf, a.len, &a))2945 ret = (o.len == a.len && !memcmp(o.buf, a.buf, o.len));29462947error_return:2948strbuf_release(&o);2949strbuf_release(&a);2950return ret;2951}29522953static inthandle_modify_delete(struct merge_options *o,2954const char*path,2955struct object_id *o_oid,int o_mode,2956struct object_id *a_oid,int a_mode,2957struct object_id *b_oid,int b_mode)2958{2959const char*modify_branch, *delete_branch;2960struct object_id *changed_oid;2961int changed_mode;29622963if(a_oid) {2964 modify_branch = o->branch1;2965 delete_branch = o->branch2;2966 changed_oid = a_oid;2967 changed_mode = a_mode;2968}else{2969 modify_branch = o->branch2;2970 delete_branch = o->branch1;2971 changed_oid = b_oid;2972 changed_mode = b_mode;2973}29742975returnhandle_change_delete(o,2976 path, NULL,2977 o_oid, o_mode,2978 changed_oid, changed_mode,2979 modify_branch, delete_branch,2980_("modify"),_("modified"));2981}29822983static intmerge_content(struct merge_options *o,2984const char*path,2985int is_dirty,2986struct object_id *o_oid,int o_mode,2987struct object_id *a_oid,int a_mode,2988struct object_id *b_oid,int b_mode,2989struct rename_conflict_info *rename_conflict_info)2990{2991const char*reason =_("content");2992const char*path1 = NULL, *path2 = NULL;2993struct merge_file_info mfi;2994struct diff_filespec one, a, b;2995unsigned df_conflict_remains =0;29962997if(!o_oid) {2998 reason =_("add/add");2999 o_oid = (struct object_id *)&null_oid;3000}3001 one.path = a.path = b.path = (char*)path;3002oidcpy(&one.oid, o_oid);3003 one.mode = o_mode;3004oidcpy(&a.oid, a_oid);3005 a.mode = a_mode;3006oidcpy(&b.oid, b_oid);3007 b.mode = b_mode;30083009if(rename_conflict_info) {3010struct diff_filepair *pair1 = rename_conflict_info->pair1;30113012 path1 = (o->branch1 == rename_conflict_info->branch1) ?3013 pair1->two->path : pair1->one->path;3014/* If rename_conflict_info->pair2 != NULL, we are in3015 * RENAME_ONE_FILE_TO_ONE case. Otherwise, we have a3016 * normal rename.3017 */3018 path2 = (rename_conflict_info->pair2 ||3019 o->branch2 == rename_conflict_info->branch1) ?3020 pair1->two->path : pair1->one->path;30213022if(dir_in_way(path, !o->call_depth,3023S_ISGITLINK(pair1->two->mode)))3024 df_conflict_remains =1;3025}3026if(merge_file_special_markers(o, &one, &a, &b, path,3027 o->branch1, path1,3028 o->branch2, path2, &mfi))3029return-1;30303031/*3032 * We can skip updating the working tree file iff:3033 * a) The merge is clean3034 * b) The merge matches what was in HEAD (content, mode, pathname)3035 * c) The target path is usable (i.e. not involved in D/F conflict)3036 */3037if(mfi.clean &&3038was_tracked_and_matches(o, path, &mfi.oid, mfi.mode) &&3039!df_conflict_remains) {3040output(o,3,_("Skipped%s(merged same as existing)"), path);3041if(add_cacheinfo(o, mfi.mode, &mfi.oid, path,30420, (!o->call_depth && !is_dirty),0))3043return-1;3044return mfi.clean;3045}30463047if(!mfi.clean) {3048if(S_ISGITLINK(mfi.mode))3049 reason =_("submodule");3050output(o,1,_("CONFLICT (%s): Merge conflict in%s"),3051 reason, path);3052if(rename_conflict_info && !df_conflict_remains)3053if(update_stages(o, path, &one, &a, &b))3054return-1;3055}30563057if(df_conflict_remains || is_dirty) {3058char*new_path;3059if(o->call_depth) {3060remove_file_from_cache(path);3061}else{3062if(!mfi.clean) {3063if(update_stages(o, path, &one, &a, &b))3064return-1;3065}else{3066int file_from_stage2 =was_tracked(o, path);3067struct diff_filespec merged;3068oidcpy(&merged.oid, &mfi.oid);3069 merged.mode = mfi.mode;30703071if(update_stages(o, path, NULL,3072 file_from_stage2 ? &merged : NULL,3073 file_from_stage2 ? NULL : &merged))3074return-1;3075}30763077}3078 new_path =unique_path(o, path, rename_conflict_info->branch1);3079if(is_dirty) {3080output(o,1,_("Refusing to lose dirty file at%s"),3081 path);3082}3083output(o,1,_("Adding as%sinstead"), new_path);3084if(update_file(o,0, &mfi.oid, mfi.mode, new_path)) {3085free(new_path);3086return-1;3087}3088free(new_path);3089 mfi.clean =0;3090}else if(update_file(o, mfi.clean, &mfi.oid, mfi.mode, path))3091return-1;3092return!is_dirty && mfi.clean;3093}30943095static intconflict_rename_normal(struct merge_options *o,3096const char*path,3097struct object_id *o_oid,unsigned int o_mode,3098struct object_id *a_oid,unsigned int a_mode,3099struct object_id *b_oid,unsigned int b_mode,3100struct rename_conflict_info *ci)3101{3102/* Merge the content and write it out */3103returnmerge_content(o, path,was_dirty(o, path),3104 o_oid, o_mode, a_oid, a_mode, b_oid, b_mode,3105 ci);3106}31073108/* Per entry merge function */3109static intprocess_entry(struct merge_options *o,3110const char*path,struct stage_data *entry)3111{3112int clean_merge =1;3113int normalize = o->renormalize;3114unsigned o_mode = entry->stages[1].mode;3115unsigned a_mode = entry->stages[2].mode;3116unsigned b_mode = entry->stages[3].mode;3117struct object_id *o_oid =stage_oid(&entry->stages[1].oid, o_mode);3118struct object_id *a_oid =stage_oid(&entry->stages[2].oid, a_mode);3119struct object_id *b_oid =stage_oid(&entry->stages[3].oid, b_mode);31203121 entry->processed =1;3122if(entry->rename_conflict_info) {3123struct rename_conflict_info *conflict_info = entry->rename_conflict_info;3124switch(conflict_info->rename_type) {3125case RENAME_NORMAL:3126case RENAME_ONE_FILE_TO_ONE:3127 clean_merge =conflict_rename_normal(o,3128 path,3129 o_oid, o_mode,3130 a_oid, a_mode,3131 b_oid, b_mode,3132 conflict_info);3133break;3134case RENAME_DIR:3135 clean_merge =1;3136if(conflict_rename_dir(o,3137 conflict_info->pair1,3138 conflict_info->branch1,3139 conflict_info->branch2))3140 clean_merge = -1;3141break;3142case RENAME_DELETE:3143 clean_merge =0;3144if(conflict_rename_delete(o,3145 conflict_info->pair1,3146 conflict_info->branch1,3147 conflict_info->branch2))3148 clean_merge = -1;3149break;3150case RENAME_ONE_FILE_TO_TWO:3151 clean_merge =0;3152if(conflict_rename_rename_1to2(o, conflict_info))3153 clean_merge = -1;3154break;3155case RENAME_TWO_FILES_TO_ONE:3156 clean_merge =0;3157if(conflict_rename_rename_2to1(o, conflict_info))3158 clean_merge = -1;3159break;3160default:3161 entry->processed =0;3162break;3163}3164}else if(o_oid && (!a_oid || !b_oid)) {3165/* Case A: Deleted in one */3166if((!a_oid && !b_oid) ||3167(!b_oid &&blob_unchanged(o, o_oid, o_mode, a_oid, a_mode, normalize, path)) ||3168(!a_oid &&blob_unchanged(o, o_oid, o_mode, b_oid, b_mode, normalize, path))) {3169/* Deleted in both or deleted in one and3170 * unchanged in the other */3171if(a_oid)3172output(o,2,_("Removing%s"), path);3173/* do not touch working file if it did not exist */3174remove_file(o,1, path, !a_oid);3175}else{3176/* Modify/delete; deleted side may have put a directory in the way */3177 clean_merge =0;3178if(handle_modify_delete(o, path, o_oid, o_mode,3179 a_oid, a_mode, b_oid, b_mode))3180 clean_merge = -1;3181}3182}else if((!o_oid && a_oid && !b_oid) ||3183(!o_oid && !a_oid && b_oid)) {3184/* Case B: Added in one. */3185/* [nothing|directory] -> ([nothing|directory], file) */31863187const char*add_branch;3188const char*other_branch;3189unsigned mode;3190const struct object_id *oid;3191const char*conf;31923193if(a_oid) {3194 add_branch = o->branch1;3195 other_branch = o->branch2;3196 mode = a_mode;3197 oid = a_oid;3198 conf =_("file/directory");3199}else{3200 add_branch = o->branch2;3201 other_branch = o->branch1;3202 mode = b_mode;3203 oid = b_oid;3204 conf =_("directory/file");3205}3206if(dir_in_way(path,3207!o->call_depth && !S_ISGITLINK(a_mode),32080)) {3209char*new_path =unique_path(o, path, add_branch);3210 clean_merge =0;3211output(o,1,_("CONFLICT (%s): There is a directory with name%sin%s. "3212"Adding%sas%s"),3213 conf, path, other_branch, path, new_path);3214if(update_file(o,0, oid, mode, new_path))3215 clean_merge = -1;3216else if(o->call_depth)3217remove_file_from_cache(path);3218free(new_path);3219}else{3220output(o,2,_("Adding%s"), path);3221/* do not overwrite file if already present */3222if(update_file_flags(o, oid, mode, path,1, !a_oid))3223 clean_merge = -1;3224}3225}else if(a_oid && b_oid) {3226/* Case C: Added in both (check for same permissions) and */3227/* case D: Modified in both, but differently. */3228int is_dirty =0;/* unpack_trees would have bailed if dirty */3229 clean_merge =merge_content(o, path, is_dirty,3230 o_oid, o_mode, a_oid, a_mode, b_oid, b_mode,3231 NULL);3232}else if(!o_oid && !a_oid && !b_oid) {3233/*3234 * this entry was deleted altogether. a_mode == 0 means3235 * we had that path and want to actively remove it.3236 */3237remove_file(o,1, path, !a_mode);3238}else3239BUG("fatal merge failure, shouldn't happen.");32403241return clean_merge;3242}32433244intmerge_trees(struct merge_options *o,3245struct tree *head,3246struct tree *merge,3247struct tree *common,3248struct tree **result)3249{3250int code, clean;32513252if(o->subtree_shift) {3253 merge =shift_tree_object(head, merge, o->subtree_shift);3254 common =shift_tree_object(head, common, o->subtree_shift);3255}32563257if(oid_eq(&common->object.oid, &merge->object.oid)) {3258struct strbuf sb = STRBUF_INIT;32593260if(!o->call_depth &&index_has_changes(&sb)) {3261err(o,_("Dirty index: cannot merge (dirty:%s)"),3262 sb.buf);3263return0;3264}3265output(o,0,_("Already up to date!"));3266*result = head;3267return1;3268}32693270 code =git_merge_trees(o, common, head, merge);32713272if(code !=0) {3273if(show(o,4) || o->call_depth)3274err(o,_("merging of trees%sand%sfailed"),3275oid_to_hex(&head->object.oid),3276oid_to_hex(&merge->object.oid));3277return-1;3278}32793280if(unmerged_cache()) {3281struct string_list *entries;3282struct rename_info re_info;3283int i;3284/*3285 * Only need the hashmap while processing entries, so3286 * initialize it here and free it when we are done running3287 * through the entries. Keeping it in the merge_options as3288 * opposed to decaring a local hashmap is for convenience3289 * so that we don't have to pass it to around.3290 */3291hashmap_init(&o->current_file_dir_set, path_hashmap_cmp, NULL,512);3292get_files_dirs(o, head);3293get_files_dirs(o, merge);32943295 entries =get_unmerged();3296 clean =handle_renames(o, common, head, merge, entries,3297&re_info);3298record_df_conflict_files(o, entries);3299if(clean <0)3300goto cleanup;3301for(i = entries->nr-1;0<= i; i--) {3302const char*path = entries->items[i].string;3303struct stage_data *e = entries->items[i].util;3304if(!e->processed) {3305int ret =process_entry(o, path, e);3306if(!ret)3307 clean =0;3308else if(ret <0) {3309 clean = ret;3310goto cleanup;3311}3312}3313}3314for(i =0; i < entries->nr; i++) {3315struct stage_data *e = entries->items[i].util;3316if(!e->processed)3317BUG("unprocessed path???%s",3318 entries->items[i].string);3319}33203321cleanup:3322final_cleanup_renames(&re_info);33233324string_list_clear(entries,1);3325free(entries);33263327hashmap_free(&o->current_file_dir_set,1);33283329if(clean <0)3330return clean;3331}3332else3333 clean =1;33343335/* Free the extra index left from git_merge_trees() */3336/*3337 * FIXME: Need to also free data allocated by3338 * setup_unpack_trees_porcelain() tucked away in o->unpack_opts.msgs,3339 * but the problem is that only half of it refers to dynamically3340 * allocated data, while the other half points at static strings.3341 */3342discard_index(&o->orig_index);33433344if(o->call_depth && !(*result =write_tree_from_memory(o)))3345return-1;33463347return clean;3348}33493350static struct commit_list *reverse_commit_list(struct commit_list *list)3351{3352struct commit_list *next = NULL, *current, *backup;3353for(current = list; current; current = backup) {3354 backup = current->next;3355 current->next = next;3356 next = current;3357}3358return next;3359}33603361/*3362 * Merge the commits h1 and h2, return the resulting virtual3363 * commit object and a flag indicating the cleanness of the merge.3364 */3365intmerge_recursive(struct merge_options *o,3366struct commit *h1,3367struct commit *h2,3368struct commit_list *ca,3369struct commit **result)3370{3371struct commit_list *iter;3372struct commit *merged_common_ancestors;3373struct tree *mrtree;3374int clean;33753376if(show(o,4)) {3377output(o,4,_("Merging:"));3378output_commit_title(o, h1);3379output_commit_title(o, h2);3380}33813382if(!ca) {3383 ca =get_merge_bases(h1, h2);3384 ca =reverse_commit_list(ca);3385}33863387if(show(o,5)) {3388unsigned cnt =commit_list_count(ca);33893390output(o,5,Q_("found%ucommon ancestor:",3391"found%ucommon ancestors:", cnt), cnt);3392for(iter = ca; iter; iter = iter->next)3393output_commit_title(o, iter->item);3394}33953396 merged_common_ancestors =pop_commit(&ca);3397if(merged_common_ancestors == NULL) {3398/* if there is no common ancestor, use an empty tree */3399struct tree *tree;34003401 tree =lookup_tree(the_hash_algo->empty_tree);3402 merged_common_ancestors =make_virtual_commit(tree,"ancestor");3403}34043405for(iter = ca; iter; iter = iter->next) {3406const char*saved_b1, *saved_b2;3407 o->call_depth++;3408/*3409 * When the merge fails, the result contains files3410 * with conflict markers. The cleanness flag is3411 * ignored (unless indicating an error), it was never3412 * actually used, as result of merge_trees has always3413 * overwritten it: the committed "conflicts" were3414 * already resolved.3415 */3416discard_cache();3417 saved_b1 = o->branch1;3418 saved_b2 = o->branch2;3419 o->branch1 ="Temporary merge branch 1";3420 o->branch2 ="Temporary merge branch 2";3421if(merge_recursive(o, merged_common_ancestors, iter->item,3422 NULL, &merged_common_ancestors) <0)3423return-1;3424 o->branch1 = saved_b1;3425 o->branch2 = saved_b2;3426 o->call_depth--;34273428if(!merged_common_ancestors)3429returnerr(o,_("merge returned no commit"));3430}34313432discard_cache();3433if(!o->call_depth)3434read_cache();34353436 o->ancestor ="merged common ancestors";3437 clean =merge_trees(o,get_commit_tree(h1),get_commit_tree(h2),3438get_commit_tree(merged_common_ancestors),3439&mrtree);3440if(clean <0) {3441flush_output(o);3442return clean;3443}34443445if(o->call_depth) {3446*result =make_virtual_commit(mrtree,"merged tree");3447commit_list_insert(h1, &(*result)->parents);3448commit_list_insert(h2, &(*result)->parents->next);3449}3450flush_output(o);3451if(!o->call_depth && o->buffer_output <2)3452strbuf_release(&o->obuf);3453if(show(o,2))3454diff_warn_rename_limit("merge.renamelimit",3455 o->needed_rename_limit,0);3456return clean;3457}34583459static struct commit *get_ref(const struct object_id *oid,const char*name)3460{3461struct object *object;34623463 object =deref_tag(parse_object(oid), name,strlen(name));3464if(!object)3465return NULL;3466if(object->type == OBJ_TREE)3467returnmake_virtual_commit((struct tree*)object, name);3468if(object->type != OBJ_COMMIT)3469return NULL;3470if(parse_commit((struct commit *)object))3471return NULL;3472return(struct commit *)object;3473}34743475intmerge_recursive_generic(struct merge_options *o,3476const struct object_id *head,3477const struct object_id *merge,3478int num_base_list,3479const struct object_id **base_list,3480struct commit **result)3481{3482int clean;3483struct lock_file lock = LOCK_INIT;3484struct commit *head_commit =get_ref(head, o->branch1);3485struct commit *next_commit =get_ref(merge, o->branch2);3486struct commit_list *ca = NULL;34873488if(base_list) {3489int i;3490for(i =0; i < num_base_list; ++i) {3491struct commit *base;3492if(!(base =get_ref(base_list[i],oid_to_hex(base_list[i]))))3493returnerr(o,_("Could not parse object '%s'"),3494oid_to_hex(base_list[i]));3495commit_list_insert(base, &ca);3496}3497}34983499hold_locked_index(&lock, LOCK_DIE_ON_ERROR);3500 clean =merge_recursive(o, head_commit, next_commit, ca,3501 result);3502if(clean <0) {3503rollback_lock_file(&lock);3504return clean;3505}35063507if(write_locked_index(&the_index, &lock,3508 COMMIT_LOCK | SKIP_IF_UNCHANGED))3509returnerr(o,_("Unable to write index."));35103511return clean ?0:1;3512}35133514static voidmerge_recursive_config(struct merge_options *o)3515{3516char*value = NULL;3517git_config_get_int("merge.verbosity", &o->verbosity);3518git_config_get_int("diff.renamelimit", &o->diff_rename_limit);3519git_config_get_int("merge.renamelimit", &o->merge_rename_limit);3520if(!git_config_get_string("diff.renames", &value)) {3521 o->diff_detect_rename =git_config_rename("diff.renames", value);3522free(value);3523}3524if(!git_config_get_string("merge.renames", &value)) {3525 o->merge_detect_rename =git_config_rename("merge.renames", value);3526free(value);3527}3528git_config(git_xmerge_config, NULL);3529}35303531voidinit_merge_options(struct merge_options *o)3532{3533const char*merge_verbosity;3534memset(o,0,sizeof(struct merge_options));3535 o->verbosity =2;3536 o->buffer_output =1;3537 o->diff_rename_limit = -1;3538 o->merge_rename_limit = -1;3539 o->renormalize =0;3540 o->diff_detect_rename = -1;3541 o->merge_detect_rename = -1;3542merge_recursive_config(o);3543 merge_verbosity =getenv("GIT_MERGE_VERBOSITY");3544if(merge_verbosity)3545 o->verbosity =strtol(merge_verbosity, NULL,10);3546if(o->verbosity >=5)3547 o->buffer_output =0;3548strbuf_init(&o->obuf,0);3549string_list_init(&o->df_conflict_file_set,1);3550}35513552intparse_merge_opt(struct merge_options *o,const char*s)3553{3554const char*arg;35553556if(!s || !*s)3557return-1;3558if(!strcmp(s,"ours"))3559 o->recursive_variant = MERGE_RECURSIVE_OURS;3560else if(!strcmp(s,"theirs"))3561 o->recursive_variant = MERGE_RECURSIVE_THEIRS;3562else if(!strcmp(s,"subtree"))3563 o->subtree_shift ="";3564else if(skip_prefix(s,"subtree=", &arg))3565 o->subtree_shift = arg;3566else if(!strcmp(s,"patience"))3567 o->xdl_opts =DIFF_WITH_ALG(o, PATIENCE_DIFF);3568else if(!strcmp(s,"histogram"))3569 o->xdl_opts =DIFF_WITH_ALG(o, HISTOGRAM_DIFF);3570else if(skip_prefix(s,"diff-algorithm=", &arg)) {3571long value =parse_algorithm_value(arg);3572if(value <0)3573return-1;3574/* clear out previous settings */3575DIFF_XDL_CLR(o, NEED_MINIMAL);3576 o->xdl_opts &= ~XDF_DIFF_ALGORITHM_MASK;3577 o->xdl_opts |= value;3578}3579else if(!strcmp(s,"ignore-space-change"))3580DIFF_XDL_SET(o, IGNORE_WHITESPACE_CHANGE);3581else if(!strcmp(s,"ignore-all-space"))3582DIFF_XDL_SET(o, IGNORE_WHITESPACE);3583else if(!strcmp(s,"ignore-space-at-eol"))3584DIFF_XDL_SET(o, IGNORE_WHITESPACE_AT_EOL);3585else if(!strcmp(s,"ignore-cr-at-eol"))3586DIFF_XDL_SET(o, IGNORE_CR_AT_EOL);3587else if(!strcmp(s,"renormalize"))3588 o->renormalize =1;3589else if(!strcmp(s,"no-renormalize"))3590 o->renormalize =0;3591else if(!strcmp(s,"no-renames"))3592 o->merge_detect_rename =0;3593else if(!strcmp(s,"find-renames")) {3594 o->merge_detect_rename =1;3595 o->rename_score =0;3596}3597else if(skip_prefix(s,"find-renames=", &arg) ||3598skip_prefix(s,"rename-threshold=", &arg)) {3599if((o->rename_score =parse_rename_score(&arg)) == -1|| *arg !=0)3600return-1;3601 o->merge_detect_rename =1;3602}3603else3604return-1;3605return0;3606}