Skip to content

Commit

Permalink
Merge branch 'do/maint-merge-recursive-fix' into maint
Browse files Browse the repository at this point in the history
* do/maint-merge-recursive-fix:
  merge-recursive: never leave index unmerged while recursing
  • Loading branch information
gitster committed May 26, 2009
2 parents 4176537 bf74106 commit 5c44cc9
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 5 deletions.
11 changes: 6 additions & 5 deletions merge-recursive.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
95 changes: 95 additions & 0 deletions t/t3031-merge-criscross.sh
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 5c44cc9

Please sign in to comment.