#!/bin/sh
#
# Copyright (c) 2008 Stephen Haberman
#

test_description='git rebase preserve merges

This test runs git rebase with preserve merges and ensures commits
dropped by the --cherry-pick flag have their childrens parents
rewritten.
'
. ./test-lib.sh

# set up two branches like this:
#
# A - B - C - D - E
#   \
#     F - G - H
#       \
#         I
#
# where B, D and G touch the same file.

test_expect_success 'setup' '
	: > file1 &&
	git add file1 &&
	test_tick &&
	git commit -m A &&
	git tag A &&
	echo 1 > file1 &&
	test_tick &&
	git commit -m B file1 &&
	: > file2 &&
	git add file2 &&
	test_tick &&
	git commit -m C &&
	echo 2 > file1 &&
	test_tick &&
	git commit -m D file1 &&
	: > file3 &&
	git add file3 &&
	test_tick &&
	git commit -m E &&
	git tag E &&
	git checkout -b branch1 A &&
	: > file4 &&
	git add file4 &&
	test_tick &&
	git commit -m F &&
	git tag F &&
	echo 3 > file1 &&
	test_tick &&
	git commit -m G file1 &&
	git tag G &&
	: > file5 &&
	git add file5 &&
	test_tick &&
	git commit -m H &&
	git tag H &&
	git checkout -b branch2 F &&
	: > file6 &&
	git add file6 &&
	test_tick &&
	git commit -m I &&
	git tag I
'

# A - B - C - D - E
#   \             \ \
#     F - G - H -- L \        -->   L
#       \            |               \
#         I -- G2 -- J -- K           I -- K
# G2 = same changes as G
test_expect_success 'skip same-resolution merges with -p' '
	git checkout branch1 &&
	! git merge E &&
	echo 23 > file1 &&
	git add file1 &&
	git commit -m L &&
	git checkout branch2 &&
	echo 3 > file1 &&
	git commit -a -m G2 &&
	! git merge E &&
	echo 23 > file1 &&
	git add file1 &&
	git commit -m J &&
	echo file7 > file7 &&
	git add file7 &&
	git commit -m K &&
	GIT_EDITOR=: git rebase -i -p branch1 &&
	test $(git rev-parse branch2^^) = $(git rev-parse branch1) &&
	test "23" = "$(cat file1)" &&
	test "" = "$(cat file6)" &&
	test "file7" = "$(cat file7)" &&

	git checkout branch1 &&
	git reset --hard H &&
	git checkout branch2 &&
	git reset --hard I
'

# A - B - C - D - E
#   \             \ \
#     F - G - H -- L \        -->   L
#       \            |               \
#         I -- G2 -- J -- K           I -- G2 -- K
# G2 = different changes as G
test_expect_success 'keep different-resolution merges with -p' '
	git checkout branch1 &&
	! git merge E &&
	echo 23 > file1 &&
	git add file1 &&
	git commit -m L &&
	git checkout branch2 &&
	echo 4 > file1 &&
	git commit -a -m G2 &&
	! git merge E &&
	echo 24 > file1 &&
	git add file1 &&
	git commit -m J &&
	echo file7 > file7 &&
	git add file7 &&
	git commit -m K &&
	! GIT_EDITOR=: git rebase -i -p branch1 &&
	echo 234 > file1 &&
	git add file1 &&
	GIT_EDITOR=: git rebase --continue &&
	test $(git rev-parse branch2^^^) = $(git rev-parse branch1) &&
	test "234" = "$(cat file1)" &&
	test "" = "$(cat file6)" &&
	test "file7" = "$(cat file7)" &&

	git checkout branch1 &&
	git reset --hard H &&
	git checkout branch2 &&
	git reset --hard I
'

test_done