merge(third_party/git): Merge squashed git subtree at v2.23.0
Merge commit '1b593e1ea4
' as 'third_party/git'
This commit is contained in:
commit
7ef0d62730
3629 changed files with 1139935 additions and 0 deletions
201
third_party/git/t/t7611-merge-abort.sh
vendored
Executable file
201
third_party/git/t/t7611-merge-abort.sh
vendored
Executable file
|
@ -0,0 +1,201 @@
|
|||
#!/bin/sh
|
||||
|
||||
test_description='test aborting in-progress merges
|
||||
|
||||
Set up repo with conflicting and non-conflicting branches:
|
||||
|
||||
There are three files foo/bar/baz, and the following graph illustrates the
|
||||
content of these files in each commit:
|
||||
|
||||
# foo/bar/baz --- foo/bar/bazz <-- master
|
||||
# \
|
||||
# --- foo/barf/bazf <-- conflict_branch
|
||||
# \
|
||||
# --- foo/bart/baz <-- clean_branch
|
||||
|
||||
Next, test git merge --abort with the following variables:
|
||||
- before/after successful merge (should fail when not in merge context)
|
||||
- with/without conflicts
|
||||
- clean/dirty index before merge
|
||||
- clean/dirty worktree before merge
|
||||
- dirty index before merge matches contents on remote branch
|
||||
- changed/unchanged worktree after merge
|
||||
- changed/unchanged index after merge
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
test_expect_success 'setup' '
|
||||
# Create the above repo
|
||||
echo foo > foo &&
|
||||
echo bar > bar &&
|
||||
echo baz > baz &&
|
||||
git add foo bar baz &&
|
||||
git commit -m initial &&
|
||||
echo bazz > baz &&
|
||||
git commit -a -m "second" &&
|
||||
git checkout -b conflict_branch HEAD^ &&
|
||||
echo barf > bar &&
|
||||
echo bazf > baz &&
|
||||
git commit -a -m "conflict" &&
|
||||
git checkout -b clean_branch HEAD^ &&
|
||||
echo bart > bar &&
|
||||
git commit -a -m "clean" &&
|
||||
git checkout master
|
||||
'
|
||||
|
||||
pre_merge_head="$(git rev-parse HEAD)"
|
||||
|
||||
test_expect_success 'fails without MERGE_HEAD (unstarted merge)' '
|
||||
test_must_fail git merge --abort 2>output &&
|
||||
test_i18ngrep MERGE_HEAD output
|
||||
'
|
||||
|
||||
test_expect_success 'fails without MERGE_HEAD (unstarted merge): .git/MERGE_HEAD sanity' '
|
||||
test ! -f .git/MERGE_HEAD &&
|
||||
test "$pre_merge_head" = "$(git rev-parse HEAD)"
|
||||
'
|
||||
|
||||
test_expect_success 'fails without MERGE_HEAD (completed merge)' '
|
||||
git merge clean_branch &&
|
||||
test ! -f .git/MERGE_HEAD &&
|
||||
# Merge successfully completed
|
||||
post_merge_head="$(git rev-parse HEAD)" &&
|
||||
test_must_fail git merge --abort 2>output &&
|
||||
test_i18ngrep MERGE_HEAD output
|
||||
'
|
||||
|
||||
test_expect_success 'fails without MERGE_HEAD (completed merge): .git/MERGE_HEAD sanity' '
|
||||
test ! -f .git/MERGE_HEAD &&
|
||||
test "$post_merge_head" = "$(git rev-parse HEAD)"
|
||||
'
|
||||
|
||||
test_expect_success 'Forget previous merge' '
|
||||
git reset --hard "$pre_merge_head"
|
||||
'
|
||||
|
||||
test_expect_success 'Abort after --no-commit' '
|
||||
# Redo merge, but stop before creating merge commit
|
||||
git merge --no-commit clean_branch &&
|
||||
test -f .git/MERGE_HEAD &&
|
||||
# Abort non-conflicting merge
|
||||
git merge --abort &&
|
||||
test ! -f .git/MERGE_HEAD &&
|
||||
test "$pre_merge_head" = "$(git rev-parse HEAD)" &&
|
||||
test -z "$(git diff)" &&
|
||||
test -z "$(git diff --staged)"
|
||||
'
|
||||
|
||||
test_expect_success 'Abort after conflicts' '
|
||||
# Create conflicting merge
|
||||
test_must_fail git merge conflict_branch &&
|
||||
test -f .git/MERGE_HEAD &&
|
||||
# Abort conflicting merge
|
||||
git merge --abort &&
|
||||
test ! -f .git/MERGE_HEAD &&
|
||||
test "$pre_merge_head" = "$(git rev-parse HEAD)" &&
|
||||
test -z "$(git diff)" &&
|
||||
test -z "$(git diff --staged)"
|
||||
'
|
||||
|
||||
test_expect_success 'Clean merge with dirty index fails' '
|
||||
echo xyzzy >> foo &&
|
||||
git add foo &&
|
||||
git diff --staged > expect &&
|
||||
test_must_fail git merge clean_branch &&
|
||||
test ! -f .git/MERGE_HEAD &&
|
||||
test "$pre_merge_head" = "$(git rev-parse HEAD)" &&
|
||||
test -z "$(git diff)" &&
|
||||
git diff --staged > actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'Conflicting merge with dirty index fails' '
|
||||
test_must_fail git merge conflict_branch &&
|
||||
test ! -f .git/MERGE_HEAD &&
|
||||
test "$pre_merge_head" = "$(git rev-parse HEAD)" &&
|
||||
test -z "$(git diff)" &&
|
||||
git diff --staged > actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'Reset index (but preserve worktree changes)' '
|
||||
git reset "$pre_merge_head" &&
|
||||
git diff > actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'Abort clean merge with non-conflicting dirty worktree' '
|
||||
git merge --no-commit clean_branch &&
|
||||
test -f .git/MERGE_HEAD &&
|
||||
# Abort merge
|
||||
git merge --abort &&
|
||||
test ! -f .git/MERGE_HEAD &&
|
||||
test "$pre_merge_head" = "$(git rev-parse HEAD)" &&
|
||||
test -z "$(git diff --staged)" &&
|
||||
git diff > actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'Abort conflicting merge with non-conflicting dirty worktree' '
|
||||
test_must_fail git merge conflict_branch &&
|
||||
test -f .git/MERGE_HEAD &&
|
||||
# Abort merge
|
||||
git merge --abort &&
|
||||
test ! -f .git/MERGE_HEAD &&
|
||||
test "$pre_merge_head" = "$(git rev-parse HEAD)" &&
|
||||
test -z "$(git diff --staged)" &&
|
||||
git diff > actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'Reset worktree changes' '
|
||||
git reset --hard "$pre_merge_head"
|
||||
'
|
||||
|
||||
test_expect_success 'Fail clean merge with conflicting dirty worktree' '
|
||||
echo xyzzy >> bar &&
|
||||
git diff > expect &&
|
||||
test_must_fail git merge --no-commit clean_branch &&
|
||||
test ! -f .git/MERGE_HEAD &&
|
||||
test "$pre_merge_head" = "$(git rev-parse HEAD)" &&
|
||||
test -z "$(git diff --staged)" &&
|
||||
git diff > actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'Fail conflicting merge with conflicting dirty worktree' '
|
||||
test_must_fail git merge conflict_branch &&
|
||||
test ! -f .git/MERGE_HEAD &&
|
||||
test "$pre_merge_head" = "$(git rev-parse HEAD)" &&
|
||||
test -z "$(git diff --staged)" &&
|
||||
git diff > actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'Reset worktree changes' '
|
||||
git reset --hard "$pre_merge_head"
|
||||
'
|
||||
|
||||
test_expect_success 'Fail clean merge with matching dirty worktree' '
|
||||
echo bart > bar &&
|
||||
git diff > expect &&
|
||||
test_must_fail git merge --no-commit clean_branch &&
|
||||
test ! -f .git/MERGE_HEAD &&
|
||||
test "$pre_merge_head" = "$(git rev-parse HEAD)" &&
|
||||
test -z "$(git diff --staged)" &&
|
||||
git diff > actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'Fail conflicting merge with matching dirty worktree' '
|
||||
echo barf > bar &&
|
||||
git diff > expect &&
|
||||
test_must_fail git merge conflict_branch &&
|
||||
test ! -f .git/MERGE_HEAD &&
|
||||
test "$pre_merge_head" = "$(git rev-parse HEAD)" &&
|
||||
test -z "$(git diff --staged)" &&
|
||||
git diff > actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_done
|
Loading…
Add table
Add a link
Reference in a new issue