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 27struct path_hashmap_entry { 28struct hashmap_entry e; 29char path[FLEX_ARRAY]; 30}; 31 32static intpath_hashmap_cmp(const void*cmp_data, 33const void*entry, 34const void*entry_or_key, 35const void*keydata) 36{ 37const struct path_hashmap_entry *a = entry; 38const struct path_hashmap_entry *b = entry_or_key; 39const char*key = keydata; 40 41if(ignore_case) 42returnstrcasecmp(a->path, key ? key : b->path); 43else 44returnstrcmp(a->path, key ? key : b->path); 45} 46 47static unsigned intpath_hash(const char*path) 48{ 49return ignore_case ?strihash(path) :strhash(path); 50} 51 52static struct dir_rename_entry *dir_rename_find_entry(struct hashmap *hashmap, 53char*dir) 54{ 55struct dir_rename_entry key; 56 57if(dir == NULL) 58return NULL; 59hashmap_entry_init(&key,strhash(dir)); 60 key.dir = dir; 61returnhashmap_get(hashmap, &key, NULL); 62} 63 64static intdir_rename_cmp(const void*unused_cmp_data, 65const void*entry, 66const void*entry_or_key, 67const void*unused_keydata) 68{ 69const struct dir_rename_entry *e1 = entry; 70const struct dir_rename_entry *e2 = entry_or_key; 71 72returnstrcmp(e1->dir, e2->dir); 73} 74 75static voiddir_rename_init(struct hashmap *map) 76{ 77hashmap_init(map, dir_rename_cmp, NULL,0); 78} 79 80static voiddir_rename_entry_init(struct dir_rename_entry *entry, 81char*directory) 82{ 83hashmap_entry_init(entry,strhash(directory)); 84 entry->dir = directory; 85 entry->non_unique_new_dir =0; 86strbuf_init(&entry->new_dir,0); 87string_list_init(&entry->possible_new_dirs,0); 88} 89 90static struct collision_entry *collision_find_entry(struct hashmap *hashmap, 91char*target_file) 92{ 93struct collision_entry key; 94 95hashmap_entry_init(&key,strhash(target_file)); 96 key.target_file = target_file; 97returnhashmap_get(hashmap, &key, NULL); 98} 99 100static intcollision_cmp(void*unused_cmp_data, 101const struct collision_entry *e1, 102const struct collision_entry *e2, 103const void*unused_keydata) 104{ 105returnstrcmp(e1->target_file, e2->target_file); 106} 107 108static voidcollision_init(struct hashmap *map) 109{ 110hashmap_init(map, (hashmap_cmp_fn) collision_cmp, NULL,0); 111} 112 113static voidflush_output(struct merge_options *o) 114{ 115if(o->buffer_output <2&& o->obuf.len) { 116fputs(o->obuf.buf, stdout); 117strbuf_reset(&o->obuf); 118} 119} 120 121static interr(struct merge_options *o,const char*err, ...) 122{ 123va_list params; 124 125if(o->buffer_output <2) 126flush_output(o); 127else{ 128strbuf_complete(&o->obuf,'\n'); 129strbuf_addstr(&o->obuf,"error: "); 130} 131va_start(params, err); 132strbuf_vaddf(&o->obuf, err, params); 133va_end(params); 134if(o->buffer_output >1) 135strbuf_addch(&o->obuf,'\n'); 136else{ 137error("%s", o->obuf.buf); 138strbuf_reset(&o->obuf); 139} 140 141return-1; 142} 143 144static struct tree *shift_tree_object(struct tree *one,struct tree *two, 145const char*subtree_shift) 146{ 147struct object_id shifted; 148 149if(!*subtree_shift) { 150shift_tree(&one->object.oid, &two->object.oid, &shifted,0); 151}else{ 152shift_tree_by(&one->object.oid, &two->object.oid, &shifted, 153 subtree_shift); 154} 155if(!oidcmp(&two->object.oid, &shifted)) 156return two; 157returnlookup_tree(&shifted); 158} 159 160static struct commit *make_virtual_commit(struct tree *tree,const char*comment) 161{ 162struct commit *commit =alloc_commit_node(); 163 164set_merge_remote_desc(commit, comment, (struct object *)commit); 165 commit->tree = tree; 166 commit->object.parsed =1; 167return commit; 168} 169 170/* 171 * Since we use get_tree_entry(), which does not put the read object into 172 * the object pool, we cannot rely on a == b. 173 */ 174static intoid_eq(const struct object_id *a,const struct object_id *b) 175{ 176if(!a && !b) 177return2; 178return a && b &&oidcmp(a, b) ==0; 179} 180 181enum rename_type { 182 RENAME_NORMAL =0, 183 RENAME_DELETE, 184 RENAME_ONE_FILE_TO_ONE, 185 RENAME_ONE_FILE_TO_TWO, 186 RENAME_TWO_FILES_TO_ONE 187}; 188 189struct rename_conflict_info { 190enum rename_type rename_type; 191struct diff_filepair *pair1; 192struct diff_filepair *pair2; 193const char*branch1; 194const char*branch2; 195struct stage_data *dst_entry1; 196struct stage_data *dst_entry2; 197struct diff_filespec ren1_other; 198struct diff_filespec ren2_other; 199}; 200 201/* 202 * Since we want to write the index eventually, we cannot reuse the index 203 * for these (temporary) data. 204 */ 205struct stage_data { 206struct{ 207unsigned mode; 208struct object_id oid; 209} stages[4]; 210struct rename_conflict_info *rename_conflict_info; 211unsigned processed:1; 212}; 213 214staticinlinevoidsetup_rename_conflict_info(enum rename_type rename_type, 215struct diff_filepair *pair1, 216struct diff_filepair *pair2, 217const char*branch1, 218const char*branch2, 219struct stage_data *dst_entry1, 220struct stage_data *dst_entry2, 221struct merge_options *o, 222struct stage_data *src_entry1, 223struct stage_data *src_entry2) 224{ 225struct rename_conflict_info *ci =xcalloc(1,sizeof(struct rename_conflict_info)); 226 ci->rename_type = rename_type; 227 ci->pair1 = pair1; 228 ci->branch1 = branch1; 229 ci->branch2 = branch2; 230 231 ci->dst_entry1 = dst_entry1; 232 dst_entry1->rename_conflict_info = ci; 233 dst_entry1->processed =0; 234 235assert(!pair2 == !dst_entry2); 236if(dst_entry2) { 237 ci->dst_entry2 = dst_entry2; 238 ci->pair2 = pair2; 239 dst_entry2->rename_conflict_info = ci; 240} 241 242if(rename_type == RENAME_TWO_FILES_TO_ONE) { 243/* 244 * For each rename, there could have been 245 * modifications on the side of history where that 246 * file was not renamed. 247 */ 248int ostage1 = o->branch1 == branch1 ?3:2; 249int ostage2 = ostage1 ^1; 250 251 ci->ren1_other.path = pair1->one->path; 252oidcpy(&ci->ren1_other.oid, &src_entry1->stages[ostage1].oid); 253 ci->ren1_other.mode = src_entry1->stages[ostage1].mode; 254 255 ci->ren2_other.path = pair2->one->path; 256oidcpy(&ci->ren2_other.oid, &src_entry2->stages[ostage2].oid); 257 ci->ren2_other.mode = src_entry2->stages[ostage2].mode; 258} 259} 260 261static intshow(struct merge_options *o,int v) 262{ 263return(!o->call_depth && o->verbosity >= v) || o->verbosity >=5; 264} 265 266__attribute__((format(printf,3,4))) 267static voidoutput(struct merge_options *o,int v,const char*fmt, ...) 268{ 269va_list ap; 270 271if(!show(o, v)) 272return; 273 274strbuf_addchars(&o->obuf,' ', o->call_depth *2); 275 276va_start(ap, fmt); 277strbuf_vaddf(&o->obuf, fmt, ap); 278va_end(ap); 279 280strbuf_addch(&o->obuf,'\n'); 281if(!o->buffer_output) 282flush_output(o); 283} 284 285static voidoutput_commit_title(struct merge_options *o,struct commit *commit) 286{ 287strbuf_addchars(&o->obuf,' ', o->call_depth *2); 288if(commit->util) 289strbuf_addf(&o->obuf,"virtual%s\n", 290merge_remote_util(commit)->name); 291else{ 292strbuf_add_unique_abbrev(&o->obuf, commit->object.oid.hash, 293 DEFAULT_ABBREV); 294strbuf_addch(&o->obuf,' '); 295if(parse_commit(commit) !=0) 296strbuf_addstr(&o->obuf,_("(bad commit)\n")); 297else{ 298const char*title; 299const char*msg =get_commit_buffer(commit, NULL); 300int len =find_commit_subject(msg, &title); 301if(len) 302strbuf_addf(&o->obuf,"%.*s\n", len, title); 303unuse_commit_buffer(commit, msg); 304} 305} 306flush_output(o); 307} 308 309static intadd_cacheinfo(struct merge_options *o, 310unsigned int mode,const struct object_id *oid, 311const char*path,int stage,int refresh,int options) 312{ 313struct cache_entry *ce; 314int ret; 315 316 ce =make_cache_entry(mode, oid ? oid->hash : null_sha1, path, stage,0); 317if(!ce) 318returnerr(o,_("addinfo_cache failed for path '%s'"), path); 319 320 ret =add_cache_entry(ce, options); 321if(refresh) { 322struct cache_entry *nce; 323 324 nce =refresh_cache_entry(ce, CE_MATCH_REFRESH | CE_MATCH_IGNORE_MISSING); 325if(!nce) 326returnerr(o,_("addinfo_cache failed for path '%s'"), path); 327if(nce != ce) 328 ret =add_cache_entry(nce, options); 329} 330return ret; 331} 332 333static voidinit_tree_desc_from_tree(struct tree_desc *desc,struct tree *tree) 334{ 335parse_tree(tree); 336init_tree_desc(desc, tree->buffer, tree->size); 337} 338 339static intgit_merge_trees(int index_only, 340struct tree *common, 341struct tree *head, 342struct tree *merge) 343{ 344int rc; 345struct tree_desc t[3]; 346struct unpack_trees_options opts; 347 348memset(&opts,0,sizeof(opts)); 349if(index_only) 350 opts.index_only =1; 351else 352 opts.update =1; 353 opts.merge =1; 354 opts.head_idx =2; 355 opts.fn = threeway_merge; 356 opts.src_index = &the_index; 357 opts.dst_index = &the_index; 358setup_unpack_trees_porcelain(&opts,"merge"); 359 360init_tree_desc_from_tree(t+0, common); 361init_tree_desc_from_tree(t+1, head); 362init_tree_desc_from_tree(t+2, merge); 363 364 rc =unpack_trees(3, t, &opts); 365cache_tree_free(&active_cache_tree); 366return rc; 367} 368 369struct tree *write_tree_from_memory(struct merge_options *o) 370{ 371struct tree *result = NULL; 372 373if(unmerged_cache()) { 374int i; 375fprintf(stderr,"BUG: There are unmerged index entries:\n"); 376for(i =0; i < active_nr; i++) { 377const struct cache_entry *ce = active_cache[i]; 378if(ce_stage(ce)) 379fprintf(stderr,"BUG:%d%.*s\n",ce_stage(ce), 380(int)ce_namelen(ce), ce->name); 381} 382die("BUG: unmerged index entries in merge-recursive.c"); 383} 384 385if(!active_cache_tree) 386 active_cache_tree =cache_tree(); 387 388if(!cache_tree_fully_valid(active_cache_tree) && 389cache_tree_update(&the_index,0) <0) { 390err(o,_("error building trees")); 391return NULL; 392} 393 394 result =lookup_tree(&active_cache_tree->oid); 395 396return result; 397} 398 399static intsave_files_dirs(const unsigned char*sha1, 400struct strbuf *base,const char*path, 401unsigned int mode,int stage,void*context) 402{ 403struct path_hashmap_entry *entry; 404int baselen = base->len; 405struct merge_options *o = context; 406 407strbuf_addstr(base, path); 408 409FLEX_ALLOC_MEM(entry, path, base->buf, base->len); 410hashmap_entry_init(entry,path_hash(entry->path)); 411hashmap_add(&o->current_file_dir_set, entry); 412 413strbuf_setlen(base, baselen); 414return(S_ISDIR(mode) ? READ_TREE_RECURSIVE :0); 415} 416 417static voidget_files_dirs(struct merge_options *o,struct tree *tree) 418{ 419struct pathspec match_all; 420memset(&match_all,0,sizeof(match_all)); 421read_tree_recursive(tree,"",0,0, &match_all, save_files_dirs, o); 422} 423 424static intget_tree_entry_if_blob(const unsigned char*tree, 425const char*path, 426unsigned char*hashy, 427unsigned int*mode_o) 428{ 429int ret; 430 431 ret =get_tree_entry(tree, path, hashy, mode_o); 432if(S_ISDIR(*mode_o)) { 433hashcpy(hashy, null_sha1); 434*mode_o =0; 435} 436return ret; 437} 438 439/* 440 * Returns an index_entry instance which doesn't have to correspond to 441 * a real cache entry in Git's index. 442 */ 443static struct stage_data *insert_stage_data(const char*path, 444struct tree *o,struct tree *a,struct tree *b, 445struct string_list *entries) 446{ 447struct string_list_item *item; 448struct stage_data *e =xcalloc(1,sizeof(struct stage_data)); 449get_tree_entry_if_blob(o->object.oid.hash, path, 450 e->stages[1].oid.hash, &e->stages[1].mode); 451get_tree_entry_if_blob(a->object.oid.hash, path, 452 e->stages[2].oid.hash, &e->stages[2].mode); 453get_tree_entry_if_blob(b->object.oid.hash, path, 454 e->stages[3].oid.hash, &e->stages[3].mode); 455 item =string_list_insert(entries, path); 456 item->util = e; 457return e; 458} 459 460/* 461 * Create a dictionary mapping file names to stage_data objects. The 462 * dictionary contains one entry for every path with a non-zero stage entry. 463 */ 464static struct string_list *get_unmerged(void) 465{ 466struct string_list *unmerged =xcalloc(1,sizeof(struct string_list)); 467int i; 468 469 unmerged->strdup_strings =1; 470 471for(i =0; i < active_nr; i++) { 472struct string_list_item *item; 473struct stage_data *e; 474const struct cache_entry *ce = active_cache[i]; 475if(!ce_stage(ce)) 476continue; 477 478 item =string_list_lookup(unmerged, ce->name); 479if(!item) { 480 item =string_list_insert(unmerged, ce->name); 481 item->util =xcalloc(1,sizeof(struct stage_data)); 482} 483 e = item->util; 484 e->stages[ce_stage(ce)].mode = ce->ce_mode; 485oidcpy(&e->stages[ce_stage(ce)].oid, &ce->oid); 486} 487 488return unmerged; 489} 490 491static intstring_list_df_name_compare(const char*one,const char*two) 492{ 493int onelen =strlen(one); 494int twolen =strlen(two); 495/* 496 * Here we only care that entries for D/F conflicts are 497 * adjacent, in particular with the file of the D/F conflict 498 * appearing before files below the corresponding directory. 499 * The order of the rest of the list is irrelevant for us. 500 * 501 * To achieve this, we sort with df_name_compare and provide 502 * the mode S_IFDIR so that D/F conflicts will sort correctly. 503 * We use the mode S_IFDIR for everything else for simplicity, 504 * since in other cases any changes in their order due to 505 * sorting cause no problems for us. 506 */ 507int cmp =df_name_compare(one, onelen, S_IFDIR, 508 two, twolen, S_IFDIR); 509/* 510 * Now that 'foo' and 'foo/bar' compare equal, we have to make sure 511 * that 'foo' comes before 'foo/bar'. 512 */ 513if(cmp) 514return cmp; 515return onelen - twolen; 516} 517 518static voidrecord_df_conflict_files(struct merge_options *o, 519struct string_list *entries) 520{ 521/* If there is a D/F conflict and the file for such a conflict 522 * currently exist in the working tree, we want to allow it to be 523 * removed to make room for the corresponding directory if needed. 524 * The files underneath the directories of such D/F conflicts will 525 * be processed before the corresponding file involved in the D/F 526 * conflict. If the D/F directory ends up being removed by the 527 * merge, then we won't have to touch the D/F file. If the D/F 528 * directory needs to be written to the working copy, then the D/F 529 * file will simply be removed (in make_room_for_path()) to make 530 * room for the necessary paths. Note that if both the directory 531 * and the file need to be present, then the D/F file will be 532 * reinstated with a new unique name at the time it is processed. 533 */ 534struct string_list df_sorted_entries = STRING_LIST_INIT_NODUP; 535const char*last_file = NULL; 536int last_len =0; 537int i; 538 539/* 540 * If we're merging merge-bases, we don't want to bother with 541 * any working directory changes. 542 */ 543if(o->call_depth) 544return; 545 546/* Ensure D/F conflicts are adjacent in the entries list. */ 547for(i =0; i < entries->nr; i++) { 548struct string_list_item *next = &entries->items[i]; 549string_list_append(&df_sorted_entries, next->string)->util = 550 next->util; 551} 552 df_sorted_entries.cmp = string_list_df_name_compare; 553string_list_sort(&df_sorted_entries); 554 555string_list_clear(&o->df_conflict_file_set,1); 556for(i =0; i < df_sorted_entries.nr; i++) { 557const char*path = df_sorted_entries.items[i].string; 558int len =strlen(path); 559struct stage_data *e = df_sorted_entries.items[i].util; 560 561/* 562 * Check if last_file & path correspond to a D/F conflict; 563 * i.e. whether path is last_file+'/'+<something>. 564 * If so, record that it's okay to remove last_file to make 565 * room for path and friends if needed. 566 */ 567if(last_file && 568 len > last_len && 569memcmp(path, last_file, last_len) ==0&& 570 path[last_len] =='/') { 571string_list_insert(&o->df_conflict_file_set, last_file); 572} 573 574/* 575 * Determine whether path could exist as a file in the 576 * working directory as a possible D/F conflict. This 577 * will only occur when it exists in stage 2 as a 578 * file. 579 */ 580if(S_ISREG(e->stages[2].mode) ||S_ISLNK(e->stages[2].mode)) { 581 last_file = path; 582 last_len = len; 583}else{ 584 last_file = NULL; 585} 586} 587string_list_clear(&df_sorted_entries,0); 588} 589 590struct rename { 591struct diff_filepair *pair; 592/* 593 * Purpose of src_entry and dst_entry: 594 * 595 * If 'before' is renamed to 'after' then src_entry will contain 596 * the versions of 'before' from the merge_base, HEAD, and MERGE in 597 * stages 1, 2, and 3; dst_entry will contain the respective 598 * versions of 'after' in corresponding locations. Thus, we have a 599 * total of six modes and oids, though some will be null. (Stage 0 600 * is ignored; we're interested in handling conflicts.) 601 * 602 * Since we don't turn on break-rewrites by default, neither 603 * src_entry nor dst_entry can have all three of their stages have 604 * non-null oids, meaning at most four of the six will be non-null. 605 * Also, since this is a rename, both src_entry and dst_entry will 606 * have at least one non-null oid, meaning at least two will be 607 * non-null. Of the six oids, a typical rename will have three be 608 * non-null. Only two implies a rename/delete, and four implies a 609 * rename/add. 610 */ 611struct stage_data *src_entry; 612struct stage_data *dst_entry; 613unsigned processed:1; 614}; 615 616static intupdate_stages(struct merge_options *opt,const char*path, 617const struct diff_filespec *o, 618const struct diff_filespec *a, 619const struct diff_filespec *b) 620{ 621 622/* 623 * NOTE: It is usually a bad idea to call update_stages on a path 624 * before calling update_file on that same path, since it can 625 * sometimes lead to spurious "refusing to lose untracked file..." 626 * messages from update_file (via make_room_for path via 627 * would_lose_untracked). Instead, reverse the order of the calls 628 * (executing update_file first and then update_stages). 629 */ 630int clear =1; 631int options = ADD_CACHE_OK_TO_ADD | ADD_CACHE_SKIP_DFCHECK; 632if(clear) 633if(remove_file_from_cache(path)) 634return-1; 635if(o) 636if(add_cacheinfo(opt, o->mode, &o->oid, path,1,0, options)) 637return-1; 638if(a) 639if(add_cacheinfo(opt, a->mode, &a->oid, path,2,0, options)) 640return-1; 641if(b) 642if(add_cacheinfo(opt, b->mode, &b->oid, path,3,0, options)) 643return-1; 644return0; 645} 646 647static voidupdate_entry(struct stage_data *entry, 648struct diff_filespec *o, 649struct diff_filespec *a, 650struct diff_filespec *b) 651{ 652 entry->processed =0; 653 entry->stages[1].mode = o->mode; 654 entry->stages[2].mode = a->mode; 655 entry->stages[3].mode = b->mode; 656oidcpy(&entry->stages[1].oid, &o->oid); 657oidcpy(&entry->stages[2].oid, &a->oid); 658oidcpy(&entry->stages[3].oid, &b->oid); 659} 660 661static intremove_file(struct merge_options *o,int clean, 662const char*path,int no_wd) 663{ 664int update_cache = o->call_depth || clean; 665int update_working_directory = !o->call_depth && !no_wd; 666 667if(update_cache) { 668if(remove_file_from_cache(path)) 669return-1; 670} 671if(update_working_directory) { 672if(ignore_case) { 673struct cache_entry *ce; 674 ce =cache_file_exists(path,strlen(path), ignore_case); 675if(ce &&ce_stage(ce) ==0&&strcmp(path, ce->name)) 676return0; 677} 678if(remove_path(path)) 679return-1; 680} 681return0; 682} 683 684/* add a string to a strbuf, but converting "/" to "_" */ 685static voidadd_flattened_path(struct strbuf *out,const char*s) 686{ 687size_t i = out->len; 688strbuf_addstr(out, s); 689for(; i < out->len; i++) 690if(out->buf[i] =='/') 691 out->buf[i] ='_'; 692} 693 694static char*unique_path(struct merge_options *o,const char*path,const char*branch) 695{ 696struct path_hashmap_entry *entry; 697struct strbuf newpath = STRBUF_INIT; 698int suffix =0; 699size_t base_len; 700 701strbuf_addf(&newpath,"%s~", path); 702add_flattened_path(&newpath, branch); 703 704 base_len = newpath.len; 705while(hashmap_get_from_hash(&o->current_file_dir_set, 706path_hash(newpath.buf), newpath.buf) || 707(!o->call_depth &&file_exists(newpath.buf))) { 708strbuf_setlen(&newpath, base_len); 709strbuf_addf(&newpath,"_%d", suffix++); 710} 711 712FLEX_ALLOC_MEM(entry, path, newpath.buf, newpath.len); 713hashmap_entry_init(entry,path_hash(entry->path)); 714hashmap_add(&o->current_file_dir_set, entry); 715returnstrbuf_detach(&newpath, NULL); 716} 717 718/** 719 * Check whether a directory in the index is in the way of an incoming 720 * file. Return 1 if so. If check_working_copy is non-zero, also 721 * check the working directory. If empty_ok is non-zero, also return 722 * 0 in the case where the working-tree dir exists but is empty. 723 */ 724static intdir_in_way(const char*path,int check_working_copy,int empty_ok) 725{ 726int pos; 727struct strbuf dirpath = STRBUF_INIT; 728struct stat st; 729 730strbuf_addstr(&dirpath, path); 731strbuf_addch(&dirpath,'/'); 732 733 pos =cache_name_pos(dirpath.buf, dirpath.len); 734 735if(pos <0) 736 pos = -1- pos; 737if(pos < active_nr && 738!strncmp(dirpath.buf, active_cache[pos]->name, dirpath.len)) { 739strbuf_release(&dirpath); 740return1; 741} 742 743strbuf_release(&dirpath); 744return check_working_copy && !lstat(path, &st) &&S_ISDIR(st.st_mode) && 745!(empty_ok &&is_empty_dir(path)); 746} 747 748static intwas_tracked(const char*path) 749{ 750int pos =cache_name_pos(path,strlen(path)); 751 752if(0<= pos) 753/* we have been tracking this path */ 754return1; 755 756/* 757 * Look for an unmerged entry for the path, 758 * specifically stage #2, which would indicate 759 * that "our" side before the merge started 760 * had the path tracked (and resulted in a conflict). 761 */ 762for(pos = -1- pos; 763 pos < active_nr && !strcmp(path, active_cache[pos]->name); 764 pos++) 765if(ce_stage(active_cache[pos]) ==2) 766return1; 767return0; 768} 769 770static intwould_lose_untracked(const char*path) 771{ 772return!was_tracked(path) &&file_exists(path); 773} 774 775static intmake_room_for_path(struct merge_options *o,const char*path) 776{ 777int status, i; 778const char*msg =_("failed to create path '%s'%s"); 779 780/* Unlink any D/F conflict files that are in the way */ 781for(i =0; i < o->df_conflict_file_set.nr; i++) { 782const char*df_path = o->df_conflict_file_set.items[i].string; 783size_t pathlen =strlen(path); 784size_t df_pathlen =strlen(df_path); 785if(df_pathlen < pathlen && 786 path[df_pathlen] =='/'&& 787strncmp(path, df_path, df_pathlen) ==0) { 788output(o,3, 789_("Removing%sto make room for subdirectory\n"), 790 df_path); 791unlink(df_path); 792unsorted_string_list_delete_item(&o->df_conflict_file_set, 793 i,0); 794break; 795} 796} 797 798/* Make sure leading directories are created */ 799 status =safe_create_leading_directories_const(path); 800if(status) { 801if(status == SCLD_EXISTS) 802/* something else exists */ 803returnerr(o, msg, path,_(": perhaps a D/F conflict?")); 804returnerr(o, msg, path,""); 805} 806 807/* 808 * Do not unlink a file in the work tree if we are not 809 * tracking it. 810 */ 811if(would_lose_untracked(path)) 812returnerr(o,_("refusing to lose untracked file at '%s'"), 813 path); 814 815/* Successful unlink is good.. */ 816if(!unlink(path)) 817return0; 818/* .. and so is no existing file */ 819if(errno == ENOENT) 820return0; 821/* .. but not some other error (who really cares what?) */ 822returnerr(o, msg, path,_(": perhaps a D/F conflict?")); 823} 824 825static intupdate_file_flags(struct merge_options *o, 826const struct object_id *oid, 827unsigned mode, 828const char*path, 829int update_cache, 830int update_wd) 831{ 832int ret =0; 833 834if(o->call_depth) 835 update_wd =0; 836 837if(update_wd) { 838enum object_type type; 839void*buf; 840unsigned long size; 841 842if(S_ISGITLINK(mode)) { 843/* 844 * We may later decide to recursively descend into 845 * the submodule directory and update its index 846 * and/or work tree, but we do not do that now. 847 */ 848 update_wd =0; 849goto update_index; 850} 851 852 buf =read_sha1_file(oid->hash, &type, &size); 853if(!buf) 854returnerr(o,_("cannot read object%s'%s'"),oid_to_hex(oid), path); 855if(type != OBJ_BLOB) { 856 ret =err(o,_("blob expected for%s'%s'"),oid_to_hex(oid), path); 857goto free_buf; 858} 859if(S_ISREG(mode)) { 860struct strbuf strbuf = STRBUF_INIT; 861if(convert_to_working_tree(path, buf, size, &strbuf)) { 862free(buf); 863 size = strbuf.len; 864 buf =strbuf_detach(&strbuf, NULL); 865} 866} 867 868if(make_room_for_path(o, path) <0) { 869 update_wd =0; 870goto free_buf; 871} 872if(S_ISREG(mode) || (!has_symlinks &&S_ISLNK(mode))) { 873int fd; 874if(mode &0100) 875 mode =0777; 876else 877 mode =0666; 878 fd =open(path, O_WRONLY | O_TRUNC | O_CREAT, mode); 879if(fd <0) { 880 ret =err(o,_("failed to open '%s':%s"), 881 path,strerror(errno)); 882goto free_buf; 883} 884write_in_full(fd, buf, size); 885close(fd); 886}else if(S_ISLNK(mode)) { 887char*lnk =xmemdupz(buf, size); 888safe_create_leading_directories_const(path); 889unlink(path); 890if(symlink(lnk, path)) 891 ret =err(o,_("failed to symlink '%s':%s"), 892 path,strerror(errno)); 893free(lnk); 894}else 895 ret =err(o, 896_("do not know what to do with%06o%s'%s'"), 897 mode,oid_to_hex(oid), path); 898 free_buf: 899free(buf); 900} 901 update_index: 902if(!ret && update_cache) 903add_cacheinfo(o, mode, oid, path,0, update_wd, ADD_CACHE_OK_TO_ADD); 904return ret; 905} 906 907static intupdate_file(struct merge_options *o, 908int clean, 909const struct object_id *oid, 910unsigned mode, 911const char*path) 912{ 913returnupdate_file_flags(o, oid, mode, path, o->call_depth || clean, !o->call_depth); 914} 915 916/* Low level file merging, update and removal */ 917 918struct merge_file_info { 919struct object_id oid; 920unsigned mode; 921unsigned clean:1, 922 merge:1; 923}; 924 925static intmerge_3way(struct merge_options *o, 926 mmbuffer_t *result_buf, 927const struct diff_filespec *one, 928const struct diff_filespec *a, 929const struct diff_filespec *b, 930const char*branch1, 931const char*branch2) 932{ 933 mmfile_t orig, src1, src2; 934struct ll_merge_options ll_opts = {0}; 935char*base_name, *name1, *name2; 936int merge_status; 937 938 ll_opts.renormalize = o->renormalize; 939 ll_opts.xdl_opts = o->xdl_opts; 940 941if(o->call_depth) { 942 ll_opts.virtual_ancestor =1; 943 ll_opts.variant =0; 944}else{ 945switch(o->recursive_variant) { 946case MERGE_RECURSIVE_OURS: 947 ll_opts.variant = XDL_MERGE_FAVOR_OURS; 948break; 949case MERGE_RECURSIVE_THEIRS: 950 ll_opts.variant = XDL_MERGE_FAVOR_THEIRS; 951break; 952default: 953 ll_opts.variant =0; 954break; 955} 956} 957 958if(strcmp(a->path, b->path) || 959(o->ancestor != NULL &&strcmp(a->path, one->path) !=0)) { 960 base_name = o->ancestor == NULL ? NULL : 961mkpathdup("%s:%s", o->ancestor, one->path); 962 name1 =mkpathdup("%s:%s", branch1, a->path); 963 name2 =mkpathdup("%s:%s", branch2, b->path); 964}else{ 965 base_name = o->ancestor == NULL ? NULL : 966mkpathdup("%s", o->ancestor); 967 name1 =mkpathdup("%s", branch1); 968 name2 =mkpathdup("%s", branch2); 969} 970 971read_mmblob(&orig, &one->oid); 972read_mmblob(&src1, &a->oid); 973read_mmblob(&src2, &b->oid); 974 975 merge_status =ll_merge(result_buf, a->path, &orig, base_name, 976&src1, name1, &src2, name2, &ll_opts); 977 978free(base_name); 979free(name1); 980free(name2); 981free(orig.ptr); 982free(src1.ptr); 983free(src2.ptr); 984return merge_status; 985} 986 987static intmerge_file_1(struct merge_options *o, 988const struct diff_filespec *one, 989const struct diff_filespec *a, 990const struct diff_filespec *b, 991const char*branch1, 992const char*branch2, 993struct merge_file_info *result) 994{ 995 result->merge =0; 996 result->clean =1; 997 998if((S_IFMT & a->mode) != (S_IFMT & b->mode)) { 999 result->clean =0;1000if(S_ISREG(a->mode)) {1001 result->mode = a->mode;1002oidcpy(&result->oid, &a->oid);1003}else{1004 result->mode = b->mode;1005oidcpy(&result->oid, &b->oid);1006}1007}else{1008if(!oid_eq(&a->oid, &one->oid) && !oid_eq(&b->oid, &one->oid))1009 result->merge =1;10101011/*1012 * Merge modes1013 */1014if(a->mode == b->mode || a->mode == one->mode)1015 result->mode = b->mode;1016else{1017 result->mode = a->mode;1018if(b->mode != one->mode) {1019 result->clean =0;1020 result->merge =1;1021}1022}10231024if(oid_eq(&a->oid, &b->oid) ||oid_eq(&a->oid, &one->oid))1025oidcpy(&result->oid, &b->oid);1026else if(oid_eq(&b->oid, &one->oid))1027oidcpy(&result->oid, &a->oid);1028else if(S_ISREG(a->mode)) {1029 mmbuffer_t result_buf;1030int ret =0, merge_status;10311032 merge_status =merge_3way(o, &result_buf, one, a, b,1033 branch1, branch2);10341035if((merge_status <0) || !result_buf.ptr)1036 ret =err(o,_("Failed to execute internal merge"));10371038if(!ret &&write_sha1_file(result_buf.ptr, result_buf.size,1039 blob_type, result->oid.hash))1040 ret =err(o,_("Unable to add%sto database"),1041 a->path);10421043free(result_buf.ptr);1044if(ret)1045return ret;1046 result->clean = (merge_status ==0);1047}else if(S_ISGITLINK(a->mode)) {1048 result->clean =merge_submodule(&result->oid,1049 one->path,1050&one->oid,1051&a->oid,1052&b->oid,1053!o->call_depth);1054}else if(S_ISLNK(a->mode)) {1055oidcpy(&result->oid, &a->oid);10561057if(!oid_eq(&a->oid, &b->oid))1058 result->clean =0;1059}else1060die("BUG: unsupported object type in the tree");1061}10621063return0;1064}10651066static intmerge_file_special_markers(struct merge_options *o,1067const struct diff_filespec *one,1068const struct diff_filespec *a,1069const struct diff_filespec *b,1070const char*branch1,1071const char*filename1,1072const char*branch2,1073const char*filename2,1074struct merge_file_info *mfi)1075{1076char*side1 = NULL;1077char*side2 = NULL;1078int ret;10791080if(filename1)1081 side1 =xstrfmt("%s:%s", branch1, filename1);1082if(filename2)1083 side2 =xstrfmt("%s:%s", branch2, filename2);10841085 ret =merge_file_1(o, one, a, b,1086 side1 ? side1 : branch1,1087 side2 ? side2 : branch2, mfi);1088free(side1);1089free(side2);1090return ret;1091}10921093static intmerge_file_one(struct merge_options *o,1094const char*path,1095const struct object_id *o_oid,int o_mode,1096const struct object_id *a_oid,int a_mode,1097const struct object_id *b_oid,int b_mode,1098const char*branch1,1099const char*branch2,1100struct merge_file_info *mfi)1101{1102struct diff_filespec one, a, b;11031104 one.path = a.path = b.path = (char*)path;1105oidcpy(&one.oid, o_oid);1106 one.mode = o_mode;1107oidcpy(&a.oid, a_oid);1108 a.mode = a_mode;1109oidcpy(&b.oid, b_oid);1110 b.mode = b_mode;1111returnmerge_file_1(o, &one, &a, &b, branch1, branch2, mfi);1112}11131114static inthandle_change_delete(struct merge_options *o,1115const char*path,const char*old_path,1116const struct object_id *o_oid,int o_mode,1117const struct object_id *changed_oid,1118int changed_mode,1119const char*change_branch,1120const char*delete_branch,1121const char*change,const char*change_past)1122{1123char*alt_path = NULL;1124const char*update_path = path;1125int ret =0;11261127if(dir_in_way(path, !o->call_depth,0)) {1128 update_path = alt_path =unique_path(o, path, change_branch);1129}11301131if(o->call_depth) {1132/*1133 * We cannot arbitrarily accept either a_sha or b_sha as1134 * correct; since there is no true "middle point" between1135 * them, simply reuse the base version for virtual merge base.1136 */1137 ret =remove_file_from_cache(path);1138if(!ret)1139 ret =update_file(o,0, o_oid, o_mode, update_path);1140}else{1141if(!alt_path) {1142if(!old_path) {1143output(o,1,_("CONFLICT (%s/delete):%sdeleted in%s"1144"and%sin%s. Version%sof%sleft in tree."),1145 change, path, delete_branch, change_past,1146 change_branch, change_branch, path);1147}else{1148output(o,1,_("CONFLICT (%s/delete):%sdeleted in%s"1149"and%sto%sin%s. Version%sof%sleft in tree."),1150 change, old_path, delete_branch, change_past, path,1151 change_branch, change_branch, path);1152}1153}else{1154if(!old_path) {1155output(o,1,_("CONFLICT (%s/delete):%sdeleted in%s"1156"and%sin%s. Version%sof%sleft in tree at%s."),1157 change, path, delete_branch, change_past,1158 change_branch, change_branch, path, alt_path);1159}else{1160output(o,1,_("CONFLICT (%s/delete):%sdeleted in%s"1161"and%sto%sin%s. Version%sof%sleft in tree at%s."),1162 change, old_path, delete_branch, change_past, path,1163 change_branch, change_branch, path, alt_path);1164}1165}1166/*1167 * No need to call update_file() on path when change_branch ==1168 * o->branch1 && !alt_path, since that would needlessly touch1169 * path. We could call update_file_flags() with update_cache=01170 * and update_wd=0, but that's a no-op.1171 */1172if(change_branch != o->branch1 || alt_path)1173 ret =update_file(o,0, changed_oid, changed_mode, update_path);1174}1175free(alt_path);11761177return ret;1178}11791180static intconflict_rename_delete(struct merge_options *o,1181struct diff_filepair *pair,1182const char*rename_branch,1183const char*delete_branch)1184{1185const struct diff_filespec *orig = pair->one;1186const struct diff_filespec *dest = pair->two;11871188if(handle_change_delete(o,1189 o->call_depth ? orig->path : dest->path,1190 o->call_depth ? NULL : orig->path,1191&orig->oid, orig->mode,1192&dest->oid, dest->mode,1193 rename_branch, delete_branch,1194_("rename"),_("renamed")))1195return-1;11961197if(o->call_depth)1198returnremove_file_from_cache(dest->path);1199else1200returnupdate_stages(o, dest->path, NULL,1201 rename_branch == o->branch1 ? dest : NULL,1202 rename_branch == o->branch1 ? NULL : dest);1203}12041205static struct diff_filespec *filespec_from_entry(struct diff_filespec *target,1206struct stage_data *entry,1207int stage)1208{1209struct object_id *oid = &entry->stages[stage].oid;1210unsigned mode = entry->stages[stage].mode;1211if(mode ==0||is_null_oid(oid))1212return NULL;1213oidcpy(&target->oid, oid);1214 target->mode = mode;1215return target;1216}12171218static inthandle_file(struct merge_options *o,1219struct diff_filespec *rename,1220int stage,1221struct rename_conflict_info *ci)1222{1223char*dst_name = rename->path;1224struct stage_data *dst_entry;1225const char*cur_branch, *other_branch;1226struct diff_filespec other;1227struct diff_filespec *add;1228int ret;12291230if(stage ==2) {1231 dst_entry = ci->dst_entry1;1232 cur_branch = ci->branch1;1233 other_branch = ci->branch2;1234}else{1235 dst_entry = ci->dst_entry2;1236 cur_branch = ci->branch2;1237 other_branch = ci->branch1;1238}12391240 add =filespec_from_entry(&other, dst_entry, stage ^1);1241if(add) {1242char*add_name =unique_path(o, rename->path, other_branch);1243if(update_file(o,0, &add->oid, add->mode, add_name))1244return-1;12451246remove_file(o,0, rename->path,0);1247 dst_name =unique_path(o, rename->path, cur_branch);1248}else{1249if(dir_in_way(rename->path, !o->call_depth,0)) {1250 dst_name =unique_path(o, rename->path, cur_branch);1251output(o,1,_("%sis a directory in%sadding as%sinstead"),1252 rename->path, other_branch, dst_name);1253}1254}1255if((ret =update_file(o,0, &rename->oid, rename->mode, dst_name)))1256;/* fall through, do allow dst_name to be released */1257else if(stage ==2)1258 ret =update_stages(o, rename->path, NULL, rename, add);1259else1260 ret =update_stages(o, rename->path, NULL, add, rename);12611262if(dst_name != rename->path)1263free(dst_name);12641265return ret;1266}12671268static intconflict_rename_rename_1to2(struct merge_options *o,1269struct rename_conflict_info *ci)1270{1271/* One file was renamed in both branches, but to different names. */1272struct diff_filespec *one = ci->pair1->one;1273struct diff_filespec *a = ci->pair1->two;1274struct diff_filespec *b = ci->pair2->two;12751276output(o,1,_("CONFLICT (rename/rename): "1277"Rename\"%s\"->\"%s\"in branch\"%s\""1278"rename\"%s\"->\"%s\"in\"%s\"%s"),1279 one->path, a->path, ci->branch1,1280 one->path, b->path, ci->branch2,1281 o->call_depth ?_(" (left unresolved)") :"");1282if(o->call_depth) {1283struct merge_file_info mfi;1284struct diff_filespec other;1285struct diff_filespec *add;1286if(merge_file_one(o, one->path,1287&one->oid, one->mode,1288&a->oid, a->mode,1289&b->oid, b->mode,1290 ci->branch1, ci->branch2, &mfi))1291return-1;12921293/*1294 * FIXME: For rename/add-source conflicts (if we could detect1295 * such), this is wrong. We should instead find a unique1296 * pathname and then either rename the add-source file to that1297 * unique path, or use that unique path instead of src here.1298 */1299if(update_file(o,0, &mfi.oid, mfi.mode, one->path))1300return-1;13011302/*1303 * Above, we put the merged content at the merge-base's1304 * path. Now we usually need to delete both a->path and1305 * b->path. However, the rename on each side of the merge1306 * could also be involved in a rename/add conflict. In1307 * such cases, we should keep the added file around,1308 * resolving the conflict at that path in its favor.1309 */1310 add =filespec_from_entry(&other, ci->dst_entry1,2^1);1311if(add) {1312if(update_file(o,0, &add->oid, add->mode, a->path))1313return-1;1314}1315else1316remove_file_from_cache(a->path);1317 add =filespec_from_entry(&other, ci->dst_entry2,3^1);1318if(add) {1319if(update_file(o,0, &add->oid, add->mode, b->path))1320return-1;1321}1322else1323remove_file_from_cache(b->path);1324}else if(handle_file(o, a,2, ci) ||handle_file(o, b,3, ci))1325return-1;13261327return0;1328}13291330static intconflict_rename_rename_2to1(struct merge_options *o,1331struct rename_conflict_info *ci)1332{1333/* Two files, a & b, were renamed to the same thing, c. */1334struct diff_filespec *a = ci->pair1->one;1335struct diff_filespec *b = ci->pair2->one;1336struct diff_filespec *c1 = ci->pair1->two;1337struct diff_filespec *c2 = ci->pair2->two;1338char*path = c1->path;/* == c2->path */1339struct merge_file_info mfi_c1;1340struct merge_file_info mfi_c2;1341int ret;13421343output(o,1,_("CONFLICT (rename/rename): "1344"Rename%s->%sin%s. "1345"Rename%s->%sin%s"),1346 a->path, c1->path, ci->branch1,1347 b->path, c2->path, ci->branch2);13481349remove_file(o,1, a->path, o->call_depth ||would_lose_untracked(a->path));1350remove_file(o,1, b->path, o->call_depth ||would_lose_untracked(b->path));13511352if(merge_file_special_markers(o, a, c1, &ci->ren1_other,1353 o->branch1, c1->path,1354 o->branch2, ci->ren1_other.path, &mfi_c1) ||1355merge_file_special_markers(o, b, &ci->ren2_other, c2,1356 o->branch1, ci->ren2_other.path,1357 o->branch2, c2->path, &mfi_c2))1358return-1;13591360if(o->call_depth) {1361/*1362 * If mfi_c1.clean && mfi_c2.clean, then it might make1363 * sense to do a two-way merge of those results. But, I1364 * think in all cases, it makes sense to have the virtual1365 * merge base just undo the renames; they can be detected1366 * again later for the non-recursive merge.1367 */1368remove_file(o,0, path,0);1369 ret =update_file(o,0, &mfi_c1.oid, mfi_c1.mode, a->path);1370if(!ret)1371 ret =update_file(o,0, &mfi_c2.oid, mfi_c2.mode,1372 b->path);1373}else{1374char*new_path1 =unique_path(o, path, ci->branch1);1375char*new_path2 =unique_path(o, path, ci->branch2);1376output(o,1,_("Renaming%sto%sand%sto%sinstead"),1377 a->path, new_path1, b->path, new_path2);1378remove_file(o,0, path,0);1379 ret =update_file(o,0, &mfi_c1.oid, mfi_c1.mode, new_path1);1380if(!ret)1381 ret =update_file(o,0, &mfi_c2.oid, mfi_c2.mode,1382 new_path2);1383free(new_path2);1384free(new_path1);1385}13861387return ret;1388}13891390/*1391 * Get the diff_filepairs changed between o_tree and tree.1392 */1393static struct diff_queue_struct *get_diffpairs(struct merge_options *o,1394struct tree *o_tree,1395struct tree *tree)1396{1397struct diff_queue_struct *ret;1398struct diff_options opts;13991400diff_setup(&opts);1401 opts.flags.recursive =1;1402 opts.flags.rename_empty =0;1403 opts.detect_rename = DIFF_DETECT_RENAME;1404 opts.rename_limit = o->merge_rename_limit >=0? o->merge_rename_limit :1405 o->diff_rename_limit >=0? o->diff_rename_limit :14061000;1407 opts.rename_score = o->rename_score;1408 opts.show_rename_progress = o->show_rename_progress;1409 opts.output_format = DIFF_FORMAT_NO_OUTPUT;1410diff_setup_done(&opts);1411diff_tree_oid(&o_tree->object.oid, &tree->object.oid,"", &opts);1412diffcore_std(&opts);1413if(opts.needed_rename_limit > o->needed_rename_limit)1414 o->needed_rename_limit = opts.needed_rename_limit;14151416 ret =xmalloc(sizeof(*ret));1417*ret = diff_queued_diff;14181419 opts.output_format = DIFF_FORMAT_NO_OUTPUT;1420 diff_queued_diff.nr =0;1421 diff_queued_diff.queue = NULL;1422diff_flush(&opts);1423return ret;1424}14251426static inttree_has_path(struct tree *tree,const char*path)1427{1428unsigned char hashy[GIT_MAX_RAWSZ];1429unsigned int mode_o;14301431return!get_tree_entry(tree->object.oid.hash, path,1432 hashy, &mode_o);1433}14341435/*1436 * Return a new string that replaces the beginning portion (which matches1437 * entry->dir), with entry->new_dir. In perl-speak:1438 * new_path_name = (old_path =~ s/entry->dir/entry->new_dir/);1439 * NOTE:1440 * Caller must ensure that old_path starts with entry->dir + '/'.1441 */1442static char*apply_dir_rename(struct dir_rename_entry *entry,1443const char*old_path)1444{1445struct strbuf new_path = STRBUF_INIT;1446int oldlen, newlen;14471448if(entry->non_unique_new_dir)1449return NULL;14501451 oldlen =strlen(entry->dir);1452 newlen = entry->new_dir.len + (strlen(old_path) - oldlen) +1;1453strbuf_grow(&new_path, newlen);1454strbuf_addbuf(&new_path, &entry->new_dir);1455strbuf_addstr(&new_path, &old_path[oldlen]);14561457returnstrbuf_detach(&new_path, NULL);1458}14591460static voidget_renamed_dir_portion(const char*old_path,const char*new_path,1461char**old_dir,char**new_dir)1462{1463char*end_of_old, *end_of_new;1464int old_len, new_len;14651466*old_dir = NULL;1467*new_dir = NULL;14681469/*1470 * For1471 * "a/b/c/d/e/foo.c" -> "a/b/some/thing/else/e/foo.c"1472 * the "e/foo.c" part is the same, we just want to know that1473 * "a/b/c/d" was renamed to "a/b/some/thing/else"1474 * so, for this example, this function returns "a/b/c/d" in1475 * *old_dir and "a/b/some/thing/else" in *new_dir.1476 *1477 * Also, if the basename of the file changed, we don't care. We1478 * want to know which portion of the directory, if any, changed.1479 */1480 end_of_old =strrchr(old_path,'/');1481 end_of_new =strrchr(new_path,'/');14821483if(end_of_old == NULL || end_of_new == NULL)1484return;1485while(*--end_of_new == *--end_of_old &&1486 end_of_old != old_path &&1487 end_of_new != new_path)1488;/* Do nothing; all in the while loop */1489/*1490 * We've found the first non-matching character in the directory1491 * paths. That means the current directory we were comparing1492 * represents the rename. Move end_of_old and end_of_new back1493 * to the full directory name.1494 */1495if(*end_of_old =='/')1496 end_of_old++;1497if(*end_of_old !='/')1498 end_of_new++;1499 end_of_old =strchr(end_of_old,'/');1500 end_of_new =strchr(end_of_new,'/');15011502/*1503 * It may have been the case that old_path and new_path were the same1504 * directory all along. Don't claim a rename if they're the same.1505 */1506 old_len = end_of_old - old_path;1507 new_len = end_of_new - new_path;15081509if(old_len != new_len ||strncmp(old_path, new_path, old_len)) {1510*old_dir =xstrndup(old_path, old_len);1511*new_dir =xstrndup(new_path, new_len);1512}1513}15141515static voidremove_hashmap_entries(struct hashmap *dir_renames,1516struct string_list *items_to_remove)1517{1518int i;1519struct dir_rename_entry *entry;15201521for(i =0; i < items_to_remove->nr; i++) {1522 entry = items_to_remove->items[i].util;1523hashmap_remove(dir_renames, entry, NULL);1524}1525string_list_clear(items_to_remove,0);1526}15271528/*1529 * See if there is a directory rename for path, and if there are any file1530 * level conflicts for the renamed location. If there is a rename and1531 * there are no conflicts, return the new name. Otherwise, return NULL.1532 */1533static char*handle_path_level_conflicts(struct merge_options *o,1534const char*path,1535struct dir_rename_entry *entry,1536struct hashmap *collisions,1537struct tree *tree)1538{1539char*new_path = NULL;1540struct collision_entry *collision_ent;1541int clean =1;1542struct strbuf collision_paths = STRBUF_INIT;15431544/*1545 * entry has the mapping of old directory name to new directory name1546 * that we want to apply to path.1547 */1548 new_path =apply_dir_rename(entry, path);15491550if(!new_path) {1551/* This should only happen when entry->non_unique_new_dir set */1552if(!entry->non_unique_new_dir)1553BUG("entry->non_unqiue_dir not set and !new_path");1554output(o,1,_("CONFLICT (directory rename split): "1555"Unclear where to place%sbecause directory "1556"%swas renamed to multiple other directories, "1557"with no destination getting a majority of the "1558"files."),1559 path, entry->dir);1560 clean =0;1561return NULL;1562}15631564/*1565 * The caller needs to have ensured that it has pre-populated1566 * collisions with all paths that map to new_path. Do a quick check1567 * to ensure that's the case.1568 */1569 collision_ent =collision_find_entry(collisions, new_path);1570if(collision_ent == NULL)1571BUG("collision_ent is NULL");15721573/*1574 * Check for one-sided add/add/.../add conflicts, i.e.1575 * where implicit renames from the other side doing1576 * directory rename(s) can affect this side of history1577 * to put multiple paths into the same location. Warn1578 * and bail on directory renames for such paths.1579 */1580if(collision_ent->reported_already) {1581 clean =0;1582}else if(tree_has_path(tree, new_path)) {1583 collision_ent->reported_already =1;1584strbuf_add_separated_string_list(&collision_paths,", ",1585&collision_ent->source_files);1586output(o,1,_("CONFLICT (implicit dir rename): Existing "1587"file/dir at%sin the way of implicit "1588"directory rename(s) putting the following "1589"path(s) there:%s."),1590 new_path, collision_paths.buf);1591 clean =0;1592}else if(collision_ent->source_files.nr >1) {1593 collision_ent->reported_already =1;1594strbuf_add_separated_string_list(&collision_paths,", ",1595&collision_ent->source_files);1596output(o,1,_("CONFLICT (implicit dir rename): Cannot map "1597"more than one path to%s; implicit directory "1598"renames tried to put these paths there:%s"),1599 new_path, collision_paths.buf);1600 clean =0;1601}16021603/* Free memory we no longer need */1604strbuf_release(&collision_paths);1605if(!clean && new_path) {1606free(new_path);1607return NULL;1608}16091610return new_path;1611}16121613/*1614 * There are a couple things we want to do at the directory level:1615 * 1. Check for both sides renaming to the same thing, in order to avoid1616 * implicit renaming of files that should be left in place. (See1617 * testcase 6b in t6043 for details.)1618 * 2. Prune directory renames if there are still files left in the1619 * the original directory. These represent a partial directory rename,1620 * i.e. a rename where only some of the files within the directory1621 * were renamed elsewhere. (Technically, this could be done earlier1622 * in get_directory_renames(), except that would prevent us from1623 * doing the previous check and thus failing testcase 6b.)1624 * 3. Check for rename/rename(1to2) conflicts (at the directory level).1625 * In the future, we could potentially record this info as well and1626 * omit reporting rename/rename(1to2) conflicts for each path within1627 * the affected directories, thus cleaning up the merge output.1628 * NOTE: We do NOT check for rename/rename(2to1) conflicts at the1629 * directory level, because merging directories is fine. If it1630 * causes conflicts for files within those merged directories, then1631 * that should be detected at the individual path level.1632 */1633static voidhandle_directory_level_conflicts(struct merge_options *o,1634struct hashmap *dir_re_head,1635struct tree *head,1636struct hashmap *dir_re_merge,1637struct tree *merge)1638{1639struct hashmap_iter iter;1640struct dir_rename_entry *head_ent;1641struct dir_rename_entry *merge_ent;16421643struct string_list remove_from_head = STRING_LIST_INIT_NODUP;1644struct string_list remove_from_merge = STRING_LIST_INIT_NODUP;16451646hashmap_iter_init(dir_re_head, &iter);1647while((head_ent =hashmap_iter_next(&iter))) {1648 merge_ent =dir_rename_find_entry(dir_re_merge, head_ent->dir);1649if(merge_ent &&1650!head_ent->non_unique_new_dir &&1651!merge_ent->non_unique_new_dir &&1652!strbuf_cmp(&head_ent->new_dir, &merge_ent->new_dir)) {1653/* 1. Renamed identically; remove it from both sides */1654string_list_append(&remove_from_head,1655 head_ent->dir)->util = head_ent;1656strbuf_release(&head_ent->new_dir);1657string_list_append(&remove_from_merge,1658 merge_ent->dir)->util = merge_ent;1659strbuf_release(&merge_ent->new_dir);1660}else if(tree_has_path(head, head_ent->dir)) {1661/* 2. This wasn't a directory rename after all */1662string_list_append(&remove_from_head,1663 head_ent->dir)->util = head_ent;1664strbuf_release(&head_ent->new_dir);1665}1666}16671668remove_hashmap_entries(dir_re_head, &remove_from_head);1669remove_hashmap_entries(dir_re_merge, &remove_from_merge);16701671hashmap_iter_init(dir_re_merge, &iter);1672while((merge_ent =hashmap_iter_next(&iter))) {1673 head_ent =dir_rename_find_entry(dir_re_head, merge_ent->dir);1674if(tree_has_path(merge, merge_ent->dir)) {1675/* 2. This wasn't a directory rename after all */1676string_list_append(&remove_from_merge,1677 merge_ent->dir)->util = merge_ent;1678}else if(head_ent &&1679!head_ent->non_unique_new_dir &&1680!merge_ent->non_unique_new_dir) {1681/* 3. rename/rename(1to2) */1682/*1683 * We can assume it's not rename/rename(1to1) because1684 * that was case (1), already checked above. So we1685 * know that head_ent->new_dir and merge_ent->new_dir1686 * are different strings.1687 */1688output(o,1,_("CONFLICT (rename/rename): "1689"Rename directory%s->%sin%s. "1690"Rename directory%s->%sin%s"),1691 head_ent->dir, head_ent->new_dir.buf, o->branch1,1692 head_ent->dir, merge_ent->new_dir.buf, o->branch2);1693string_list_append(&remove_from_head,1694 head_ent->dir)->util = head_ent;1695strbuf_release(&head_ent->new_dir);1696string_list_append(&remove_from_merge,1697 merge_ent->dir)->util = merge_ent;1698strbuf_release(&merge_ent->new_dir);1699}1700}17011702remove_hashmap_entries(dir_re_head, &remove_from_head);1703remove_hashmap_entries(dir_re_merge, &remove_from_merge);1704}17051706static struct hashmap *get_directory_renames(struct diff_queue_struct *pairs,1707struct tree *tree)1708{1709struct hashmap *dir_renames;1710struct hashmap_iter iter;1711struct dir_rename_entry *entry;1712int i;17131714/*1715 * Typically, we think of a directory rename as all files from a1716 * certain directory being moved to a target directory. However,1717 * what if someone first moved two files from the original1718 * directory in one commit, and then renamed the directory1719 * somewhere else in a later commit? At merge time, we just know1720 * that files from the original directory went to two different1721 * places, and that the bulk of them ended up in the same place.1722 * We want each directory rename to represent where the bulk of the1723 * files from that directory end up; this function exists to find1724 * where the bulk of the files went.1725 *1726 * The first loop below simply iterates through the list of file1727 * renames, finding out how often each directory rename pair1728 * possibility occurs.1729 */1730 dir_renames =xmalloc(sizeof(struct hashmap));1731dir_rename_init(dir_renames);1732for(i =0; i < pairs->nr; ++i) {1733struct string_list_item *item;1734int*count;1735struct diff_filepair *pair = pairs->queue[i];1736char*old_dir, *new_dir;17371738/* File not part of directory rename if it wasn't renamed */1739if(pair->status !='R')1740continue;17411742get_renamed_dir_portion(pair->one->path, pair->two->path,1743&old_dir, &new_dir);1744if(!old_dir)1745/* Directory didn't change at all; ignore this one. */1746continue;17471748 entry =dir_rename_find_entry(dir_renames, old_dir);1749if(!entry) {1750 entry =xmalloc(sizeof(struct dir_rename_entry));1751dir_rename_entry_init(entry, old_dir);1752hashmap_put(dir_renames, entry);1753}else{1754free(old_dir);1755}1756 item =string_list_lookup(&entry->possible_new_dirs, new_dir);1757if(!item) {1758 item =string_list_insert(&entry->possible_new_dirs,1759 new_dir);1760 item->util =xcalloc(1,sizeof(int));1761}else{1762free(new_dir);1763}1764 count = item->util;1765*count +=1;1766}17671768/*1769 * For each directory with files moved out of it, we find out which1770 * target directory received the most files so we can declare it to1771 * be the "winning" target location for the directory rename. This1772 * winner gets recorded in new_dir. If there is no winner1773 * (multiple target directories received the same number of files),1774 * we set non_unique_new_dir. Once we've determined the winner (or1775 * that there is no winner), we no longer need possible_new_dirs.1776 */1777hashmap_iter_init(dir_renames, &iter);1778while((entry =hashmap_iter_next(&iter))) {1779int max =0;1780int bad_max =0;1781char*best = NULL;17821783for(i =0; i < entry->possible_new_dirs.nr; i++) {1784int*count = entry->possible_new_dirs.items[i].util;17851786if(*count == max)1787 bad_max = max;1788else if(*count > max) {1789 max = *count;1790 best = entry->possible_new_dirs.items[i].string;1791}1792}1793if(bad_max == max)1794 entry->non_unique_new_dir =1;1795else{1796assert(entry->new_dir.len ==0);1797strbuf_addstr(&entry->new_dir, best);1798}1799/*1800 * The relevant directory sub-portion of the original full1801 * filepaths were xstrndup'ed before inserting into1802 * possible_new_dirs, and instead of manually iterating the1803 * list and free'ing each, just lie and tell1804 * possible_new_dirs that it did the strdup'ing so that it1805 * will free them for us.1806 */1807 entry->possible_new_dirs.strdup_strings =1;1808string_list_clear(&entry->possible_new_dirs,1);1809}18101811return dir_renames;1812}18131814static struct dir_rename_entry *check_dir_renamed(const char*path,1815struct hashmap *dir_renames)1816{1817char temp[PATH_MAX];1818char*end;1819struct dir_rename_entry *entry;18201821strcpy(temp, path);1822while((end =strrchr(temp,'/'))) {1823*end ='\0';1824 entry =dir_rename_find_entry(dir_renames, temp);1825if(entry)1826return entry;1827}1828return NULL;1829}18301831static voidcompute_collisions(struct hashmap *collisions,1832struct hashmap *dir_renames,1833struct diff_queue_struct *pairs)1834{1835int i;18361837/*1838 * Multiple files can be mapped to the same path due to directory1839 * renames done by the other side of history. Since that other1840 * side of history could have merged multiple directories into one,1841 * if our side of history added the same file basename to each of1842 * those directories, then all N of them would get implicitly1843 * renamed by the directory rename detection into the same path,1844 * and we'd get an add/add/.../add conflict, and all those adds1845 * from *this* side of history. This is not representable in the1846 * index, and users aren't going to easily be able to make sense of1847 * it. So we need to provide a good warning about what's1848 * happening, and fall back to no-directory-rename detection1849 * behavior for those paths.1850 *1851 * See testcases 9e and all of section 5 from t6043 for examples.1852 */1853collision_init(collisions);18541855for(i =0; i < pairs->nr; ++i) {1856struct dir_rename_entry *dir_rename_ent;1857struct collision_entry *collision_ent;1858char*new_path;1859struct diff_filepair *pair = pairs->queue[i];18601861if(pair->status =='D')1862continue;1863 dir_rename_ent =check_dir_renamed(pair->two->path,1864 dir_renames);1865if(!dir_rename_ent)1866continue;18671868 new_path =apply_dir_rename(dir_rename_ent, pair->two->path);1869if(!new_path)1870/*1871 * dir_rename_ent->non_unique_new_path is true, which1872 * means there is no directory rename for us to use,1873 * which means it won't cause us any additional1874 * collisions.1875 */1876continue;1877 collision_ent =collision_find_entry(collisions, new_path);1878if(!collision_ent) {1879 collision_ent =xcalloc(1,1880sizeof(struct collision_entry));1881hashmap_entry_init(collision_ent,strhash(new_path));1882hashmap_put(collisions, collision_ent);1883 collision_ent->target_file = new_path;1884}else{1885free(new_path);1886}1887string_list_insert(&collision_ent->source_files,1888 pair->two->path);1889}1890}18911892static char*check_for_directory_rename(struct merge_options *o,1893const char*path,1894struct tree *tree,1895struct hashmap *dir_renames,1896struct hashmap *dir_rename_exclusions,1897struct hashmap *collisions,1898int*clean_merge)1899{1900char*new_path = NULL;1901struct dir_rename_entry *entry =check_dir_renamed(path, dir_renames);1902struct dir_rename_entry *oentry = NULL;19031904if(!entry)1905return new_path;19061907/*1908 * This next part is a little weird. We do not want to do an1909 * implicit rename into a directory we renamed on our side, because1910 * that will result in a spurious rename/rename(1to2) conflict. An1911 * example:1912 * Base commit: dumbdir/afile, otherdir/bfile1913 * Side 1: smrtdir/afile, otherdir/bfile1914 * Side 2: dumbdir/afile, dumbdir/bfile1915 * Here, while working on Side 1, we could notice that otherdir was1916 * renamed/merged to dumbdir, and change the diff_filepair for1917 * otherdir/bfile into a rename into dumbdir/bfile. However, Side1918 * 2 will notice the rename from dumbdir to smrtdir, and do the1919 * transitive rename to move it from dumbdir/bfile to1920 * smrtdir/bfile. That gives us bfile in dumbdir vs being in1921 * smrtdir, a rename/rename(1to2) conflict. We really just want1922 * the file to end up in smrtdir. And the way to achieve that is1923 * to not let Side1 do the rename to dumbdir, since we know that is1924 * the source of one of our directory renames.1925 *1926 * That's why oentry and dir_rename_exclusions is here.1927 *1928 * As it turns out, this also prevents N-way transient rename1929 * confusion; See testcases 9c and 9d of t6043.1930 */1931 oentry =dir_rename_find_entry(dir_rename_exclusions, entry->new_dir.buf);1932if(oentry) {1933output(o,1,_("WARNING: Avoiding applying%s->%srename "1934"to%s, because%sitself was renamed."),1935 entry->dir, entry->new_dir.buf, path, entry->new_dir.buf);1936}else{1937 new_path =handle_path_level_conflicts(o, path, entry,1938 collisions, tree);1939*clean_merge &= (new_path != NULL);1940}19411942return new_path;1943}19441945/*1946 * Get information of all renames which occurred in 'pairs', making use of1947 * any implicit directory renames inferred from the other side of history.1948 * We need the three trees in the merge ('o_tree', 'a_tree' and 'b_tree')1949 * to be able to associate the correct cache entries with the rename1950 * information; tree is always equal to either a_tree or b_tree.1951 */1952static struct string_list *get_renames(struct merge_options *o,1953struct diff_queue_struct *pairs,1954struct hashmap *dir_renames,1955struct hashmap *dir_rename_exclusions,1956struct tree *tree,1957struct tree *o_tree,1958struct tree *a_tree,1959struct tree *b_tree,1960struct string_list *entries,1961int*clean_merge)1962{1963int i;1964struct hashmap collisions;1965struct hashmap_iter iter;1966struct collision_entry *e;1967struct string_list *renames;19681969compute_collisions(&collisions, dir_renames, pairs);1970 renames =xcalloc(1,sizeof(struct string_list));19711972for(i =0; i < pairs->nr; ++i) {1973struct string_list_item *item;1974struct rename *re;1975struct diff_filepair *pair = pairs->queue[i];1976char*new_path;/* non-NULL only with directory renames */19771978if(pair->status =='D') {1979diff_free_filepair(pair);1980continue;1981}1982 new_path =check_for_directory_rename(o, pair->two->path, tree,1983 dir_renames,1984 dir_rename_exclusions,1985&collisions,1986 clean_merge);1987if(pair->status !='R'&& !new_path) {1988diff_free_filepair(pair);1989continue;1990}19911992 re =xmalloc(sizeof(*re));1993 re->processed =0;1994 re->pair = pair;1995 item =string_list_lookup(entries, re->pair->one->path);1996if(!item)1997 re->src_entry =insert_stage_data(re->pair->one->path,1998 o_tree, a_tree, b_tree, entries);1999else2000 re->src_entry = item->util;20012002 item =string_list_lookup(entries, re->pair->two->path);2003if(!item)2004 re->dst_entry =insert_stage_data(re->pair->two->path,2005 o_tree, a_tree, b_tree, entries);2006else2007 re->dst_entry = item->util;2008 item =string_list_insert(renames, pair->one->path);2009 item->util = re;2010}20112012hashmap_iter_init(&collisions, &iter);2013while((e =hashmap_iter_next(&iter))) {2014free(e->target_file);2015string_list_clear(&e->source_files,0);2016}2017hashmap_free(&collisions,1);2018return renames;2019}20202021static intprocess_renames(struct merge_options *o,2022struct string_list *a_renames,2023struct string_list *b_renames)2024{2025int clean_merge =1, i, j;2026struct string_list a_by_dst = STRING_LIST_INIT_NODUP;2027struct string_list b_by_dst = STRING_LIST_INIT_NODUP;2028const struct rename *sre;20292030for(i =0; i < a_renames->nr; i++) {2031 sre = a_renames->items[i].util;2032string_list_insert(&a_by_dst, sre->pair->two->path)->util2033= (void*)sre;2034}2035for(i =0; i < b_renames->nr; i++) {2036 sre = b_renames->items[i].util;2037string_list_insert(&b_by_dst, sre->pair->two->path)->util2038= (void*)sre;2039}20402041for(i =0, j =0; i < a_renames->nr || j < b_renames->nr;) {2042struct string_list *renames1, *renames2Dst;2043struct rename *ren1 = NULL, *ren2 = NULL;2044const char*branch1, *branch2;2045const char*ren1_src, *ren1_dst;2046struct string_list_item *lookup;20472048if(i >= a_renames->nr) {2049 ren2 = b_renames->items[j++].util;2050}else if(j >= b_renames->nr) {2051 ren1 = a_renames->items[i++].util;2052}else{2053int compare =strcmp(a_renames->items[i].string,2054 b_renames->items[j].string);2055if(compare <=0)2056 ren1 = a_renames->items[i++].util;2057if(compare >=0)2058 ren2 = b_renames->items[j++].util;2059}20602061/* TODO: refactor, so that 1/2 are not needed */2062if(ren1) {2063 renames1 = a_renames;2064 renames2Dst = &b_by_dst;2065 branch1 = o->branch1;2066 branch2 = o->branch2;2067}else{2068 renames1 = b_renames;2069 renames2Dst = &a_by_dst;2070 branch1 = o->branch2;2071 branch2 = o->branch1;2072SWAP(ren2, ren1);2073}20742075if(ren1->processed)2076continue;2077 ren1->processed =1;2078 ren1->dst_entry->processed =1;2079/* BUG: We should only mark src_entry as processed if we2080 * are not dealing with a rename + add-source case.2081 */2082 ren1->src_entry->processed =1;20832084 ren1_src = ren1->pair->one->path;2085 ren1_dst = ren1->pair->two->path;20862087if(ren2) {2088/* One file renamed on both sides */2089const char*ren2_src = ren2->pair->one->path;2090const char*ren2_dst = ren2->pair->two->path;2091enum rename_type rename_type;2092if(strcmp(ren1_src, ren2_src) !=0)2093die("BUG: ren1_src != ren2_src");2094 ren2->dst_entry->processed =1;2095 ren2->processed =1;2096if(strcmp(ren1_dst, ren2_dst) !=0) {2097 rename_type = RENAME_ONE_FILE_TO_TWO;2098 clean_merge =0;2099}else{2100 rename_type = RENAME_ONE_FILE_TO_ONE;2101/* BUG: We should only remove ren1_src in2102 * the base stage (think of rename +2103 * add-source cases).2104 */2105remove_file(o,1, ren1_src,1);2106update_entry(ren1->dst_entry,2107 ren1->pair->one,2108 ren1->pair->two,2109 ren2->pair->two);2110}2111setup_rename_conflict_info(rename_type,2112 ren1->pair,2113 ren2->pair,2114 branch1,2115 branch2,2116 ren1->dst_entry,2117 ren2->dst_entry,2118 o,2119 NULL,2120 NULL);2121}else if((lookup =string_list_lookup(renames2Dst, ren1_dst))) {2122/* Two different files renamed to the same thing */2123char*ren2_dst;2124 ren2 = lookup->util;2125 ren2_dst = ren2->pair->two->path;2126if(strcmp(ren1_dst, ren2_dst) !=0)2127die("BUG: ren1_dst != ren2_dst");21282129 clean_merge =0;2130 ren2->processed =1;2131/*2132 * BUG: We should only mark src_entry as processed2133 * if we are not dealing with a rename + add-source2134 * case.2135 */2136 ren2->src_entry->processed =1;21372138setup_rename_conflict_info(RENAME_TWO_FILES_TO_ONE,2139 ren1->pair,2140 ren2->pair,2141 branch1,2142 branch2,2143 ren1->dst_entry,2144 ren2->dst_entry,2145 o,2146 ren1->src_entry,2147 ren2->src_entry);21482149}else{2150/* Renamed in 1, maybe changed in 2 */2151/* we only use sha1 and mode of these */2152struct diff_filespec src_other, dst_other;2153int try_merge;21542155/*2156 * unpack_trees loads entries from common-commit2157 * into stage 1, from head-commit into stage 2, and2158 * from merge-commit into stage 3. We keep track2159 * of which side corresponds to the rename.2160 */2161int renamed_stage = a_renames == renames1 ?2:3;2162int other_stage = a_renames == renames1 ?3:2;21632164/* BUG: We should only remove ren1_src in the base2165 * stage and in other_stage (think of rename +2166 * add-source case).2167 */2168remove_file(o,1, ren1_src,2169 renamed_stage ==2|| !was_tracked(ren1_src));21702171oidcpy(&src_other.oid,2172&ren1->src_entry->stages[other_stage].oid);2173 src_other.mode = ren1->src_entry->stages[other_stage].mode;2174oidcpy(&dst_other.oid,2175&ren1->dst_entry->stages[other_stage].oid);2176 dst_other.mode = ren1->dst_entry->stages[other_stage].mode;2177 try_merge =0;21782179if(oid_eq(&src_other.oid, &null_oid)) {2180setup_rename_conflict_info(RENAME_DELETE,2181 ren1->pair,2182 NULL,2183 branch1,2184 branch2,2185 ren1->dst_entry,2186 NULL,2187 o,2188 NULL,2189 NULL);2190}else if((dst_other.mode == ren1->pair->two->mode) &&2191oid_eq(&dst_other.oid, &ren1->pair->two->oid)) {2192/*2193 * Added file on the other side identical to2194 * the file being renamed: clean merge.2195 * Also, there is no need to overwrite the2196 * file already in the working copy, so call2197 * update_file_flags() instead of2198 * update_file().2199 */2200if(update_file_flags(o,2201&ren1->pair->two->oid,2202 ren1->pair->two->mode,2203 ren1_dst,22041,/* update_cache */22050/* update_wd */))2206 clean_merge = -1;2207}else if(!oid_eq(&dst_other.oid, &null_oid)) {2208 clean_merge =0;2209 try_merge =1;2210output(o,1,_("CONFLICT (rename/add): Rename%s->%sin%s. "2211"%sadded in%s"),2212 ren1_src, ren1_dst, branch1,2213 ren1_dst, branch2);2214if(o->call_depth) {2215struct merge_file_info mfi;2216if(merge_file_one(o, ren1_dst, &null_oid,0,2217&ren1->pair->two->oid,2218 ren1->pair->two->mode,2219&dst_other.oid,2220 dst_other.mode,2221 branch1, branch2, &mfi)) {2222 clean_merge = -1;2223goto cleanup_and_return;2224}2225output(o,1,_("Adding merged%s"), ren1_dst);2226if(update_file(o,0, &mfi.oid,2227 mfi.mode, ren1_dst))2228 clean_merge = -1;2229 try_merge =0;2230}else{2231char*new_path =unique_path(o, ren1_dst, branch2);2232output(o,1,_("Adding as%sinstead"), new_path);2233if(update_file(o,0, &dst_other.oid,2234 dst_other.mode, new_path))2235 clean_merge = -1;2236free(new_path);2237}2238}else2239 try_merge =1;22402241if(clean_merge <0)2242goto cleanup_and_return;2243if(try_merge) {2244struct diff_filespec *one, *a, *b;2245 src_other.path = (char*)ren1_src;22462247 one = ren1->pair->one;2248if(a_renames == renames1) {2249 a = ren1->pair->two;2250 b = &src_other;2251}else{2252 b = ren1->pair->two;2253 a = &src_other;2254}2255update_entry(ren1->dst_entry, one, a, b);2256setup_rename_conflict_info(RENAME_NORMAL,2257 ren1->pair,2258 NULL,2259 branch1,2260 NULL,2261 ren1->dst_entry,2262 NULL,2263 o,2264 NULL,2265 NULL);2266}2267}2268}2269cleanup_and_return:2270string_list_clear(&a_by_dst,0);2271string_list_clear(&b_by_dst,0);22722273return clean_merge;2274}22752276struct rename_info {2277struct string_list *head_renames;2278struct string_list *merge_renames;2279};22802281static voidinitial_cleanup_rename(struct diff_queue_struct *pairs,2282struct hashmap *dir_renames)2283{2284struct hashmap_iter iter;2285struct dir_rename_entry *e;22862287hashmap_iter_init(dir_renames, &iter);2288while((e =hashmap_iter_next(&iter))) {2289free(e->dir);2290strbuf_release(&e->new_dir);2291/* possible_new_dirs already cleared in get_directory_renames */2292}2293hashmap_free(dir_renames,1);2294free(dir_renames);22952296free(pairs->queue);2297free(pairs);2298}22992300static inthandle_renames(struct merge_options *o,2301struct tree *common,2302struct tree *head,2303struct tree *merge,2304struct string_list *entries,2305struct rename_info *ri)2306{2307struct diff_queue_struct *head_pairs, *merge_pairs;2308struct hashmap *dir_re_head, *dir_re_merge;2309int clean =1;23102311 ri->head_renames = NULL;2312 ri->merge_renames = NULL;23132314if(!o->detect_rename)2315return1;23162317 head_pairs =get_diffpairs(o, common, head);2318 merge_pairs =get_diffpairs(o, common, merge);23192320 dir_re_head =get_directory_renames(head_pairs, head);2321 dir_re_merge =get_directory_renames(merge_pairs, merge);23222323handle_directory_level_conflicts(o,2324 dir_re_head, head,2325 dir_re_merge, merge);23262327 ri->head_renames =get_renames(o, head_pairs,2328 dir_re_merge, dir_re_head, head,2329 common, head, merge, entries,2330&clean);2331if(clean <0)2332goto cleanup;2333 ri->merge_renames =get_renames(o, merge_pairs,2334 dir_re_head, dir_re_merge, merge,2335 common, head, merge, entries,2336&clean);2337if(clean <0)2338goto cleanup;2339 clean &=process_renames(o, ri->head_renames, ri->merge_renames);23402341cleanup:2342/*2343 * Some cleanup is deferred until cleanup_renames() because the2344 * data structures are still needed and referenced in2345 * process_entry(). But there are a few things we can free now.2346 */2347initial_cleanup_rename(head_pairs, dir_re_head);2348initial_cleanup_rename(merge_pairs, dir_re_merge);23492350return clean;2351}23522353static voidfinal_cleanup_rename(struct string_list *rename)2354{2355const struct rename *re;2356int i;23572358if(rename == NULL)2359return;23602361for(i =0; i < rename->nr; i++) {2362 re = rename->items[i].util;2363diff_free_filepair(re->pair);2364}2365string_list_clear(rename,1);2366free(rename);2367}23682369static voidfinal_cleanup_renames(struct rename_info *re_info)2370{2371final_cleanup_rename(re_info->head_renames);2372final_cleanup_rename(re_info->merge_renames);2373}23742375static struct object_id *stage_oid(const struct object_id *oid,unsigned mode)2376{2377return(is_null_oid(oid) || mode ==0) ? NULL: (struct object_id *)oid;2378}23792380static intread_oid_strbuf(struct merge_options *o,2381const struct object_id *oid,struct strbuf *dst)2382{2383void*buf;2384enum object_type type;2385unsigned long size;2386 buf =read_sha1_file(oid->hash, &type, &size);2387if(!buf)2388returnerr(o,_("cannot read object%s"),oid_to_hex(oid));2389if(type != OBJ_BLOB) {2390free(buf);2391returnerr(o,_("object%sis not a blob"),oid_to_hex(oid));2392}2393strbuf_attach(dst, buf, size, size +1);2394return0;2395}23962397static intblob_unchanged(struct merge_options *opt,2398const struct object_id *o_oid,2399unsigned o_mode,2400const struct object_id *a_oid,2401unsigned a_mode,2402int renormalize,const char*path)2403{2404struct strbuf o = STRBUF_INIT;2405struct strbuf a = STRBUF_INIT;2406int ret =0;/* assume changed for safety */24072408if(a_mode != o_mode)2409return0;2410if(oid_eq(o_oid, a_oid))2411return1;2412if(!renormalize)2413return0;24142415assert(o_oid && a_oid);2416if(read_oid_strbuf(opt, o_oid, &o) ||read_oid_strbuf(opt, a_oid, &a))2417goto error_return;2418/*2419 * Note: binary | is used so that both renormalizations are2420 * performed. Comparison can be skipped if both files are2421 * unchanged since their sha1s have already been compared.2422 */2423if(renormalize_buffer(&the_index, path, o.buf, o.len, &o) |2424renormalize_buffer(&the_index, path, a.buf, a.len, &a))2425 ret = (o.len == a.len && !memcmp(o.buf, a.buf, o.len));24262427error_return:2428strbuf_release(&o);2429strbuf_release(&a);2430return ret;2431}24322433static inthandle_modify_delete(struct merge_options *o,2434const char*path,2435struct object_id *o_oid,int o_mode,2436struct object_id *a_oid,int a_mode,2437struct object_id *b_oid,int b_mode)2438{2439const char*modify_branch, *delete_branch;2440struct object_id *changed_oid;2441int changed_mode;24422443if(a_oid) {2444 modify_branch = o->branch1;2445 delete_branch = o->branch2;2446 changed_oid = a_oid;2447 changed_mode = a_mode;2448}else{2449 modify_branch = o->branch2;2450 delete_branch = o->branch1;2451 changed_oid = b_oid;2452 changed_mode = b_mode;2453}24542455returnhandle_change_delete(o,2456 path, NULL,2457 o_oid, o_mode,2458 changed_oid, changed_mode,2459 modify_branch, delete_branch,2460_("modify"),_("modified"));2461}24622463static intmerge_content(struct merge_options *o,2464const char*path,2465struct object_id *o_oid,int o_mode,2466struct object_id *a_oid,int a_mode,2467struct object_id *b_oid,int b_mode,2468struct rename_conflict_info *rename_conflict_info)2469{2470const char*reason =_("content");2471const char*path1 = NULL, *path2 = NULL;2472struct merge_file_info mfi;2473struct diff_filespec one, a, b;2474unsigned df_conflict_remains =0;24752476if(!o_oid) {2477 reason =_("add/add");2478 o_oid = (struct object_id *)&null_oid;2479}2480 one.path = a.path = b.path = (char*)path;2481oidcpy(&one.oid, o_oid);2482 one.mode = o_mode;2483oidcpy(&a.oid, a_oid);2484 a.mode = a_mode;2485oidcpy(&b.oid, b_oid);2486 b.mode = b_mode;24872488if(rename_conflict_info) {2489struct diff_filepair *pair1 = rename_conflict_info->pair1;24902491 path1 = (o->branch1 == rename_conflict_info->branch1) ?2492 pair1->two->path : pair1->one->path;2493/* If rename_conflict_info->pair2 != NULL, we are in2494 * RENAME_ONE_FILE_TO_ONE case. Otherwise, we have a2495 * normal rename.2496 */2497 path2 = (rename_conflict_info->pair2 ||2498 o->branch2 == rename_conflict_info->branch1) ?2499 pair1->two->path : pair1->one->path;25002501if(dir_in_way(path, !o->call_depth,2502S_ISGITLINK(pair1->two->mode)))2503 df_conflict_remains =1;2504}2505if(merge_file_special_markers(o, &one, &a, &b,2506 o->branch1, path1,2507 o->branch2, path2, &mfi))2508return-1;25092510if(mfi.clean && !df_conflict_remains &&2511oid_eq(&mfi.oid, a_oid) && mfi.mode == a_mode) {2512int path_renamed_outside_HEAD;2513output(o,3,_("Skipped%s(merged same as existing)"), path);2514/*2515 * The content merge resulted in the same file contents we2516 * already had. We can return early if those file contents2517 * are recorded at the correct path (which may not be true2518 * if the merge involves a rename).2519 */2520 path_renamed_outside_HEAD = !path2 || !strcmp(path, path2);2521if(!path_renamed_outside_HEAD) {2522add_cacheinfo(o, mfi.mode, &mfi.oid, path,25230, (!o->call_depth),0);2524return mfi.clean;2525}2526}else2527output(o,2,_("Auto-merging%s"), path);25282529if(!mfi.clean) {2530if(S_ISGITLINK(mfi.mode))2531 reason =_("submodule");2532output(o,1,_("CONFLICT (%s): Merge conflict in%s"),2533 reason, path);2534if(rename_conflict_info && !df_conflict_remains)2535if(update_stages(o, path, &one, &a, &b))2536return-1;2537}25382539if(df_conflict_remains) {2540char*new_path;2541if(o->call_depth) {2542remove_file_from_cache(path);2543}else{2544if(!mfi.clean) {2545if(update_stages(o, path, &one, &a, &b))2546return-1;2547}else{2548int file_from_stage2 =was_tracked(path);2549struct diff_filespec merged;2550oidcpy(&merged.oid, &mfi.oid);2551 merged.mode = mfi.mode;25522553if(update_stages(o, path, NULL,2554 file_from_stage2 ? &merged : NULL,2555 file_from_stage2 ? NULL : &merged))2556return-1;2557}25582559}2560 new_path =unique_path(o, path, rename_conflict_info->branch1);2561output(o,1,_("Adding as%sinstead"), new_path);2562if(update_file(o,0, &mfi.oid, mfi.mode, new_path)) {2563free(new_path);2564return-1;2565}2566free(new_path);2567 mfi.clean =0;2568}else if(update_file(o, mfi.clean, &mfi.oid, mfi.mode, path))2569return-1;2570return mfi.clean;2571}25722573/* Per entry merge function */2574static intprocess_entry(struct merge_options *o,2575const char*path,struct stage_data *entry)2576{2577int clean_merge =1;2578int normalize = o->renormalize;2579unsigned o_mode = entry->stages[1].mode;2580unsigned a_mode = entry->stages[2].mode;2581unsigned b_mode = entry->stages[3].mode;2582struct object_id *o_oid =stage_oid(&entry->stages[1].oid, o_mode);2583struct object_id *a_oid =stage_oid(&entry->stages[2].oid, a_mode);2584struct object_id *b_oid =stage_oid(&entry->stages[3].oid, b_mode);25852586 entry->processed =1;2587if(entry->rename_conflict_info) {2588struct rename_conflict_info *conflict_info = entry->rename_conflict_info;2589switch(conflict_info->rename_type) {2590case RENAME_NORMAL:2591case RENAME_ONE_FILE_TO_ONE:2592 clean_merge =merge_content(o, path,2593 o_oid, o_mode, a_oid, a_mode, b_oid, b_mode,2594 conflict_info);2595break;2596case RENAME_DELETE:2597 clean_merge =0;2598if(conflict_rename_delete(o,2599 conflict_info->pair1,2600 conflict_info->branch1,2601 conflict_info->branch2))2602 clean_merge = -1;2603break;2604case RENAME_ONE_FILE_TO_TWO:2605 clean_merge =0;2606if(conflict_rename_rename_1to2(o, conflict_info))2607 clean_merge = -1;2608break;2609case RENAME_TWO_FILES_TO_ONE:2610 clean_merge =0;2611if(conflict_rename_rename_2to1(o, conflict_info))2612 clean_merge = -1;2613break;2614default:2615 entry->processed =0;2616break;2617}2618}else if(o_oid && (!a_oid || !b_oid)) {2619/* Case A: Deleted in one */2620if((!a_oid && !b_oid) ||2621(!b_oid &&blob_unchanged(o, o_oid, o_mode, a_oid, a_mode, normalize, path)) ||2622(!a_oid &&blob_unchanged(o, o_oid, o_mode, b_oid, b_mode, normalize, path))) {2623/* Deleted in both or deleted in one and2624 * unchanged in the other */2625if(a_oid)2626output(o,2,_("Removing%s"), path);2627/* do not touch working file if it did not exist */2628remove_file(o,1, path, !a_oid);2629}else{2630/* Modify/delete; deleted side may have put a directory in the way */2631 clean_merge =0;2632if(handle_modify_delete(o, path, o_oid, o_mode,2633 a_oid, a_mode, b_oid, b_mode))2634 clean_merge = -1;2635}2636}else if((!o_oid && a_oid && !b_oid) ||2637(!o_oid && !a_oid && b_oid)) {2638/* Case B: Added in one. */2639/* [nothing|directory] -> ([nothing|directory], file) */26402641const char*add_branch;2642const char*other_branch;2643unsigned mode;2644const struct object_id *oid;2645const char*conf;26462647if(a_oid) {2648 add_branch = o->branch1;2649 other_branch = o->branch2;2650 mode = a_mode;2651 oid = a_oid;2652 conf =_("file/directory");2653}else{2654 add_branch = o->branch2;2655 other_branch = o->branch1;2656 mode = b_mode;2657 oid = b_oid;2658 conf =_("directory/file");2659}2660if(dir_in_way(path,2661!o->call_depth && !S_ISGITLINK(a_mode),26620)) {2663char*new_path =unique_path(o, path, add_branch);2664 clean_merge =0;2665output(o,1,_("CONFLICT (%s): There is a directory with name%sin%s. "2666"Adding%sas%s"),2667 conf, path, other_branch, path, new_path);2668if(update_file(o,0, oid, mode, new_path))2669 clean_merge = -1;2670else if(o->call_depth)2671remove_file_from_cache(path);2672free(new_path);2673}else{2674output(o,2,_("Adding%s"), path);2675/* do not overwrite file if already present */2676if(update_file_flags(o, oid, mode, path,1, !a_oid))2677 clean_merge = -1;2678}2679}else if(a_oid && b_oid) {2680/* Case C: Added in both (check for same permissions) and */2681/* case D: Modified in both, but differently. */2682 clean_merge =merge_content(o, path,2683 o_oid, o_mode, a_oid, a_mode, b_oid, b_mode,2684 NULL);2685}else if(!o_oid && !a_oid && !b_oid) {2686/*2687 * this entry was deleted altogether. a_mode == 0 means2688 * we had that path and want to actively remove it.2689 */2690remove_file(o,1, path, !a_mode);2691}else2692die("BUG: fatal merge failure, shouldn't happen.");26932694return clean_merge;2695}26962697intmerge_trees(struct merge_options *o,2698struct tree *head,2699struct tree *merge,2700struct tree *common,2701struct tree **result)2702{2703int code, clean;27042705if(o->subtree_shift) {2706 merge =shift_tree_object(head, merge, o->subtree_shift);2707 common =shift_tree_object(head, common, o->subtree_shift);2708}27092710if(oid_eq(&common->object.oid, &merge->object.oid)) {2711struct strbuf sb = STRBUF_INIT;27122713if(!o->call_depth &&index_has_changes(&sb)) {2714err(o,_("Dirty index: cannot merge (dirty:%s)"),2715 sb.buf);2716return0;2717}2718output(o,0,_("Already up to date!"));2719*result = head;2720return1;2721}27222723 code =git_merge_trees(o->call_depth, common, head, merge);27242725if(code !=0) {2726if(show(o,4) || o->call_depth)2727err(o,_("merging of trees%sand%sfailed"),2728oid_to_hex(&head->object.oid),2729oid_to_hex(&merge->object.oid));2730return-1;2731}27322733if(unmerged_cache()) {2734struct string_list *entries;2735struct rename_info re_info;2736int i;2737/*2738 * Only need the hashmap while processing entries, so2739 * initialize it here and free it when we are done running2740 * through the entries. Keeping it in the merge_options as2741 * opposed to decaring a local hashmap is for convenience2742 * so that we don't have to pass it to around.2743 */2744hashmap_init(&o->current_file_dir_set, path_hashmap_cmp, NULL,512);2745get_files_dirs(o, head);2746get_files_dirs(o, merge);27472748 entries =get_unmerged();2749 clean =handle_renames(o, common, head, merge, entries,2750&re_info);2751record_df_conflict_files(o, entries);2752if(clean <0)2753goto cleanup;2754for(i = entries->nr-1;0<= i; i--) {2755const char*path = entries->items[i].string;2756struct stage_data *e = entries->items[i].util;2757if(!e->processed) {2758int ret =process_entry(o, path, e);2759if(!ret)2760 clean =0;2761else if(ret <0) {2762 clean = ret;2763goto cleanup;2764}2765}2766}2767for(i =0; i < entries->nr; i++) {2768struct stage_data *e = entries->items[i].util;2769if(!e->processed)2770die("BUG: unprocessed path???%s",2771 entries->items[i].string);2772}27732774cleanup:2775final_cleanup_renames(&re_info);27762777string_list_clear(entries,1);2778free(entries);27792780hashmap_free(&o->current_file_dir_set,1);27812782if(clean <0)2783return clean;2784}2785else2786 clean =1;27872788if(o->call_depth && !(*result =write_tree_from_memory(o)))2789return-1;27902791return clean;2792}27932794static struct commit_list *reverse_commit_list(struct commit_list *list)2795{2796struct commit_list *next = NULL, *current, *backup;2797for(current = list; current; current = backup) {2798 backup = current->next;2799 current->next = next;2800 next = current;2801}2802return next;2803}28042805/*2806 * Merge the commits h1 and h2, return the resulting virtual2807 * commit object and a flag indicating the cleanness of the merge.2808 */2809intmerge_recursive(struct merge_options *o,2810struct commit *h1,2811struct commit *h2,2812struct commit_list *ca,2813struct commit **result)2814{2815struct commit_list *iter;2816struct commit *merged_common_ancestors;2817struct tree *mrtree = mrtree;2818int clean;28192820if(show(o,4)) {2821output(o,4,_("Merging:"));2822output_commit_title(o, h1);2823output_commit_title(o, h2);2824}28252826if(!ca) {2827 ca =get_merge_bases(h1, h2);2828 ca =reverse_commit_list(ca);2829}28302831if(show(o,5)) {2832unsigned cnt =commit_list_count(ca);28332834output(o,5,Q_("found%ucommon ancestor:",2835"found%ucommon ancestors:", cnt), cnt);2836for(iter = ca; iter; iter = iter->next)2837output_commit_title(o, iter->item);2838}28392840 merged_common_ancestors =pop_commit(&ca);2841if(merged_common_ancestors == NULL) {2842/* if there is no common ancestor, use an empty tree */2843struct tree *tree;28442845 tree =lookup_tree(the_hash_algo->empty_tree);2846 merged_common_ancestors =make_virtual_commit(tree,"ancestor");2847}28482849for(iter = ca; iter; iter = iter->next) {2850const char*saved_b1, *saved_b2;2851 o->call_depth++;2852/*2853 * When the merge fails, the result contains files2854 * with conflict markers. The cleanness flag is2855 * ignored (unless indicating an error), it was never2856 * actually used, as result of merge_trees has always2857 * overwritten it: the committed "conflicts" were2858 * already resolved.2859 */2860discard_cache();2861 saved_b1 = o->branch1;2862 saved_b2 = o->branch2;2863 o->branch1 ="Temporary merge branch 1";2864 o->branch2 ="Temporary merge branch 2";2865if(merge_recursive(o, merged_common_ancestors, iter->item,2866 NULL, &merged_common_ancestors) <0)2867return-1;2868 o->branch1 = saved_b1;2869 o->branch2 = saved_b2;2870 o->call_depth--;28712872if(!merged_common_ancestors)2873returnerr(o,_("merge returned no commit"));2874}28752876discard_cache();2877if(!o->call_depth)2878read_cache();28792880 o->ancestor ="merged common ancestors";2881 clean =merge_trees(o, h1->tree, h2->tree, merged_common_ancestors->tree,2882&mrtree);2883if(clean <0) {2884flush_output(o);2885return clean;2886}28872888if(o->call_depth) {2889*result =make_virtual_commit(mrtree,"merged tree");2890commit_list_insert(h1, &(*result)->parents);2891commit_list_insert(h2, &(*result)->parents->next);2892}2893flush_output(o);2894if(!o->call_depth && o->buffer_output <2)2895strbuf_release(&o->obuf);2896if(show(o,2))2897diff_warn_rename_limit("merge.renamelimit",2898 o->needed_rename_limit,0);2899return clean;2900}29012902static struct commit *get_ref(const struct object_id *oid,const char*name)2903{2904struct object *object;29052906 object =deref_tag(parse_object(oid), name,strlen(name));2907if(!object)2908return NULL;2909if(object->type == OBJ_TREE)2910returnmake_virtual_commit((struct tree*)object, name);2911if(object->type != OBJ_COMMIT)2912return NULL;2913if(parse_commit((struct commit *)object))2914return NULL;2915return(struct commit *)object;2916}29172918intmerge_recursive_generic(struct merge_options *o,2919const struct object_id *head,2920const struct object_id *merge,2921int num_base_list,2922const struct object_id **base_list,2923struct commit **result)2924{2925int clean;2926struct lock_file lock = LOCK_INIT;2927struct commit *head_commit =get_ref(head, o->branch1);2928struct commit *next_commit =get_ref(merge, o->branch2);2929struct commit_list *ca = NULL;29302931if(base_list) {2932int i;2933for(i =0; i < num_base_list; ++i) {2934struct commit *base;2935if(!(base =get_ref(base_list[i],oid_to_hex(base_list[i]))))2936returnerr(o,_("Could not parse object '%s'"),2937oid_to_hex(base_list[i]));2938commit_list_insert(base, &ca);2939}2940}29412942hold_locked_index(&lock, LOCK_DIE_ON_ERROR);2943 clean =merge_recursive(o, head_commit, next_commit, ca,2944 result);2945if(clean <0)2946return clean;29472948if(active_cache_changed &&2949write_locked_index(&the_index, &lock, COMMIT_LOCK))2950returnerr(o,_("Unable to write index."));29512952return clean ?0:1;2953}29542955static voidmerge_recursive_config(struct merge_options *o)2956{2957git_config_get_int("merge.verbosity", &o->verbosity);2958git_config_get_int("diff.renamelimit", &o->diff_rename_limit);2959git_config_get_int("merge.renamelimit", &o->merge_rename_limit);2960git_config(git_xmerge_config, NULL);2961}29622963voidinit_merge_options(struct merge_options *o)2964{2965const char*merge_verbosity;2966memset(o,0,sizeof(struct merge_options));2967 o->verbosity =2;2968 o->buffer_output =1;2969 o->diff_rename_limit = -1;2970 o->merge_rename_limit = -1;2971 o->renormalize =0;2972 o->detect_rename =1;2973merge_recursive_config(o);2974 merge_verbosity =getenv("GIT_MERGE_VERBOSITY");2975if(merge_verbosity)2976 o->verbosity =strtol(merge_verbosity, NULL,10);2977if(o->verbosity >=5)2978 o->buffer_output =0;2979strbuf_init(&o->obuf,0);2980string_list_init(&o->df_conflict_file_set,1);2981}29822983intparse_merge_opt(struct merge_options *o,const char*s)2984{2985const char*arg;29862987if(!s || !*s)2988return-1;2989if(!strcmp(s,"ours"))2990 o->recursive_variant = MERGE_RECURSIVE_OURS;2991else if(!strcmp(s,"theirs"))2992 o->recursive_variant = MERGE_RECURSIVE_THEIRS;2993else if(!strcmp(s,"subtree"))2994 o->subtree_shift ="";2995else if(skip_prefix(s,"subtree=", &arg))2996 o->subtree_shift = arg;2997else if(!strcmp(s,"patience"))2998 o->xdl_opts =DIFF_WITH_ALG(o, PATIENCE_DIFF);2999else if(!strcmp(s,"histogram"))3000 o->xdl_opts =DIFF_WITH_ALG(o, HISTOGRAM_DIFF);3001else if(skip_prefix(s,"diff-algorithm=", &arg)) {3002long value =parse_algorithm_value(arg);3003if(value <0)3004return-1;3005/* clear out previous settings */3006DIFF_XDL_CLR(o, NEED_MINIMAL);3007 o->xdl_opts &= ~XDF_DIFF_ALGORITHM_MASK;3008 o->xdl_opts |= value;3009}3010else if(!strcmp(s,"ignore-space-change"))3011DIFF_XDL_SET(o, IGNORE_WHITESPACE_CHANGE);3012else if(!strcmp(s,"ignore-all-space"))3013DIFF_XDL_SET(o, IGNORE_WHITESPACE);3014else if(!strcmp(s,"ignore-space-at-eol"))3015DIFF_XDL_SET(o, IGNORE_WHITESPACE_AT_EOL);3016else if(!strcmp(s,"ignore-cr-at-eol"))3017DIFF_XDL_SET(o, IGNORE_CR_AT_EOL);3018else if(!strcmp(s,"renormalize"))3019 o->renormalize =1;3020else if(!strcmp(s,"no-renormalize"))3021 o->renormalize =0;3022else if(!strcmp(s,"no-renames"))3023 o->detect_rename =0;3024else if(!strcmp(s,"find-renames")) {3025 o->detect_rename =1;3026 o->rename_score =0;3027}3028else if(skip_prefix(s,"find-renames=", &arg) ||3029skip_prefix(s,"rename-threshold=", &arg)) {3030if((o->rename_score =parse_rename_score(&arg)) == -1|| *arg !=0)3031return-1;3032 o->detect_rename =1;3033}3034else3035return-1;3036return0;3037}