Revert "Merge branch 'en/merge-recursive'"
As the band-aid to merge-recursive seems to regress complex merges in an unpleasant way. The merge-recursive implementation needs to be rewritten in such a way that it resolves renames and D/F conflicts entirely in-core and not to touch working tree at all while doing so. But in the meantime, this reverts commit ac9666f84 that merged the topic in its entirety.
Junio C Hamano committed
May 19, 2011 at 20:17 UTC
6db41050a360d83e89114602ecc81c208323080f
2 files changed
+6
-81
merge-recursive.c
+6
-18
@@ -341,11 +341,10 @@ static void make_room_for_directories_of_df_conflicts(struct merge_options *o,
341
* make room for the corresponding directory. Such paths will
342
* later be processed in process_df_entry() at the end. If
343
* the corresponding directory ends up being removed by the
344
- * merge, then the file will be reinstated at that time
345
- * (albeit with a different timestamp!); otherwise, if the
346
- * file is not supposed to be removed by the merge, the
347
- * contents of the file will be placed in another unique
348
- * filename.
344
+ * merge, then the file will be reinstated at that time;
345
+ * otherwise, if the file is not supposed to be removed by the
346
+ * merge, the contents of the file will be placed in another
347
+ * unique filename.
348
*
349
* NOTE: This function relies on the fact that entries for a
350
* D/F conflict will appear adjacent in the index, with the
@@ -356,13 +355,6 @@ static void make_room_for_directories_of_df_conflicts(struct merge_options *o,
355
int last_len = 0;
356
int i;
357
359
- /*
360
- * Do not do any of this crazyness during the recursive; we don't
361
- * even write anything to the working tree!
362
- */
363
- if (o->call_depth)
364
- return;
365
-
358
for (i = 0; i < entries->nr; i++) {
359
const char *path = entries->items[i].string;
360
int len = strlen(path);
@@ -1265,13 +1257,9 @@ static int merge_content(struct merge_options *o,
1257
}
1258
1259
if (mfi.clean && !df_conflict_remains &&
1268
- sha_eq(mfi.sha, a_sha) && mfi.mode == a.mode &&
1269
- !o->call_depth && !lstat(path, &st)) {
1260
+ sha_eq(mfi.sha, a_sha) && mfi.mode == a.mode)
1261
output(o, 3, "Skipped %s (merged same as existing)", path);
1271
- add_cacheinfo(mfi.mode, mfi.sha, path,
1272
- 0 /*stage*/, 1 /*refresh*/, 0 /*options*/);
1273
- return mfi.clean;
1274
- } else
1262
+ else
1263
output(o, 2, "Auto-merging %s", path);
1264
1265
if (!mfi.clean) {
t/t6022-merge-rename.sh
-63
@@ -609,67 +609,4 @@ test_expect_success 'check handling of differently renamed file with D/F conflic
609
! test -f original
610
'
611
612
-test_expect_success 'setup avoid unnecessary update, normal rename' '
613
- git reset --hard &&
614
- git checkout --orphan avoid-unnecessary-update-1 &&
615
- git rm -rf . &&
616
- git clean -fdqx &&
617
-
618
- printf "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n" >original &&
619
- git add -A &&
620
- git commit -m "Common commmit" &&
621
-
622
- git mv original rename &&
623
- echo 11 >>rename &&
624
- git add -u &&
625
- git commit -m "Renamed and modified" &&
626
-
627
- git checkout -b merge-branch-1 HEAD~1 &&
628
- echo "random content" >random-file &&
629
- git add -A &&
630
- git commit -m "Random, unrelated changes"
631
-'
632
-
633
-test_expect_success 'avoid unnecessary update, normal rename' '
634
- git checkout -q avoid-unnecessary-update-1^0 &&
635
- test-chmtime =1000000000 rename &&
636
- test-chmtime -v +0 rename >expect &&
637
- git merge merge-branch-1 &&
638
- test-chmtime -v +0 rename >actual &&
639
- test_cmp expect actual # "rename" should have stayed intact
640
-'
641
-
642
-test_expect_success 'setup to test avoiding unnecessary update, with D/F conflict' '
643
- git reset --hard &&
644
- git checkout --orphan avoid-unnecessary-update-2 &&
645
- git rm -rf . &&
646
- git clean -fdqx &&
647
-
648
- mkdir df &&
649
- printf "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n" >df/file &&
650
- git add -A &&
651
- git commit -m "Common commmit" &&
652
-
653
- git mv df/file temp &&
654
- rm -rf df &&
655
- git mv temp df &&
656
- echo 11 >>df &&
657
- git add -u &&
658
- git commit -m "Renamed and modified" &&
659
-
660
- git checkout -b merge-branch-2 HEAD~1 &&
661
- >unrelated-change &&
662
- git add unrelated-change &&
663
- git commit -m "Only unrelated changes"
664
-'
665
-
666
-test_expect_failure 'avoid unnecessary update, with D/F conflict' '
667
- git checkout -q avoid-unnecessary-update-2^0 &&
668
- test-chmtime =1000000000 df &&
669
- test-chmtime -v +0 df >expect &&
670
- git merge merge-branch-2 &&
671
- test-chmtime -v +0 df >actual &&
672
- test_cmp expect actual # "df" should have stayed intact
673
-'
674
-
612
test_done