mirror of
https://github.com/git/git
synced 2024-09-13 05:14:36 +00:00
Merge branch 'do/maint-merge-recursive-fix' into maint
* do/maint-merge-recursive-fix: merge-recursive: never leave index unmerged while recursing
This commit is contained in:
commit
5c44cc9ea2
|
@ -933,11 +933,12 @@ static int process_renames(struct merge_options *o,
|
||||||
ren1_src, ren1_dst, branch1,
|
ren1_src, ren1_dst, branch1,
|
||||||
branch2);
|
branch2);
|
||||||
update_file(o, 0, ren1->pair->two->sha1, ren1->pair->two->mode, ren1_dst);
|
update_file(o, 0, ren1->pair->two->sha1, ren1->pair->two->mode, ren1_dst);
|
||||||
update_stages(ren1_dst, NULL,
|
if (!o->call_depth)
|
||||||
branch1 == o->branch1 ?
|
update_stages(ren1_dst, NULL,
|
||||||
ren1->pair->two : NULL,
|
branch1 == o->branch1 ?
|
||||||
branch1 == o->branch1 ?
|
ren1->pair->two : NULL,
|
||||||
NULL : ren1->pair->two, 1);
|
branch1 == o->branch1 ?
|
||||||
|
NULL : ren1->pair->two, 1);
|
||||||
} else if (!sha_eq(dst_other.sha1, null_sha1)) {
|
} else if (!sha_eq(dst_other.sha1, null_sha1)) {
|
||||||
const char *new_path;
|
const char *new_path;
|
||||||
clean_merge = 0;
|
clean_merge = 0;
|
||||||
|
|
95
t/t3031-merge-criscross.sh
Executable file
95
t/t3031-merge-criscross.sh
Executable file
|
@ -0,0 +1,95 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
test_description='merge-recursive backend test'
|
||||||
|
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
# A <- create some files
|
||||||
|
# / \
|
||||||
|
# B C <- cause rename/delete conflicts between B and C
|
||||||
|
# / \
|
||||||
|
# |\ /|
|
||||||
|
# | D E |
|
||||||
|
# | \ / |
|
||||||
|
# | X |
|
||||||
|
# | / \ |
|
||||||
|
# | / \ |
|
||||||
|
# |/ \|
|
||||||
|
# F G <- merge E into B, D into C
|
||||||
|
# \ /
|
||||||
|
# \ /
|
||||||
|
# \ /
|
||||||
|
# H <- recursive merge crashes
|
||||||
|
#
|
||||||
|
|
||||||
|
# initialize
|
||||||
|
test_expect_success 'setup repo with criss-cross history' '
|
||||||
|
mkdir data &&
|
||||||
|
|
||||||
|
# create a bunch of files
|
||||||
|
n=1 &&
|
||||||
|
while test $n -le 10
|
||||||
|
do
|
||||||
|
echo $n > data/$n &&
|
||||||
|
n=$(($n+1)) ||
|
||||||
|
break
|
||||||
|
done &&
|
||||||
|
|
||||||
|
# check them in
|
||||||
|
git add data &&
|
||||||
|
git commit -m A &&
|
||||||
|
git branch A &&
|
||||||
|
|
||||||
|
# a file in one branch
|
||||||
|
git checkout -b B A &&
|
||||||
|
git rm data/9 &&
|
||||||
|
git add data &&
|
||||||
|
git commit -m B &&
|
||||||
|
|
||||||
|
# with a branch off of it
|
||||||
|
git branch D &&
|
||||||
|
|
||||||
|
# put some commits on D
|
||||||
|
git checkout D &&
|
||||||
|
echo testD > data/testD &&
|
||||||
|
git add data &&
|
||||||
|
git commit -m D &&
|
||||||
|
|
||||||
|
# back up to the top, create another branch and cause
|
||||||
|
# a rename conflict with the file we deleted earlier
|
||||||
|
git checkout -b C A &&
|
||||||
|
git mv data/9 data/new-9 &&
|
||||||
|
git add data &&
|
||||||
|
git commit -m C &&
|
||||||
|
|
||||||
|
# with a branch off of it
|
||||||
|
git branch E &&
|
||||||
|
|
||||||
|
# put a commit on E
|
||||||
|
git checkout E &&
|
||||||
|
echo testE > data/testE &&
|
||||||
|
git add data &&
|
||||||
|
git commit -m E &&
|
||||||
|
|
||||||
|
# now, merge E into B
|
||||||
|
git checkout B &&
|
||||||
|
test_must_fail git merge E &&
|
||||||
|
# force-resolve
|
||||||
|
git add data &&
|
||||||
|
git commit -m F &&
|
||||||
|
git branch F &&
|
||||||
|
|
||||||
|
# and merge D into C
|
||||||
|
git checkout C &&
|
||||||
|
test_must_fail git merge D &&
|
||||||
|
# force-resolve
|
||||||
|
git add data &&
|
||||||
|
git commit -m G &&
|
||||||
|
git branch G
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'recursive merge between F and G, causes segfault' '
|
||||||
|
git merge F
|
||||||
|
'
|
||||||
|
|
||||||
|
test_done
|
Loading…
Reference in a new issue