| #!/bin/sh | 
 |  | 
 | test_description='"git merge" top-level frontend' | 
 |  | 
 | . ./test-lib.sh | 
 |  | 
 | t3033_reset () { | 
 | 	git checkout -B master two && | 
 | 	git branch -f left three && | 
 | 	git branch -f right four | 
 | } | 
 |  | 
 | test_expect_success setup ' | 
 | 	test_commit one && | 
 | 	git branch left && | 
 | 	git branch right && | 
 | 	test_commit two && | 
 | 	git checkout left && | 
 | 	test_commit three && | 
 | 	git checkout right && | 
 | 	test_commit four && | 
 | 	git checkout --orphan newroot && | 
 | 	test_commit five && | 
 | 	git checkout master | 
 | ' | 
 |  | 
 | # Local branches | 
 |  | 
 | test_expect_success 'merge an octopus into void' ' | 
 | 	t3033_reset && | 
 | 	git checkout --orphan test && | 
 | 	git rm -fr . && | 
 | 	test_must_fail git merge left right && | 
 | 	test_must_fail git rev-parse --verify HEAD && | 
 | 	git diff --quiet && | 
 | 	test_must_fail git rev-parse HEAD | 
 | ' | 
 |  | 
 | test_expect_success 'merge an octopus, fast-forward (ff)' ' | 
 | 	t3033_reset && | 
 | 	git reset --hard one && | 
 | 	git merge left right && | 
 | 	# one is ancestor of three (left) and four (right) | 
 | 	test_must_fail git rev-parse --verify HEAD^3 && | 
 | 	git rev-parse HEAD^1 HEAD^2 | sort >actual && | 
 | 	git rev-parse three four | sort >expect && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'merge octopus, non-fast-forward (ff)' ' | 
 | 	t3033_reset && | 
 | 	git reset --hard one && | 
 | 	git merge --no-ff left right && | 
 | 	# one is ancestor of three (left) and four (right) | 
 | 	test_must_fail git rev-parse --verify HEAD^4 && | 
 | 	git rev-parse HEAD^1 HEAD^2 HEAD^3 | sort >actual && | 
 | 	git rev-parse one three four | sort >expect && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'merge octopus, fast-forward (does not ff)' ' | 
 | 	t3033_reset && | 
 | 	git merge left right && | 
 | 	# two (master) is not an ancestor of three (left) and four (right) | 
 | 	test_must_fail git rev-parse --verify HEAD^4 && | 
 | 	git rev-parse HEAD^1 HEAD^2 HEAD^3 | sort >actual && | 
 | 	git rev-parse two three four | sort >expect && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'merge octopus, non-fast-forward' ' | 
 | 	t3033_reset && | 
 | 	git merge --no-ff left right && | 
 | 	test_must_fail git rev-parse --verify HEAD^4 && | 
 | 	git rev-parse HEAD^1 HEAD^2 HEAD^3 | sort >actual && | 
 | 	git rev-parse two three four | sort >expect && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | # The same set with FETCH_HEAD | 
 |  | 
 | test_expect_success 'merge FETCH_HEAD octopus into void' ' | 
 | 	t3033_reset && | 
 | 	git checkout --orphan test && | 
 | 	git rm -fr . && | 
 | 	git fetch . left right && | 
 | 	test_must_fail git merge FETCH_HEAD && | 
 | 	test_must_fail git rev-parse --verify HEAD && | 
 | 	git diff --quiet && | 
 | 	test_must_fail git rev-parse HEAD | 
 | ' | 
 |  | 
 | test_expect_success 'merge FETCH_HEAD octopus fast-forward (ff)' ' | 
 | 	t3033_reset && | 
 | 	git reset --hard one && | 
 | 	git fetch . left right && | 
 | 	git merge FETCH_HEAD && | 
 | 	# one is ancestor of three (left) and four (right) | 
 | 	test_must_fail git rev-parse --verify HEAD^3 && | 
 | 	git rev-parse HEAD^1 HEAD^2 | sort >actual && | 
 | 	git rev-parse three four | sort >expect && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'merge FETCH_HEAD octopus non-fast-forward (ff)' ' | 
 | 	t3033_reset && | 
 | 	git reset --hard one && | 
 | 	git fetch . left right && | 
 | 	git merge --no-ff FETCH_HEAD && | 
 | 	# one is ancestor of three (left) and four (right) | 
 | 	test_must_fail git rev-parse --verify HEAD^4 && | 
 | 	git rev-parse HEAD^1 HEAD^2 HEAD^3 | sort >actual && | 
 | 	git rev-parse one three four | sort >expect && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'merge FETCH_HEAD octopus fast-forward (does not ff)' ' | 
 | 	t3033_reset && | 
 | 	git fetch . left right && | 
 | 	git merge FETCH_HEAD && | 
 | 	# two (master) is not an ancestor of three (left) and four (right) | 
 | 	test_must_fail git rev-parse --verify HEAD^4 && | 
 | 	git rev-parse HEAD^1 HEAD^2 HEAD^3 | sort >actual && | 
 | 	git rev-parse two three four | sort >expect && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'merge FETCH_HEAD octopus non-fast-forward' ' | 
 | 	t3033_reset && | 
 | 	git fetch . left right && | 
 | 	git merge --no-ff FETCH_HEAD && | 
 | 	test_must_fail git rev-parse --verify HEAD^4 && | 
 | 	git rev-parse HEAD^1 HEAD^2 HEAD^3 | sort >actual && | 
 | 	git rev-parse two three four | sort >expect && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | # two-project merge | 
 | test_expect_success 'refuse two-project merge by default' ' | 
 | 	t3033_reset && | 
 | 	git reset --hard four && | 
 | 	test_must_fail git merge five | 
 | ' | 
 |  | 
 | test_expect_success 'two-project merge with --allow-unrelated-histories' ' | 
 | 	t3033_reset && | 
 | 	git reset --hard four && | 
 | 	git merge --allow-unrelated-histories five && | 
 | 	git diff --exit-code five | 
 | ' | 
 |  | 
 | test_done |