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, 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 struct object_id *oid, 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 struct object_id *tree, 425const char*path, 426struct object_id *hashy, 427unsigned int*mode_o) 428{ 429int ret; 430 431 ret =get_tree_entry(tree, path, hashy, mode_o); 432if(S_ISDIR(*mode_o)) { 433oidcpy(hashy, &null_oid); 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, path, 450&e->stages[1].oid, &e->stages[1].mode); 451get_tree_entry_if_blob(&a->object.oid, path, 452&e->stages[2].oid, &e->stages[2].mode); 453get_tree_entry_if_blob(&b->object.oid, path, 454&e->stages[3].oid, &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_object_file(oid, &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 &&1039write_object_file(result_buf.ptr, result_buf.size,1040 blob_type, &result->oid))1041 ret =err(o,_("Unable to add%sto database"),1042 a->path);10431044free(result_buf.ptr);1045if(ret)1046return ret;1047 result->clean = (merge_status ==0);1048}else if(S_ISGITLINK(a->mode)) {1049 result->clean =merge_submodule(&result->oid,1050 one->path,1051&one->oid,1052&a->oid,1053&b->oid,1054!o->call_depth);1055}else if(S_ISLNK(a->mode)) {1056switch(o->recursive_variant) {1057case MERGE_RECURSIVE_NORMAL:1058oidcpy(&result->oid, &a->oid);1059if(!oid_eq(&a->oid, &b->oid))1060 result->clean =0;1061break;1062case MERGE_RECURSIVE_OURS:1063oidcpy(&result->oid, &a->oid);1064break;1065case MERGE_RECURSIVE_THEIRS:1066oidcpy(&result->oid, &b->oid);1067break;1068}1069}else1070die("BUG: unsupported object type in the tree");1071}10721073return0;1074}10751076static intmerge_file_special_markers(struct merge_options *o,1077const struct diff_filespec *one,1078const struct diff_filespec *a,1079const struct diff_filespec *b,1080const char*branch1,1081const char*filename1,1082const char*branch2,1083const char*filename2,1084struct merge_file_info *mfi)1085{1086char*side1 = NULL;1087char*side2 = NULL;1088int ret;10891090if(filename1)1091 side1 =xstrfmt("%s:%s", branch1, filename1);1092if(filename2)1093 side2 =xstrfmt("%s:%s", branch2, filename2);10941095 ret =merge_file_1(o, one, a, b,1096 side1 ? side1 : branch1,1097 side2 ? side2 : branch2, mfi);1098free(side1);1099free(side2);1100return ret;1101}11021103static intmerge_file_one(struct merge_options *o,1104const char*path,1105const struct object_id *o_oid,int o_mode,1106const struct object_id *a_oid,int a_mode,1107const struct object_id *b_oid,int b_mode,1108const char*branch1,1109const char*branch2,1110struct merge_file_info *mfi)1111{1112struct diff_filespec one, a, b;11131114 one.path = a.path = b.path = (char*)path;1115oidcpy(&one.oid, o_oid);1116 one.mode = o_mode;1117oidcpy(&a.oid, a_oid);1118 a.mode = a_mode;1119oidcpy(&b.oid, b_oid);1120 b.mode = b_mode;1121returnmerge_file_1(o, &one, &a, &b, branch1, branch2, mfi);1122}11231124static inthandle_change_delete(struct merge_options *o,1125const char*path,const char*old_path,1126const struct object_id *o_oid,int o_mode,1127const struct object_id *changed_oid,1128int changed_mode,1129const char*change_branch,1130const char*delete_branch,1131const char*change,const char*change_past)1132{1133char*alt_path = NULL;1134const char*update_path = path;1135int ret =0;11361137if(dir_in_way(path, !o->call_depth,0)) {1138 update_path = alt_path =unique_path(o, path, change_branch);1139}11401141if(o->call_depth) {1142/*1143 * We cannot arbitrarily accept either a_sha or b_sha as1144 * correct; since there is no true "middle point" between1145 * them, simply reuse the base version for virtual merge base.1146 */1147 ret =remove_file_from_cache(path);1148if(!ret)1149 ret =update_file(o,0, o_oid, o_mode, update_path);1150}else{1151if(!alt_path) {1152if(!old_path) {1153output(o,1,_("CONFLICT (%s/delete):%sdeleted in%s"1154"and%sin%s. Version%sof%sleft in tree."),1155 change, path, delete_branch, change_past,1156 change_branch, change_branch, path);1157}else{1158output(o,1,_("CONFLICT (%s/delete):%sdeleted in%s"1159"and%sto%sin%s. Version%sof%sleft in tree."),1160 change, old_path, delete_branch, change_past, path,1161 change_branch, change_branch, path);1162}1163}else{1164if(!old_path) {1165output(o,1,_("CONFLICT (%s/delete):%sdeleted in%s"1166"and%sin%s. Version%sof%sleft in tree at%s."),1167 change, path, delete_branch, change_past,1168 change_branch, change_branch, path, alt_path);1169}else{1170output(o,1,_("CONFLICT (%s/delete):%sdeleted in%s"1171"and%sto%sin%s. Version%sof%sleft in tree at%s."),1172 change, old_path, delete_branch, change_past, path,1173 change_branch, change_branch, path, alt_path);1174}1175}1176/*1177 * No need to call update_file() on path when change_branch ==1178 * o->branch1 && !alt_path, since that would needlessly touch1179 * path. We could call update_file_flags() with update_cache=01180 * and update_wd=0, but that's a no-op.1181 */1182if(change_branch != o->branch1 || alt_path)1183 ret =update_file(o,0, changed_oid, changed_mode, update_path);1184}1185free(alt_path);11861187return ret;1188}11891190static intconflict_rename_delete(struct merge_options *o,1191struct diff_filepair *pair,1192const char*rename_branch,1193const char*delete_branch)1194{1195const struct diff_filespec *orig = pair->one;1196const struct diff_filespec *dest = pair->two;11971198if(handle_change_delete(o,1199 o->call_depth ? orig->path : dest->path,1200 o->call_depth ? NULL : orig->path,1201&orig->oid, orig->mode,1202&dest->oid, dest->mode,1203 rename_branch, delete_branch,1204_("rename"),_("renamed")))1205return-1;12061207if(o->call_depth)1208returnremove_file_from_cache(dest->path);1209else1210returnupdate_stages(o, dest->path, NULL,1211 rename_branch == o->branch1 ? dest : NULL,1212 rename_branch == o->branch1 ? NULL : dest);1213}12141215static struct diff_filespec *filespec_from_entry(struct diff_filespec *target,1216struct stage_data *entry,1217int stage)1218{1219struct object_id *oid = &entry->stages[stage].oid;1220unsigned mode = entry->stages[stage].mode;1221if(mode ==0||is_null_oid(oid))1222return NULL;1223oidcpy(&target->oid, oid);1224 target->mode = mode;1225return target;1226}12271228static inthandle_file(struct merge_options *o,1229struct diff_filespec *rename,1230int stage,1231struct rename_conflict_info *ci)1232{1233char*dst_name = rename->path;1234struct stage_data *dst_entry;1235const char*cur_branch, *other_branch;1236struct diff_filespec other;1237struct diff_filespec *add;1238int ret;12391240if(stage ==2) {1241 dst_entry = ci->dst_entry1;1242 cur_branch = ci->branch1;1243 other_branch = ci->branch2;1244}else{1245 dst_entry = ci->dst_entry2;1246 cur_branch = ci->branch2;1247 other_branch = ci->branch1;1248}12491250 add =filespec_from_entry(&other, dst_entry, stage ^1);1251if(add) {1252char*add_name =unique_path(o, rename->path, other_branch);1253if(update_file(o,0, &add->oid, add->mode, add_name))1254return-1;12551256remove_file(o,0, rename->path,0);1257 dst_name =unique_path(o, rename->path, cur_branch);1258}else{1259if(dir_in_way(rename->path, !o->call_depth,0)) {1260 dst_name =unique_path(o, rename->path, cur_branch);1261output(o,1,_("%sis a directory in%sadding as%sinstead"),1262 rename->path, other_branch, dst_name);1263}1264}1265if((ret =update_file(o,0, &rename->oid, rename->mode, dst_name)))1266;/* fall through, do allow dst_name to be released */1267else if(stage ==2)1268 ret =update_stages(o, rename->path, NULL, rename, add);1269else1270 ret =update_stages(o, rename->path, NULL, add, rename);12711272if(dst_name != rename->path)1273free(dst_name);12741275return ret;1276}12771278static intconflict_rename_rename_1to2(struct merge_options *o,1279struct rename_conflict_info *ci)1280{1281/* One file was renamed in both branches, but to different names. */1282struct diff_filespec *one = ci->pair1->one;1283struct diff_filespec *a = ci->pair1->two;1284struct diff_filespec *b = ci->pair2->two;12851286output(o,1,_("CONFLICT (rename/rename): "1287"Rename\"%s\"->\"%s\"in branch\"%s\""1288"rename\"%s\"->\"%s\"in\"%s\"%s"),1289 one->path, a->path, ci->branch1,1290 one->path, b->path, ci->branch2,1291 o->call_depth ?_(" (left unresolved)") :"");1292if(o->call_depth) {1293struct merge_file_info mfi;1294struct diff_filespec other;1295struct diff_filespec *add;1296if(merge_file_one(o, one->path,1297&one->oid, one->mode,1298&a->oid, a->mode,1299&b->oid, b->mode,1300 ci->branch1, ci->branch2, &mfi))1301return-1;13021303/*1304 * FIXME: For rename/add-source conflicts (if we could detect1305 * such), this is wrong. We should instead find a unique1306 * pathname and then either rename the add-source file to that1307 * unique path, or use that unique path instead of src here.1308 */1309if(update_file(o,0, &mfi.oid, mfi.mode, one->path))1310return-1;13111312/*1313 * Above, we put the merged content at the merge-base's1314 * path. Now we usually need to delete both a->path and1315 * b->path. However, the rename on each side of the merge1316 * could also be involved in a rename/add conflict. In1317 * such cases, we should keep the added file around,1318 * resolving the conflict at that path in its favor.1319 */1320 add =filespec_from_entry(&other, ci->dst_entry1,2^1);1321if(add) {1322if(update_file(o,0, &add->oid, add->mode, a->path))1323return-1;1324}1325else1326remove_file_from_cache(a->path);1327 add =filespec_from_entry(&other, ci->dst_entry2,3^1);1328if(add) {1329if(update_file(o,0, &add->oid, add->mode, b->path))1330return-1;1331}1332else1333remove_file_from_cache(b->path);1334}else if(handle_file(o, a,2, ci) ||handle_file(o, b,3, ci))1335return-1;13361337return0;1338}13391340static intconflict_rename_rename_2to1(struct merge_options *o,1341struct rename_conflict_info *ci)1342{1343/* Two files, a & b, were renamed to the same thing, c. */1344struct diff_filespec *a = ci->pair1->one;1345struct diff_filespec *b = ci->pair2->one;1346struct diff_filespec *c1 = ci->pair1->two;1347struct diff_filespec *c2 = ci->pair2->two;1348char*path = c1->path;/* == c2->path */1349struct merge_file_info mfi_c1;1350struct merge_file_info mfi_c2;1351int ret;13521353output(o,1,_("CONFLICT (rename/rename): "1354"Rename%s->%sin%s. "1355"Rename%s->%sin%s"),1356 a->path, c1->path, ci->branch1,1357 b->path, c2->path, ci->branch2);13581359remove_file(o,1, a->path, o->call_depth ||would_lose_untracked(a->path));1360remove_file(o,1, b->path, o->call_depth ||would_lose_untracked(b->path));13611362if(merge_file_special_markers(o, a, c1, &ci->ren1_other,1363 o->branch1, c1->path,1364 o->branch2, ci->ren1_other.path, &mfi_c1) ||1365merge_file_special_markers(o, b, &ci->ren2_other, c2,1366 o->branch1, ci->ren2_other.path,1367 o->branch2, c2->path, &mfi_c2))1368return-1;13691370if(o->call_depth) {1371/*1372 * If mfi_c1.clean && mfi_c2.clean, then it might make1373 * sense to do a two-way merge of those results. But, I1374 * think in all cases, it makes sense to have the virtual1375 * merge base just undo the renames; they can be detected1376 * again later for the non-recursive merge.1377 */1378remove_file(o,0, path,0);1379 ret =update_file(o,0, &mfi_c1.oid, mfi_c1.mode, a->path);1380if(!ret)1381 ret =update_file(o,0, &mfi_c2.oid, mfi_c2.mode,1382 b->path);1383}else{1384char*new_path1 =unique_path(o, path, ci->branch1);1385char*new_path2 =unique_path(o, path, ci->branch2);1386output(o,1,_("Renaming%sto%sand%sto%sinstead"),1387 a->path, new_path1, b->path, new_path2);1388remove_file(o,0, path,0);1389 ret =update_file(o,0, &mfi_c1.oid, mfi_c1.mode, new_path1);1390if(!ret)1391 ret =update_file(o,0, &mfi_c2.oid, mfi_c2.mode,1392 new_path2);1393free(new_path2);1394free(new_path1);1395}13961397return ret;1398}13991400/*1401 * Get the diff_filepairs changed between o_tree and tree.1402 */1403static struct diff_queue_struct *get_diffpairs(struct merge_options *o,1404struct tree *o_tree,1405struct tree *tree)1406{1407struct diff_queue_struct *ret;1408struct diff_options opts;14091410diff_setup(&opts);1411 opts.flags.recursive =1;1412 opts.flags.rename_empty =0;1413 opts.detect_rename = DIFF_DETECT_RENAME;1414 opts.rename_limit = o->merge_rename_limit >=0? o->merge_rename_limit :1415 o->diff_rename_limit >=0? o->diff_rename_limit :14161000;1417 opts.rename_score = o->rename_score;1418 opts.show_rename_progress = o->show_rename_progress;1419 opts.output_format = DIFF_FORMAT_NO_OUTPUT;1420diff_setup_done(&opts);1421diff_tree_oid(&o_tree->object.oid, &tree->object.oid,"", &opts);1422diffcore_std(&opts);1423if(opts.needed_rename_limit > o->needed_rename_limit)1424 o->needed_rename_limit = opts.needed_rename_limit;14251426 ret =xmalloc(sizeof(*ret));1427*ret = diff_queued_diff;14281429 opts.output_format = DIFF_FORMAT_NO_OUTPUT;1430 diff_queued_diff.nr =0;1431 diff_queued_diff.queue = NULL;1432diff_flush(&opts);1433return ret;1434}14351436static inttree_has_path(struct tree *tree,const char*path)1437{1438struct object_id hashy;1439unsigned int mode_o;14401441return!get_tree_entry(&tree->object.oid, path,1442&hashy, &mode_o);1443}14441445/*1446 * Return a new string that replaces the beginning portion (which matches1447 * entry->dir), with entry->new_dir. In perl-speak:1448 * new_path_name = (old_path =~ s/entry->dir/entry->new_dir/);1449 * NOTE:1450 * Caller must ensure that old_path starts with entry->dir + '/'.1451 */1452static char*apply_dir_rename(struct dir_rename_entry *entry,1453const char*old_path)1454{1455struct strbuf new_path = STRBUF_INIT;1456int oldlen, newlen;14571458if(entry->non_unique_new_dir)1459return NULL;14601461 oldlen =strlen(entry->dir);1462 newlen = entry->new_dir.len + (strlen(old_path) - oldlen) +1;1463strbuf_grow(&new_path, newlen);1464strbuf_addbuf(&new_path, &entry->new_dir);1465strbuf_addstr(&new_path, &old_path[oldlen]);14661467returnstrbuf_detach(&new_path, NULL);1468}14691470static voidget_renamed_dir_portion(const char*old_path,const char*new_path,1471char**old_dir,char**new_dir)1472{1473char*end_of_old, *end_of_new;1474int old_len, new_len;14751476*old_dir = NULL;1477*new_dir = NULL;14781479/*1480 * For1481 * "a/b/c/d/e/foo.c" -> "a/b/some/thing/else/e/foo.c"1482 * the "e/foo.c" part is the same, we just want to know that1483 * "a/b/c/d" was renamed to "a/b/some/thing/else"1484 * so, for this example, this function returns "a/b/c/d" in1485 * *old_dir and "a/b/some/thing/else" in *new_dir.1486 *1487 * Also, if the basename of the file changed, we don't care. We1488 * want to know which portion of the directory, if any, changed.1489 */1490 end_of_old =strrchr(old_path,'/');1491 end_of_new =strrchr(new_path,'/');14921493if(end_of_old == NULL || end_of_new == NULL)1494return;1495while(*--end_of_new == *--end_of_old &&1496 end_of_old != old_path &&1497 end_of_new != new_path)1498;/* Do nothing; all in the while loop */1499/*1500 * We've found the first non-matching character in the directory1501 * paths. That means the current directory we were comparing1502 * represents the rename. Move end_of_old and end_of_new back1503 * to the full directory name.1504 */1505if(*end_of_old =='/')1506 end_of_old++;1507if(*end_of_old !='/')1508 end_of_new++;1509 end_of_old =strchr(end_of_old,'/');1510 end_of_new =strchr(end_of_new,'/');15111512/*1513 * It may have been the case that old_path and new_path were the same1514 * directory all along. Don't claim a rename if they're the same.1515 */1516 old_len = end_of_old - old_path;1517 new_len = end_of_new - new_path;15181519if(old_len != new_len ||strncmp(old_path, new_path, old_len)) {1520*old_dir =xstrndup(old_path, old_len);1521*new_dir =xstrndup(new_path, new_len);1522}1523}15241525static voidremove_hashmap_entries(struct hashmap *dir_renames,1526struct string_list *items_to_remove)1527{1528int i;1529struct dir_rename_entry *entry;15301531for(i =0; i < items_to_remove->nr; i++) {1532 entry = items_to_remove->items[i].util;1533hashmap_remove(dir_renames, entry, NULL);1534}1535string_list_clear(items_to_remove,0);1536}15371538/*1539 * See if there is a directory rename for path, and if there are any file1540 * level conflicts for the renamed location. If there is a rename and1541 * there are no conflicts, return the new name. Otherwise, return NULL.1542 */1543static char*handle_path_level_conflicts(struct merge_options *o,1544const char*path,1545struct dir_rename_entry *entry,1546struct hashmap *collisions,1547struct tree *tree)1548{1549char*new_path = NULL;1550struct collision_entry *collision_ent;1551int clean =1;1552struct strbuf collision_paths = STRBUF_INIT;15531554/*1555 * entry has the mapping of old directory name to new directory name1556 * that we want to apply to path.1557 */1558 new_path =apply_dir_rename(entry, path);15591560if(!new_path) {1561/* This should only happen when entry->non_unique_new_dir set */1562if(!entry->non_unique_new_dir)1563BUG("entry->non_unqiue_dir not set and !new_path");1564output(o,1,_("CONFLICT (directory rename split): "1565"Unclear where to place%sbecause directory "1566"%swas renamed to multiple other directories, "1567"with no destination getting a majority of the "1568"files."),1569 path, entry->dir);1570 clean =0;1571return NULL;1572}15731574/*1575 * The caller needs to have ensured that it has pre-populated1576 * collisions with all paths that map to new_path. Do a quick check1577 * to ensure that's the case.1578 */1579 collision_ent =collision_find_entry(collisions, new_path);1580if(collision_ent == NULL)1581BUG("collision_ent is NULL");15821583/*1584 * Check for one-sided add/add/.../add conflicts, i.e.1585 * where implicit renames from the other side doing1586 * directory rename(s) can affect this side of history1587 * to put multiple paths into the same location. Warn1588 * and bail on directory renames for such paths.1589 */1590if(collision_ent->reported_already) {1591 clean =0;1592}else if(tree_has_path(tree, new_path)) {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): Existing "1597"file/dir at%sin the way of implicit "1598"directory rename(s) putting the following "1599"path(s) there:%s."),1600 new_path, collision_paths.buf);1601 clean =0;1602}else if(collision_ent->source_files.nr >1) {1603 collision_ent->reported_already =1;1604strbuf_add_separated_string_list(&collision_paths,", ",1605&collision_ent->source_files);1606output(o,1,_("CONFLICT (implicit dir rename): Cannot map "1607"more than one path to%s; implicit directory "1608"renames tried to put these paths there:%s"),1609 new_path, collision_paths.buf);1610 clean =0;1611}16121613/* Free memory we no longer need */1614strbuf_release(&collision_paths);1615if(!clean && new_path) {1616free(new_path);1617return NULL;1618}16191620return new_path;1621}16221623/*1624 * There are a couple things we want to do at the directory level:1625 * 1. Check for both sides renaming to the same thing, in order to avoid1626 * implicit renaming of files that should be left in place. (See1627 * testcase 6b in t6043 for details.)1628 * 2. Prune directory renames if there are still files left in the1629 * the original directory. These represent a partial directory rename,1630 * i.e. a rename where only some of the files within the directory1631 * were renamed elsewhere. (Technically, this could be done earlier1632 * in get_directory_renames(), except that would prevent us from1633 * doing the previous check and thus failing testcase 6b.)1634 * 3. Check for rename/rename(1to2) conflicts (at the directory level).1635 * In the future, we could potentially record this info as well and1636 * omit reporting rename/rename(1to2) conflicts for each path within1637 * the affected directories, thus cleaning up the merge output.1638 * NOTE: We do NOT check for rename/rename(2to1) conflicts at the1639 * directory level, because merging directories is fine. If it1640 * causes conflicts for files within those merged directories, then1641 * that should be detected at the individual path level.1642 */1643static voidhandle_directory_level_conflicts(struct merge_options *o,1644struct hashmap *dir_re_head,1645struct tree *head,1646struct hashmap *dir_re_merge,1647struct tree *merge)1648{1649struct hashmap_iter iter;1650struct dir_rename_entry *head_ent;1651struct dir_rename_entry *merge_ent;16521653struct string_list remove_from_head = STRING_LIST_INIT_NODUP;1654struct string_list remove_from_merge = STRING_LIST_INIT_NODUP;16551656hashmap_iter_init(dir_re_head, &iter);1657while((head_ent =hashmap_iter_next(&iter))) {1658 merge_ent =dir_rename_find_entry(dir_re_merge, head_ent->dir);1659if(merge_ent &&1660!head_ent->non_unique_new_dir &&1661!merge_ent->non_unique_new_dir &&1662!strbuf_cmp(&head_ent->new_dir, &merge_ent->new_dir)) {1663/* 1. Renamed identically; remove it from both sides */1664string_list_append(&remove_from_head,1665 head_ent->dir)->util = head_ent;1666strbuf_release(&head_ent->new_dir);1667string_list_append(&remove_from_merge,1668 merge_ent->dir)->util = merge_ent;1669strbuf_release(&merge_ent->new_dir);1670}else if(tree_has_path(head, head_ent->dir)) {1671/* 2. This wasn't a directory rename after all */1672string_list_append(&remove_from_head,1673 head_ent->dir)->util = head_ent;1674strbuf_release(&head_ent->new_dir);1675}1676}16771678remove_hashmap_entries(dir_re_head, &remove_from_head);1679remove_hashmap_entries(dir_re_merge, &remove_from_merge);16801681hashmap_iter_init(dir_re_merge, &iter);1682while((merge_ent =hashmap_iter_next(&iter))) {1683 head_ent =dir_rename_find_entry(dir_re_head, merge_ent->dir);1684if(tree_has_path(merge, merge_ent->dir)) {1685/* 2. This wasn't a directory rename after all */1686string_list_append(&remove_from_merge,1687 merge_ent->dir)->util = merge_ent;1688}else if(head_ent &&1689!head_ent->non_unique_new_dir &&1690!merge_ent->non_unique_new_dir) {1691/* 3. rename/rename(1to2) */1692/*1693 * We can assume it's not rename/rename(1to1) because1694 * that was case (1), already checked above. So we1695 * know that head_ent->new_dir and merge_ent->new_dir1696 * are different strings.1697 */1698output(o,1,_("CONFLICT (rename/rename): "1699"Rename directory%s->%sin%s. "1700"Rename directory%s->%sin%s"),1701 head_ent->dir, head_ent->new_dir.buf, o->branch1,1702 head_ent->dir, merge_ent->new_dir.buf, o->branch2);1703string_list_append(&remove_from_head,1704 head_ent->dir)->util = head_ent;1705strbuf_release(&head_ent->new_dir);1706string_list_append(&remove_from_merge,1707 merge_ent->dir)->util = merge_ent;1708strbuf_release(&merge_ent->new_dir);1709}1710}17111712remove_hashmap_entries(dir_re_head, &remove_from_head);1713remove_hashmap_entries(dir_re_merge, &remove_from_merge);1714}17151716static struct hashmap *get_directory_renames(struct diff_queue_struct *pairs,1717struct tree *tree)1718{1719struct hashmap *dir_renames;1720struct hashmap_iter iter;1721struct dir_rename_entry *entry;1722int i;17231724/*1725 * Typically, we think of a directory rename as all files from a1726 * certain directory being moved to a target directory. However,1727 * what if someone first moved two files from the original1728 * directory in one commit, and then renamed the directory1729 * somewhere else in a later commit? At merge time, we just know1730 * that files from the original directory went to two different1731 * places, and that the bulk of them ended up in the same place.1732 * We want each directory rename to represent where the bulk of the1733 * files from that directory end up; this function exists to find1734 * where the bulk of the files went.1735 *1736 * The first loop below simply iterates through the list of file1737 * renames, finding out how often each directory rename pair1738 * possibility occurs.1739 */1740 dir_renames =xmalloc(sizeof(*dir_renames));1741dir_rename_init(dir_renames);1742for(i =0; i < pairs->nr; ++i) {1743struct string_list_item *item;1744int*count;1745struct diff_filepair *pair = pairs->queue[i];1746char*old_dir, *new_dir;17471748/* File not part of directory rename if it wasn't renamed */1749if(pair->status !='R')1750continue;17511752get_renamed_dir_portion(pair->one->path, pair->two->path,1753&old_dir, &new_dir);1754if(!old_dir)1755/* Directory didn't change at all; ignore this one. */1756continue;17571758 entry =dir_rename_find_entry(dir_renames, old_dir);1759if(!entry) {1760 entry =xmalloc(sizeof(*entry));1761dir_rename_entry_init(entry, old_dir);1762hashmap_put(dir_renames, entry);1763}else{1764free(old_dir);1765}1766 item =string_list_lookup(&entry->possible_new_dirs, new_dir);1767if(!item) {1768 item =string_list_insert(&entry->possible_new_dirs,1769 new_dir);1770 item->util =xcalloc(1,sizeof(int));1771}else{1772free(new_dir);1773}1774 count = item->util;1775*count +=1;1776}17771778/*1779 * For each directory with files moved out of it, we find out which1780 * target directory received the most files so we can declare it to1781 * be the "winning" target location for the directory rename. This1782 * winner gets recorded in new_dir. If there is no winner1783 * (multiple target directories received the same number of files),1784 * we set non_unique_new_dir. Once we've determined the winner (or1785 * that there is no winner), we no longer need possible_new_dirs.1786 */1787hashmap_iter_init(dir_renames, &iter);1788while((entry =hashmap_iter_next(&iter))) {1789int max =0;1790int bad_max =0;1791char*best = NULL;17921793for(i =0; i < entry->possible_new_dirs.nr; i++) {1794int*count = entry->possible_new_dirs.items[i].util;17951796if(*count == max)1797 bad_max = max;1798else if(*count > max) {1799 max = *count;1800 best = entry->possible_new_dirs.items[i].string;1801}1802}1803if(bad_max == max)1804 entry->non_unique_new_dir =1;1805else{1806assert(entry->new_dir.len ==0);1807strbuf_addstr(&entry->new_dir, best);1808}1809/*1810 * The relevant directory sub-portion of the original full1811 * filepaths were xstrndup'ed before inserting into1812 * possible_new_dirs, and instead of manually iterating the1813 * list and free'ing each, just lie and tell1814 * possible_new_dirs that it did the strdup'ing so that it1815 * will free them for us.1816 */1817 entry->possible_new_dirs.strdup_strings =1;1818string_list_clear(&entry->possible_new_dirs,1);1819}18201821return dir_renames;1822}18231824static struct dir_rename_entry *check_dir_renamed(const char*path,1825struct hashmap *dir_renames)1826{1827char temp[PATH_MAX];1828char*end;1829struct dir_rename_entry *entry;18301831strcpy(temp, path);1832while((end =strrchr(temp,'/'))) {1833*end ='\0';1834 entry =dir_rename_find_entry(dir_renames, temp);1835if(entry)1836return entry;1837}1838return NULL;1839}18401841static voidcompute_collisions(struct hashmap *collisions,1842struct hashmap *dir_renames,1843struct diff_queue_struct *pairs)1844{1845int i;18461847/*1848 * Multiple files can be mapped to the same path due to directory1849 * renames done by the other side of history. Since that other1850 * side of history could have merged multiple directories into one,1851 * if our side of history added the same file basename to each of1852 * those directories, then all N of them would get implicitly1853 * renamed by the directory rename detection into the same path,1854 * and we'd get an add/add/.../add conflict, and all those adds1855 * from *this* side of history. This is not representable in the1856 * index, and users aren't going to easily be able to make sense of1857 * it. So we need to provide a good warning about what's1858 * happening, and fall back to no-directory-rename detection1859 * behavior for those paths.1860 *1861 * See testcases 9e and all of section 5 from t6043 for examples.1862 */1863collision_init(collisions);18641865for(i =0; i < pairs->nr; ++i) {1866struct dir_rename_entry *dir_rename_ent;1867struct collision_entry *collision_ent;1868char*new_path;1869struct diff_filepair *pair = pairs->queue[i];18701871if(pair->status =='D')1872continue;1873 dir_rename_ent =check_dir_renamed(pair->two->path,1874 dir_renames);1875if(!dir_rename_ent)1876continue;18771878 new_path =apply_dir_rename(dir_rename_ent, pair->two->path);1879if(!new_path)1880/*1881 * dir_rename_ent->non_unique_new_path is true, which1882 * means there is no directory rename for us to use,1883 * which means it won't cause us any additional1884 * collisions.1885 */1886continue;1887 collision_ent =collision_find_entry(collisions, new_path);1888if(!collision_ent) {1889 collision_ent =xcalloc(1,1890sizeof(struct collision_entry));1891hashmap_entry_init(collision_ent,strhash(new_path));1892hashmap_put(collisions, collision_ent);1893 collision_ent->target_file = new_path;1894}else{1895free(new_path);1896}1897string_list_insert(&collision_ent->source_files,1898 pair->two->path);1899}1900}19011902static char*check_for_directory_rename(struct merge_options *o,1903const char*path,1904struct tree *tree,1905struct hashmap *dir_renames,1906struct hashmap *dir_rename_exclusions,1907struct hashmap *collisions,1908int*clean_merge)1909{1910char*new_path = NULL;1911struct dir_rename_entry *entry =check_dir_renamed(path, dir_renames);1912struct dir_rename_entry *oentry = NULL;19131914if(!entry)1915return new_path;19161917/*1918 * This next part is a little weird. We do not want to do an1919 * implicit rename into a directory we renamed on our side, because1920 * that will result in a spurious rename/rename(1to2) conflict. An1921 * example:1922 * Base commit: dumbdir/afile, otherdir/bfile1923 * Side 1: smrtdir/afile, otherdir/bfile1924 * Side 2: dumbdir/afile, dumbdir/bfile1925 * Here, while working on Side 1, we could notice that otherdir was1926 * renamed/merged to dumbdir, and change the diff_filepair for1927 * otherdir/bfile into a rename into dumbdir/bfile. However, Side1928 * 2 will notice the rename from dumbdir to smrtdir, and do the1929 * transitive rename to move it from dumbdir/bfile to1930 * smrtdir/bfile. That gives us bfile in dumbdir vs being in1931 * smrtdir, a rename/rename(1to2) conflict. We really just want1932 * the file to end up in smrtdir. And the way to achieve that is1933 * to not let Side1 do the rename to dumbdir, since we know that is1934 * the source of one of our directory renames.1935 *1936 * That's why oentry and dir_rename_exclusions is here.1937 *1938 * As it turns out, this also prevents N-way transient rename1939 * confusion; See testcases 9c and 9d of t6043.1940 */1941 oentry =dir_rename_find_entry(dir_rename_exclusions, entry->new_dir.buf);1942if(oentry) {1943output(o,1,_("WARNING: Avoiding applying%s->%srename "1944"to%s, because%sitself was renamed."),1945 entry->dir, entry->new_dir.buf, path, entry->new_dir.buf);1946}else{1947 new_path =handle_path_level_conflicts(o, path, entry,1948 collisions, tree);1949*clean_merge &= (new_path != NULL);1950}19511952return new_path;1953}19541955/*1956 * Get information of all renames which occurred in 'pairs', making use of1957 * any implicit directory renames inferred from the other side of history.1958 * We need the three trees in the merge ('o_tree', 'a_tree' and 'b_tree')1959 * to be able to associate the correct cache entries with the rename1960 * information; tree is always equal to either a_tree or b_tree.1961 */1962static struct string_list *get_renames(struct merge_options *o,1963struct diff_queue_struct *pairs,1964struct hashmap *dir_renames,1965struct hashmap *dir_rename_exclusions,1966struct tree *tree,1967struct tree *o_tree,1968struct tree *a_tree,1969struct tree *b_tree,1970struct string_list *entries,1971int*clean_merge)1972{1973int i;1974struct hashmap collisions;1975struct hashmap_iter iter;1976struct collision_entry *e;1977struct string_list *renames;19781979compute_collisions(&collisions, dir_renames, pairs);1980 renames =xcalloc(1,sizeof(struct string_list));19811982for(i =0; i < pairs->nr; ++i) {1983struct string_list_item *item;1984struct rename *re;1985struct diff_filepair *pair = pairs->queue[i];1986char*new_path;/* non-NULL only with directory renames */19871988if(pair->status =='D') {1989diff_free_filepair(pair);1990continue;1991}1992 new_path =check_for_directory_rename(o, pair->two->path, tree,1993 dir_renames,1994 dir_rename_exclusions,1995&collisions,1996 clean_merge);1997if(pair->status !='R'&& !new_path) {1998diff_free_filepair(pair);1999continue;2000}20012002 re =xmalloc(sizeof(*re));2003 re->processed =0;2004 re->pair = pair;2005 item =string_list_lookup(entries, re->pair->one->path);2006if(!item)2007 re->src_entry =insert_stage_data(re->pair->one->path,2008 o_tree, a_tree, b_tree, entries);2009else2010 re->src_entry = item->util;20112012 item =string_list_lookup(entries, re->pair->two->path);2013if(!item)2014 re->dst_entry =insert_stage_data(re->pair->two->path,2015 o_tree, a_tree, b_tree, entries);2016else2017 re->dst_entry = item->util;2018 item =string_list_insert(renames, pair->one->path);2019 item->util = re;2020}20212022hashmap_iter_init(&collisions, &iter);2023while((e =hashmap_iter_next(&iter))) {2024free(e->target_file);2025string_list_clear(&e->source_files,0);2026}2027hashmap_free(&collisions,1);2028return renames;2029}20302031static intprocess_renames(struct merge_options *o,2032struct string_list *a_renames,2033struct string_list *b_renames)2034{2035int clean_merge =1, i, j;2036struct string_list a_by_dst = STRING_LIST_INIT_NODUP;2037struct string_list b_by_dst = STRING_LIST_INIT_NODUP;2038const struct rename *sre;20392040for(i =0; i < a_renames->nr; i++) {2041 sre = a_renames->items[i].util;2042string_list_insert(&a_by_dst, sre->pair->two->path)->util2043= (void*)sre;2044}2045for(i =0; i < b_renames->nr; i++) {2046 sre = b_renames->items[i].util;2047string_list_insert(&b_by_dst, sre->pair->two->path)->util2048= (void*)sre;2049}20502051for(i =0, j =0; i < a_renames->nr || j < b_renames->nr;) {2052struct string_list *renames1, *renames2Dst;2053struct rename *ren1 = NULL, *ren2 = NULL;2054const char*branch1, *branch2;2055const char*ren1_src, *ren1_dst;2056struct string_list_item *lookup;20572058if(i >= a_renames->nr) {2059 ren2 = b_renames->items[j++].util;2060}else if(j >= b_renames->nr) {2061 ren1 = a_renames->items[i++].util;2062}else{2063int compare =strcmp(a_renames->items[i].string,2064 b_renames->items[j].string);2065if(compare <=0)2066 ren1 = a_renames->items[i++].util;2067if(compare >=0)2068 ren2 = b_renames->items[j++].util;2069}20702071/* TODO: refactor, so that 1/2 are not needed */2072if(ren1) {2073 renames1 = a_renames;2074 renames2Dst = &b_by_dst;2075 branch1 = o->branch1;2076 branch2 = o->branch2;2077}else{2078 renames1 = b_renames;2079 renames2Dst = &a_by_dst;2080 branch1 = o->branch2;2081 branch2 = o->branch1;2082SWAP(ren2, ren1);2083}20842085if(ren1->processed)2086continue;2087 ren1->processed =1;2088 ren1->dst_entry->processed =1;2089/* BUG: We should only mark src_entry as processed if we2090 * are not dealing with a rename + add-source case.2091 */2092 ren1->src_entry->processed =1;20932094 ren1_src = ren1->pair->one->path;2095 ren1_dst = ren1->pair->two->path;20962097if(ren2) {2098/* One file renamed on both sides */2099const char*ren2_src = ren2->pair->one->path;2100const char*ren2_dst = ren2->pair->two->path;2101enum rename_type rename_type;2102if(strcmp(ren1_src, ren2_src) !=0)2103die("BUG: ren1_src != ren2_src");2104 ren2->dst_entry->processed =1;2105 ren2->processed =1;2106if(strcmp(ren1_dst, ren2_dst) !=0) {2107 rename_type = RENAME_ONE_FILE_TO_TWO;2108 clean_merge =0;2109}else{2110 rename_type = RENAME_ONE_FILE_TO_ONE;2111/* BUG: We should only remove ren1_src in2112 * the base stage (think of rename +2113 * add-source cases).2114 */2115remove_file(o,1, ren1_src,1);2116update_entry(ren1->dst_entry,2117 ren1->pair->one,2118 ren1->pair->two,2119 ren2->pair->two);2120}2121setup_rename_conflict_info(rename_type,2122 ren1->pair,2123 ren2->pair,2124 branch1,2125 branch2,2126 ren1->dst_entry,2127 ren2->dst_entry,2128 o,2129 NULL,2130 NULL);2131}else if((lookup =string_list_lookup(renames2Dst, ren1_dst))) {2132/* Two different files renamed to the same thing */2133char*ren2_dst;2134 ren2 = lookup->util;2135 ren2_dst = ren2->pair->two->path;2136if(strcmp(ren1_dst, ren2_dst) !=0)2137die("BUG: ren1_dst != ren2_dst");21382139 clean_merge =0;2140 ren2->processed =1;2141/*2142 * BUG: We should only mark src_entry as processed2143 * if we are not dealing with a rename + add-source2144 * case.2145 */2146 ren2->src_entry->processed =1;21472148setup_rename_conflict_info(RENAME_TWO_FILES_TO_ONE,2149 ren1->pair,2150 ren2->pair,2151 branch1,2152 branch2,2153 ren1->dst_entry,2154 ren2->dst_entry,2155 o,2156 ren1->src_entry,2157 ren2->src_entry);21582159}else{2160/* Renamed in 1, maybe changed in 2 */2161/* we only use sha1 and mode of these */2162struct diff_filespec src_other, dst_other;2163int try_merge;21642165/*2166 * unpack_trees loads entries from common-commit2167 * into stage 1, from head-commit into stage 2, and2168 * from merge-commit into stage 3. We keep track2169 * of which side corresponds to the rename.2170 */2171int renamed_stage = a_renames == renames1 ?2:3;2172int other_stage = a_renames == renames1 ?3:2;21732174/* BUG: We should only remove ren1_src in the base2175 * stage and in other_stage (think of rename +2176 * add-source case).2177 */2178remove_file(o,1, ren1_src,2179 renamed_stage ==2|| !was_tracked(ren1_src));21802181oidcpy(&src_other.oid,2182&ren1->src_entry->stages[other_stage].oid);2183 src_other.mode = ren1->src_entry->stages[other_stage].mode;2184oidcpy(&dst_other.oid,2185&ren1->dst_entry->stages[other_stage].oid);2186 dst_other.mode = ren1->dst_entry->stages[other_stage].mode;2187 try_merge =0;21882189if(oid_eq(&src_other.oid, &null_oid)) {2190setup_rename_conflict_info(RENAME_DELETE,2191 ren1->pair,2192 NULL,2193 branch1,2194 branch2,2195 ren1->dst_entry,2196 NULL,2197 o,2198 NULL,2199 NULL);2200}else if((dst_other.mode == ren1->pair->two->mode) &&2201oid_eq(&dst_other.oid, &ren1->pair->two->oid)) {2202/*2203 * Added file on the other side identical to2204 * the file being renamed: clean merge.2205 * Also, there is no need to overwrite the2206 * file already in the working copy, so call2207 * update_file_flags() instead of2208 * update_file().2209 */2210if(update_file_flags(o,2211&ren1->pair->two->oid,2212 ren1->pair->two->mode,2213 ren1_dst,22141,/* update_cache */22150/* update_wd */))2216 clean_merge = -1;2217}else if(!oid_eq(&dst_other.oid, &null_oid)) {2218 clean_merge =0;2219 try_merge =1;2220output(o,1,_("CONFLICT (rename/add): Rename%s->%sin%s. "2221"%sadded in%s"),2222 ren1_src, ren1_dst, branch1,2223 ren1_dst, branch2);2224if(o->call_depth) {2225struct merge_file_info mfi;2226if(merge_file_one(o, ren1_dst, &null_oid,0,2227&ren1->pair->two->oid,2228 ren1->pair->two->mode,2229&dst_other.oid,2230 dst_other.mode,2231 branch1, branch2, &mfi)) {2232 clean_merge = -1;2233goto cleanup_and_return;2234}2235output(o,1,_("Adding merged%s"), ren1_dst);2236if(update_file(o,0, &mfi.oid,2237 mfi.mode, ren1_dst))2238 clean_merge = -1;2239 try_merge =0;2240}else{2241char*new_path =unique_path(o, ren1_dst, branch2);2242output(o,1,_("Adding as%sinstead"), new_path);2243if(update_file(o,0, &dst_other.oid,2244 dst_other.mode, new_path))2245 clean_merge = -1;2246free(new_path);2247}2248}else2249 try_merge =1;22502251if(clean_merge <0)2252goto cleanup_and_return;2253if(try_merge) {2254struct diff_filespec *one, *a, *b;2255 src_other.path = (char*)ren1_src;22562257 one = ren1->pair->one;2258if(a_renames == renames1) {2259 a = ren1->pair->two;2260 b = &src_other;2261}else{2262 b = ren1->pair->two;2263 a = &src_other;2264}2265update_entry(ren1->dst_entry, one, a, b);2266setup_rename_conflict_info(RENAME_NORMAL,2267 ren1->pair,2268 NULL,2269 branch1,2270 NULL,2271 ren1->dst_entry,2272 NULL,2273 o,2274 NULL,2275 NULL);2276}2277}2278}2279cleanup_and_return:2280string_list_clear(&a_by_dst,0);2281string_list_clear(&b_by_dst,0);22822283return clean_merge;2284}22852286struct rename_info {2287struct string_list *head_renames;2288struct string_list *merge_renames;2289};22902291static voidinitial_cleanup_rename(struct diff_queue_struct *pairs,2292struct hashmap *dir_renames)2293{2294struct hashmap_iter iter;2295struct dir_rename_entry *e;22962297hashmap_iter_init(dir_renames, &iter);2298while((e =hashmap_iter_next(&iter))) {2299free(e->dir);2300strbuf_release(&e->new_dir);2301/* possible_new_dirs already cleared in get_directory_renames */2302}2303hashmap_free(dir_renames,1);2304free(dir_renames);23052306free(pairs->queue);2307free(pairs);2308}23092310static inthandle_renames(struct merge_options *o,2311struct tree *common,2312struct tree *head,2313struct tree *merge,2314struct string_list *entries,2315struct rename_info *ri)2316{2317struct diff_queue_struct *head_pairs, *merge_pairs;2318struct hashmap *dir_re_head, *dir_re_merge;2319int clean =1;23202321 ri->head_renames = NULL;2322 ri->merge_renames = NULL;23232324if(!o->detect_rename)2325return1;23262327 head_pairs =get_diffpairs(o, common, head);2328 merge_pairs =get_diffpairs(o, common, merge);23292330 dir_re_head =get_directory_renames(head_pairs, head);2331 dir_re_merge =get_directory_renames(merge_pairs, merge);23322333handle_directory_level_conflicts(o,2334 dir_re_head, head,2335 dir_re_merge, merge);23362337 ri->head_renames =get_renames(o, head_pairs,2338 dir_re_merge, dir_re_head, head,2339 common, head, merge, entries,2340&clean);2341if(clean <0)2342goto cleanup;2343 ri->merge_renames =get_renames(o, merge_pairs,2344 dir_re_head, dir_re_merge, merge,2345 common, head, merge, entries,2346&clean);2347if(clean <0)2348goto cleanup;2349 clean &=process_renames(o, ri->head_renames, ri->merge_renames);23502351cleanup:2352/*2353 * Some cleanup is deferred until cleanup_renames() because the2354 * data structures are still needed and referenced in2355 * process_entry(). But there are a few things we can free now.2356 */2357initial_cleanup_rename(head_pairs, dir_re_head);2358initial_cleanup_rename(merge_pairs, dir_re_merge);23592360return clean;2361}23622363static voidfinal_cleanup_rename(struct string_list *rename)2364{2365const struct rename *re;2366int i;23672368if(rename == NULL)2369return;23702371for(i =0; i < rename->nr; i++) {2372 re = rename->items[i].util;2373diff_free_filepair(re->pair);2374}2375string_list_clear(rename,1);2376free(rename);2377}23782379static voidfinal_cleanup_renames(struct rename_info *re_info)2380{2381final_cleanup_rename(re_info->head_renames);2382final_cleanup_rename(re_info->merge_renames);2383}23842385static struct object_id *stage_oid(const struct object_id *oid,unsigned mode)2386{2387return(is_null_oid(oid) || mode ==0) ? NULL: (struct object_id *)oid;2388}23892390static intread_oid_strbuf(struct merge_options *o,2391const struct object_id *oid,struct strbuf *dst)2392{2393void*buf;2394enum object_type type;2395unsigned long size;2396 buf =read_object_file(oid, &type, &size);2397if(!buf)2398returnerr(o,_("cannot read object%s"),oid_to_hex(oid));2399if(type != OBJ_BLOB) {2400free(buf);2401returnerr(o,_("object%sis not a blob"),oid_to_hex(oid));2402}2403strbuf_attach(dst, buf, size, size +1);2404return0;2405}24062407static intblob_unchanged(struct merge_options *opt,2408const struct object_id *o_oid,2409unsigned o_mode,2410const struct object_id *a_oid,2411unsigned a_mode,2412int renormalize,const char*path)2413{2414struct strbuf o = STRBUF_INIT;2415struct strbuf a = STRBUF_INIT;2416int ret =0;/* assume changed for safety */24172418if(a_mode != o_mode)2419return0;2420if(oid_eq(o_oid, a_oid))2421return1;2422if(!renormalize)2423return0;24242425assert(o_oid && a_oid);2426if(read_oid_strbuf(opt, o_oid, &o) ||read_oid_strbuf(opt, a_oid, &a))2427goto error_return;2428/*2429 * Note: binary | is used so that both renormalizations are2430 * performed. Comparison can be skipped if both files are2431 * unchanged since their sha1s have already been compared.2432 */2433if(renormalize_buffer(&the_index, path, o.buf, o.len, &o) |2434renormalize_buffer(&the_index, path, a.buf, a.len, &a))2435 ret = (o.len == a.len && !memcmp(o.buf, a.buf, o.len));24362437error_return:2438strbuf_release(&o);2439strbuf_release(&a);2440return ret;2441}24422443static inthandle_modify_delete(struct merge_options *o,2444const char*path,2445struct object_id *o_oid,int o_mode,2446struct object_id *a_oid,int a_mode,2447struct object_id *b_oid,int b_mode)2448{2449const char*modify_branch, *delete_branch;2450struct object_id *changed_oid;2451int changed_mode;24522453if(a_oid) {2454 modify_branch = o->branch1;2455 delete_branch = o->branch2;2456 changed_oid = a_oid;2457 changed_mode = a_mode;2458}else{2459 modify_branch = o->branch2;2460 delete_branch = o->branch1;2461 changed_oid = b_oid;2462 changed_mode = b_mode;2463}24642465returnhandle_change_delete(o,2466 path, NULL,2467 o_oid, o_mode,2468 changed_oid, changed_mode,2469 modify_branch, delete_branch,2470_("modify"),_("modified"));2471}24722473static intmerge_content(struct merge_options *o,2474const char*path,2475struct object_id *o_oid,int o_mode,2476struct object_id *a_oid,int a_mode,2477struct object_id *b_oid,int b_mode,2478struct rename_conflict_info *rename_conflict_info)2479{2480const char*reason =_("content");2481const char*path1 = NULL, *path2 = NULL;2482struct merge_file_info mfi;2483struct diff_filespec one, a, b;2484unsigned df_conflict_remains =0;24852486if(!o_oid) {2487 reason =_("add/add");2488 o_oid = (struct object_id *)&null_oid;2489}2490 one.path = a.path = b.path = (char*)path;2491oidcpy(&one.oid, o_oid);2492 one.mode = o_mode;2493oidcpy(&a.oid, a_oid);2494 a.mode = a_mode;2495oidcpy(&b.oid, b_oid);2496 b.mode = b_mode;24972498if(rename_conflict_info) {2499struct diff_filepair *pair1 = rename_conflict_info->pair1;25002501 path1 = (o->branch1 == rename_conflict_info->branch1) ?2502 pair1->two->path : pair1->one->path;2503/* If rename_conflict_info->pair2 != NULL, we are in2504 * RENAME_ONE_FILE_TO_ONE case. Otherwise, we have a2505 * normal rename.2506 */2507 path2 = (rename_conflict_info->pair2 ||2508 o->branch2 == rename_conflict_info->branch1) ?2509 pair1->two->path : pair1->one->path;25102511if(dir_in_way(path, !o->call_depth,2512S_ISGITLINK(pair1->two->mode)))2513 df_conflict_remains =1;2514}2515if(merge_file_special_markers(o, &one, &a, &b,2516 o->branch1, path1,2517 o->branch2, path2, &mfi))2518return-1;25192520if(mfi.clean && !df_conflict_remains &&2521oid_eq(&mfi.oid, a_oid) && mfi.mode == a_mode) {2522int path_renamed_outside_HEAD;2523output(o,3,_("Skipped%s(merged same as existing)"), path);2524/*2525 * The content merge resulted in the same file contents we2526 * already had. We can return early if those file contents2527 * are recorded at the correct path (which may not be true2528 * if the merge involves a rename).2529 */2530 path_renamed_outside_HEAD = !path2 || !strcmp(path, path2);2531if(!path_renamed_outside_HEAD) {2532add_cacheinfo(o, mfi.mode, &mfi.oid, path,25330, (!o->call_depth),0);2534return mfi.clean;2535}2536}else2537output(o,2,_("Auto-merging%s"), path);25382539if(!mfi.clean) {2540if(S_ISGITLINK(mfi.mode))2541 reason =_("submodule");2542output(o,1,_("CONFLICT (%s): Merge conflict in%s"),2543 reason, path);2544if(rename_conflict_info && !df_conflict_remains)2545if(update_stages(o, path, &one, &a, &b))2546return-1;2547}25482549if(df_conflict_remains) {2550char*new_path;2551if(o->call_depth) {2552remove_file_from_cache(path);2553}else{2554if(!mfi.clean) {2555if(update_stages(o, path, &one, &a, &b))2556return-1;2557}else{2558int file_from_stage2 =was_tracked(path);2559struct diff_filespec merged;2560oidcpy(&merged.oid, &mfi.oid);2561 merged.mode = mfi.mode;25622563if(update_stages(o, path, NULL,2564 file_from_stage2 ? &merged : NULL,2565 file_from_stage2 ? NULL : &merged))2566return-1;2567}25682569}2570 new_path =unique_path(o, path, rename_conflict_info->branch1);2571output(o,1,_("Adding as%sinstead"), new_path);2572if(update_file(o,0, &mfi.oid, mfi.mode, new_path)) {2573free(new_path);2574return-1;2575}2576free(new_path);2577 mfi.clean =0;2578}else if(update_file(o, mfi.clean, &mfi.oid, mfi.mode, path))2579return-1;2580return mfi.clean;2581}25822583/* Per entry merge function */2584static intprocess_entry(struct merge_options *o,2585const char*path,struct stage_data *entry)2586{2587int clean_merge =1;2588int normalize = o->renormalize;2589unsigned o_mode = entry->stages[1].mode;2590unsigned a_mode = entry->stages[2].mode;2591unsigned b_mode = entry->stages[3].mode;2592struct object_id *o_oid =stage_oid(&entry->stages[1].oid, o_mode);2593struct object_id *a_oid =stage_oid(&entry->stages[2].oid, a_mode);2594struct object_id *b_oid =stage_oid(&entry->stages[3].oid, b_mode);25952596 entry->processed =1;2597if(entry->rename_conflict_info) {2598struct rename_conflict_info *conflict_info = entry->rename_conflict_info;2599switch(conflict_info->rename_type) {2600case RENAME_NORMAL:2601case RENAME_ONE_FILE_TO_ONE:2602 clean_merge =merge_content(o, path,2603 o_oid, o_mode, a_oid, a_mode, b_oid, b_mode,2604 conflict_info);2605break;2606case RENAME_DELETE:2607 clean_merge =0;2608if(conflict_rename_delete(o,2609 conflict_info->pair1,2610 conflict_info->branch1,2611 conflict_info->branch2))2612 clean_merge = -1;2613break;2614case RENAME_ONE_FILE_TO_TWO:2615 clean_merge =0;2616if(conflict_rename_rename_1to2(o, conflict_info))2617 clean_merge = -1;2618break;2619case RENAME_TWO_FILES_TO_ONE:2620 clean_merge =0;2621if(conflict_rename_rename_2to1(o, conflict_info))2622 clean_merge = -1;2623break;2624default:2625 entry->processed =0;2626break;2627}2628}else if(o_oid && (!a_oid || !b_oid)) {2629/* Case A: Deleted in one */2630if((!a_oid && !b_oid) ||2631(!b_oid &&blob_unchanged(o, o_oid, o_mode, a_oid, a_mode, normalize, path)) ||2632(!a_oid &&blob_unchanged(o, o_oid, o_mode, b_oid, b_mode, normalize, path))) {2633/* Deleted in both or deleted in one and2634 * unchanged in the other */2635if(a_oid)2636output(o,2,_("Removing%s"), path);2637/* do not touch working file if it did not exist */2638remove_file(o,1, path, !a_oid);2639}else{2640/* Modify/delete; deleted side may have put a directory in the way */2641 clean_merge =0;2642if(handle_modify_delete(o, path, o_oid, o_mode,2643 a_oid, a_mode, b_oid, b_mode))2644 clean_merge = -1;2645}2646}else if((!o_oid && a_oid && !b_oid) ||2647(!o_oid && !a_oid && b_oid)) {2648/* Case B: Added in one. */2649/* [nothing|directory] -> ([nothing|directory], file) */26502651const char*add_branch;2652const char*other_branch;2653unsigned mode;2654const struct object_id *oid;2655const char*conf;26562657if(a_oid) {2658 add_branch = o->branch1;2659 other_branch = o->branch2;2660 mode = a_mode;2661 oid = a_oid;2662 conf =_("file/directory");2663}else{2664 add_branch = o->branch2;2665 other_branch = o->branch1;2666 mode = b_mode;2667 oid = b_oid;2668 conf =_("directory/file");2669}2670if(dir_in_way(path,2671!o->call_depth && !S_ISGITLINK(a_mode),26720)) {2673char*new_path =unique_path(o, path, add_branch);2674 clean_merge =0;2675output(o,1,_("CONFLICT (%s): There is a directory with name%sin%s. "2676"Adding%sas%s"),2677 conf, path, other_branch, path, new_path);2678if(update_file(o,0, oid, mode, new_path))2679 clean_merge = -1;2680else if(o->call_depth)2681remove_file_from_cache(path);2682free(new_path);2683}else{2684output(o,2,_("Adding%s"), path);2685/* do not overwrite file if already present */2686if(update_file_flags(o, oid, mode, path,1, !a_oid))2687 clean_merge = -1;2688}2689}else if(a_oid && b_oid) {2690/* Case C: Added in both (check for same permissions) and */2691/* case D: Modified in both, but differently. */2692 clean_merge =merge_content(o, path,2693 o_oid, o_mode, a_oid, a_mode, b_oid, b_mode,2694 NULL);2695}else if(!o_oid && !a_oid && !b_oid) {2696/*2697 * this entry was deleted altogether. a_mode == 0 means2698 * we had that path and want to actively remove it.2699 */2700remove_file(o,1, path, !a_mode);2701}else2702die("BUG: fatal merge failure, shouldn't happen.");27032704return clean_merge;2705}27062707intmerge_trees(struct merge_options *o,2708struct tree *head,2709struct tree *merge,2710struct tree *common,2711struct tree **result)2712{2713int code, clean;27142715if(o->subtree_shift) {2716 merge =shift_tree_object(head, merge, o->subtree_shift);2717 common =shift_tree_object(head, common, o->subtree_shift);2718}27192720if(oid_eq(&common->object.oid, &merge->object.oid)) {2721struct strbuf sb = STRBUF_INIT;27222723if(!o->call_depth &&index_has_changes(&sb)) {2724err(o,_("Dirty index: cannot merge (dirty:%s)"),2725 sb.buf);2726return0;2727}2728output(o,0,_("Already up to date!"));2729*result = head;2730return1;2731}27322733 code =git_merge_trees(o->call_depth, common, head, merge);27342735if(code !=0) {2736if(show(o,4) || o->call_depth)2737err(o,_("merging of trees%sand%sfailed"),2738oid_to_hex(&head->object.oid),2739oid_to_hex(&merge->object.oid));2740return-1;2741}27422743if(unmerged_cache()) {2744struct string_list *entries;2745struct rename_info re_info;2746int i;2747/*2748 * Only need the hashmap while processing entries, so2749 * initialize it here and free it when we are done running2750 * through the entries. Keeping it in the merge_options as2751 * opposed to decaring a local hashmap is for convenience2752 * so that we don't have to pass it to around.2753 */2754hashmap_init(&o->current_file_dir_set, path_hashmap_cmp, NULL,512);2755get_files_dirs(o, head);2756get_files_dirs(o, merge);27572758 entries =get_unmerged();2759 clean =handle_renames(o, common, head, merge, entries,2760&re_info);2761record_df_conflict_files(o, entries);2762if(clean <0)2763goto cleanup;2764for(i = entries->nr-1;0<= i; i--) {2765const char*path = entries->items[i].string;2766struct stage_data *e = entries->items[i].util;2767if(!e->processed) {2768int ret =process_entry(o, path, e);2769if(!ret)2770 clean =0;2771else if(ret <0) {2772 clean = ret;2773goto cleanup;2774}2775}2776}2777for(i =0; i < entries->nr; i++) {2778struct stage_data *e = entries->items[i].util;2779if(!e->processed)2780die("BUG: unprocessed path???%s",2781 entries->items[i].string);2782}27832784cleanup:2785final_cleanup_renames(&re_info);27862787string_list_clear(entries,1);2788free(entries);27892790hashmap_free(&o->current_file_dir_set,1);27912792if(clean <0)2793return clean;2794}2795else2796 clean =1;27972798if(o->call_depth && !(*result =write_tree_from_memory(o)))2799return-1;28002801return clean;2802}28032804static struct commit_list *reverse_commit_list(struct commit_list *list)2805{2806struct commit_list *next = NULL, *current, *backup;2807for(current = list; current; current = backup) {2808 backup = current->next;2809 current->next = next;2810 next = current;2811}2812return next;2813}28142815/*2816 * Merge the commits h1 and h2, return the resulting virtual2817 * commit object and a flag indicating the cleanness of the merge.2818 */2819intmerge_recursive(struct merge_options *o,2820struct commit *h1,2821struct commit *h2,2822struct commit_list *ca,2823struct commit **result)2824{2825struct commit_list *iter;2826struct commit *merged_common_ancestors;2827struct tree *mrtree;2828int clean;28292830if(show(o,4)) {2831output(o,4,_("Merging:"));2832output_commit_title(o, h1);2833output_commit_title(o, h2);2834}28352836if(!ca) {2837 ca =get_merge_bases(h1, h2);2838 ca =reverse_commit_list(ca);2839}28402841if(show(o,5)) {2842unsigned cnt =commit_list_count(ca);28432844output(o,5,Q_("found%ucommon ancestor:",2845"found%ucommon ancestors:", cnt), cnt);2846for(iter = ca; iter; iter = iter->next)2847output_commit_title(o, iter->item);2848}28492850 merged_common_ancestors =pop_commit(&ca);2851if(merged_common_ancestors == NULL) {2852/* if there is no common ancestor, use an empty tree */2853struct tree *tree;28542855 tree =lookup_tree(the_hash_algo->empty_tree);2856 merged_common_ancestors =make_virtual_commit(tree,"ancestor");2857}28582859for(iter = ca; iter; iter = iter->next) {2860const char*saved_b1, *saved_b2;2861 o->call_depth++;2862/*2863 * When the merge fails, the result contains files2864 * with conflict markers. The cleanness flag is2865 * ignored (unless indicating an error), it was never2866 * actually used, as result of merge_trees has always2867 * overwritten it: the committed "conflicts" were2868 * already resolved.2869 */2870discard_cache();2871 saved_b1 = o->branch1;2872 saved_b2 = o->branch2;2873 o->branch1 ="Temporary merge branch 1";2874 o->branch2 ="Temporary merge branch 2";2875if(merge_recursive(o, merged_common_ancestors, iter->item,2876 NULL, &merged_common_ancestors) <0)2877return-1;2878 o->branch1 = saved_b1;2879 o->branch2 = saved_b2;2880 o->call_depth--;28812882if(!merged_common_ancestors)2883returnerr(o,_("merge returned no commit"));2884}28852886discard_cache();2887if(!o->call_depth)2888read_cache();28892890 o->ancestor ="merged common ancestors";2891 clean =merge_trees(o, h1->tree, h2->tree, merged_common_ancestors->tree,2892&mrtree);2893if(clean <0) {2894flush_output(o);2895return clean;2896}28972898if(o->call_depth) {2899*result =make_virtual_commit(mrtree,"merged tree");2900commit_list_insert(h1, &(*result)->parents);2901commit_list_insert(h2, &(*result)->parents->next);2902}2903flush_output(o);2904if(!o->call_depth && o->buffer_output <2)2905strbuf_release(&o->obuf);2906if(show(o,2))2907diff_warn_rename_limit("merge.renamelimit",2908 o->needed_rename_limit,0);2909return clean;2910}29112912static struct commit *get_ref(const struct object_id *oid,const char*name)2913{2914struct object *object;29152916 object =deref_tag(parse_object(oid), name,strlen(name));2917if(!object)2918return NULL;2919if(object->type == OBJ_TREE)2920returnmake_virtual_commit((struct tree*)object, name);2921if(object->type != OBJ_COMMIT)2922return NULL;2923if(parse_commit((struct commit *)object))2924return NULL;2925return(struct commit *)object;2926}29272928intmerge_recursive_generic(struct merge_options *o,2929const struct object_id *head,2930const struct object_id *merge,2931int num_base_list,2932const struct object_id **base_list,2933struct commit **result)2934{2935int clean;2936struct lock_file lock = LOCK_INIT;2937struct commit *head_commit =get_ref(head, o->branch1);2938struct commit *next_commit =get_ref(merge, o->branch2);2939struct commit_list *ca = NULL;29402941if(base_list) {2942int i;2943for(i =0; i < num_base_list; ++i) {2944struct commit *base;2945if(!(base =get_ref(base_list[i],oid_to_hex(base_list[i]))))2946returnerr(o,_("Could not parse object '%s'"),2947oid_to_hex(base_list[i]));2948commit_list_insert(base, &ca);2949}2950}29512952hold_locked_index(&lock, LOCK_DIE_ON_ERROR);2953 clean =merge_recursive(o, head_commit, next_commit, ca,2954 result);2955if(clean <0) {2956rollback_lock_file(&lock);2957return clean;2958}29592960if(write_locked_index(&the_index, &lock,2961 COMMIT_LOCK | SKIP_IF_UNCHANGED))2962returnerr(o,_("Unable to write index."));29632964return clean ?0:1;2965}29662967static voidmerge_recursive_config(struct merge_options *o)2968{2969git_config_get_int("merge.verbosity", &o->verbosity);2970git_config_get_int("diff.renamelimit", &o->diff_rename_limit);2971git_config_get_int("merge.renamelimit", &o->merge_rename_limit);2972git_config(git_xmerge_config, NULL);2973}29742975voidinit_merge_options(struct merge_options *o)2976{2977const char*merge_verbosity;2978memset(o,0,sizeof(struct merge_options));2979 o->verbosity =2;2980 o->buffer_output =1;2981 o->diff_rename_limit = -1;2982 o->merge_rename_limit = -1;2983 o->renormalize =0;2984 o->detect_rename =1;2985merge_recursive_config(o);2986 merge_verbosity =getenv("GIT_MERGE_VERBOSITY");2987if(merge_verbosity)2988 o->verbosity =strtol(merge_verbosity, NULL,10);2989if(o->verbosity >=5)2990 o->buffer_output =0;2991strbuf_init(&o->obuf,0);2992string_list_init(&o->df_conflict_file_set,1);2993}29942995intparse_merge_opt(struct merge_options *o,const char*s)2996{2997const char*arg;29982999if(!s || !*s)3000return-1;3001if(!strcmp(s,"ours"))3002 o->recursive_variant = MERGE_RECURSIVE_OURS;3003else if(!strcmp(s,"theirs"))3004 o->recursive_variant = MERGE_RECURSIVE_THEIRS;3005else if(!strcmp(s,"subtree"))3006 o->subtree_shift ="";3007else if(skip_prefix(s,"subtree=", &arg))3008 o->subtree_shift = arg;3009else if(!strcmp(s,"patience"))3010 o->xdl_opts =DIFF_WITH_ALG(o, PATIENCE_DIFF);3011else if(!strcmp(s,"histogram"))3012 o->xdl_opts =DIFF_WITH_ALG(o, HISTOGRAM_DIFF);3013else if(skip_prefix(s,"diff-algorithm=", &arg)) {3014long value =parse_algorithm_value(arg);3015if(value <0)3016return-1;3017/* clear out previous settings */3018DIFF_XDL_CLR(o, NEED_MINIMAL);3019 o->xdl_opts &= ~XDF_DIFF_ALGORITHM_MASK;3020 o->xdl_opts |= value;3021}3022else if(!strcmp(s,"ignore-space-change"))3023DIFF_XDL_SET(o, IGNORE_WHITESPACE_CHANGE);3024else if(!strcmp(s,"ignore-all-space"))3025DIFF_XDL_SET(o, IGNORE_WHITESPACE);3026else if(!strcmp(s,"ignore-space-at-eol"))3027DIFF_XDL_SET(o, IGNORE_WHITESPACE_AT_EOL);3028else if(!strcmp(s,"ignore-cr-at-eol"))3029DIFF_XDL_SET(o, IGNORE_CR_AT_EOL);3030else if(!strcmp(s,"renormalize"))3031 o->renormalize =1;3032else if(!strcmp(s,"no-renormalize"))3033 o->renormalize =0;3034else if(!strcmp(s,"no-renames"))3035 o->detect_rename =0;3036else if(!strcmp(s,"find-renames")) {3037 o->detect_rename =1;3038 o->rename_score =0;3039}3040else if(skip_prefix(s,"find-renames=", &arg) ||3041skip_prefix(s,"rename-threshold=", &arg)) {3042if((o->rename_score =parse_rename_score(&arg)) == -1|| *arg !=0)3043return-1;3044 o->detect_rename =1;3045}3046else3047return-1;3048return0;3049}