зеркало из https://github.com/microsoft/git.git
Merge branch 'do/maint-merge-recursive-fix'
* do/maint-merge-recursive-fix: merge-recursive: never leave index unmerged while recursing
This commit is contained in:
Коммит
d32643c0ff
|
@ -933,11 +933,12 @@ static int process_renames(struct merge_options *o,
|
|||
ren1_src, ren1_dst, branch1,
|
||||
branch2);
|
||||
update_file(o, 0, ren1->pair->two->sha1, ren1->pair->two->mode, ren1_dst);
|
||||
update_stages(ren1_dst, NULL,
|
||||
branch1 == o->branch1 ?
|
||||
ren1->pair->two : NULL,
|
||||
branch1 == o->branch1 ?
|
||||
NULL : ren1->pair->two, 1);
|
||||
if (!o->call_depth)
|
||||
update_stages(ren1_dst, NULL,
|
||||
branch1 == o->branch1 ?
|
||||
ren1->pair->two : NULL,
|
||||
branch1 == o->branch1 ?
|
||||
NULL : ren1->pair->two, 1);
|
||||
} else if (!sha_eq(dst_other.sha1, null_sha1)) {
|
||||
const char *new_path;
|
||||
clean_merge = 0;
|
||||
|
|
|
@ -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
|
Загрузка…
Ссылка в новой задаче