merge: deprecate 'git merge <message> HEAD <commit>' syntax
[gitweb.git] / t / t5520-pull.sh
index 35304b41e9ce6222f7d713e3d310e47241d8e6e0..7efd45bc27687a619d149bb581cb6cb2582241e9 100755 (executable)
@@ -9,36 +9,27 @@ modify () {
        mv "$2.x" "$2"
 }
 
-D=`pwd`
-
 test_expect_success setup '
-
        echo file >file &&
        git add file &&
        git commit -a -m original
-
 '
 
 test_expect_success 'pulling into void' '
-       mkdir cloned &&
-       cd cloned &&
-       git init &&
-       git pull ..
-'
-
-cd "$D"
-
-test_expect_success 'checking the results' '
+       git init cloned &&
+       (
+               cd cloned &&
+               git pull ..
+       ) &&
        test -f file &&
        test -f cloned/file &&
        test_cmp file cloned/file
 '
 
 test_expect_success 'pulling into void using master:master' '
-       mkdir cloned-uho &&
+       git init cloned-uho &&
        (
                cd cloned-uho &&
-               git init &&
                git pull .. master:master
        ) &&
        test -f file &&
@@ -57,6 +48,43 @@ test_expect_success 'pulling into void does not overwrite untracked files' '
        )
 '
 
+test_expect_success 'pulling into void does not overwrite staged files' '
+       git init cloned-staged-colliding &&
+       (
+               cd cloned-staged-colliding &&
+               echo "alternate content" >file &&
+               git add file &&
+               test_must_fail git pull .. master &&
+               echo "alternate content" >expect &&
+               test_cmp expect file &&
+               git cat-file blob :file >file.index &&
+               test_cmp expect file.index
+       )
+'
+
+test_expect_success 'pulling into void does not remove new staged files' '
+       git init cloned-staged-new &&
+       (
+               cd cloned-staged-new &&
+               echo "new tracked file" >newfile &&
+               git add newfile &&
+               git pull .. master &&
+               echo "new tracked file" >expect &&
+               test_cmp expect newfile &&
+               git cat-file blob :newfile >newfile.index &&
+               test_cmp expect newfile.index
+       )
+'
+
+test_expect_success 'pulling into void must not create an octopus' '
+       git init cloned-octopus &&
+       (
+               cd cloned-octopus &&
+               test_must_fail git pull .. master master &&
+               ! test -f file
+       )
+'
+
 test_expect_success 'test . as a remote' '
 
        git branch copy master &&
@@ -96,8 +124,7 @@ test_expect_success '--rebase' '
 '
 test_expect_success 'pull.rebase' '
        git reset --hard before-rebase &&
-       git config --bool pull.rebase true &&
-       test_when_finished "git config --unset pull.rebase" &&
+       test_config pull.rebase true &&
        git pull . copy &&
        test $(git rev-parse HEAD^) = $(git rev-parse copy) &&
        test new = $(git show HEAD:file2)
@@ -105,8 +132,7 @@ test_expect_success 'pull.rebase' '
 
 test_expect_success 'branch.to-rebase.rebase' '
        git reset --hard before-rebase &&
-       git config --bool branch.to-rebase.rebase true &&
-       test_when_finished "git config --unset branch.to-rebase.rebase" &&
+       test_config branch.to-rebase.rebase true &&
        git pull . copy &&
        test $(git rev-parse HEAD^) = $(git rev-parse copy) &&
        test new = $(git show HEAD:file2)
@@ -114,15 +140,102 @@ test_expect_success 'branch.to-rebase.rebase' '
 
 test_expect_success 'branch.to-rebase.rebase should override pull.rebase' '
        git reset --hard before-rebase &&
-       git config --bool pull.rebase true &&
-       test_when_finished "git config --unset pull.rebase" &&
-       git config --bool branch.to-rebase.rebase false &&
-       test_when_finished "git config --unset branch.to-rebase.rebase" &&
+       test_config pull.rebase true &&
+       test_config branch.to-rebase.rebase false &&
        git pull . copy &&
        test $(git rev-parse HEAD^) != $(git rev-parse copy) &&
        test new = $(git show HEAD:file2)
 '
 
+# add a feature branch, keep-merge, that is merged into master, so the
+# test can try preserving the merge commit (or not) with various
+# --rebase flags/pull.rebase settings.
+test_expect_success 'preserve merge setup' '
+       git reset --hard before-rebase &&
+       git checkout -b keep-merge second^ &&
+       test_commit file3 &&
+       git checkout to-rebase &&
+       git merge keep-merge &&
+       git tag before-preserve-rebase
+'
+
+test_expect_success 'pull.rebase=false create a new merge commit' '
+       git reset --hard before-preserve-rebase &&
+       test_config pull.rebase false &&
+       git pull . copy &&
+       test $(git rev-parse HEAD^1) = $(git rev-parse before-preserve-rebase) &&
+       test $(git rev-parse HEAD^2) = $(git rev-parse copy) &&
+       test file3 = $(git show HEAD:file3.t)
+'
+
+test_expect_success 'pull.rebase=true flattens keep-merge' '
+       git reset --hard before-preserve-rebase &&
+       test_config pull.rebase true &&
+       git pull . copy &&
+       test $(git rev-parse HEAD^^) = $(git rev-parse copy) &&
+       test file3 = $(git show HEAD:file3.t)
+'
+
+test_expect_success 'pull.rebase=1 is treated as true and flattens keep-merge' '
+       git reset --hard before-preserve-rebase &&
+       test_config pull.rebase 1 &&
+       git pull . copy &&
+       test $(git rev-parse HEAD^^) = $(git rev-parse copy) &&
+       test file3 = $(git show HEAD:file3.t)
+'
+
+test_expect_success 'pull.rebase=preserve rebases and merges keep-merge' '
+       git reset --hard before-preserve-rebase &&
+       test_config pull.rebase preserve &&
+       git pull . copy &&
+       test $(git rev-parse HEAD^^) = $(git rev-parse copy) &&
+       test $(git rev-parse HEAD^2) = $(git rev-parse keep-merge)
+'
+
+test_expect_success 'pull.rebase=invalid fails' '
+       git reset --hard before-preserve-rebase &&
+       test_config pull.rebase invalid &&
+       ! git pull . copy
+'
+
+test_expect_success '--rebase=false create a new merge commit' '
+       git reset --hard before-preserve-rebase &&
+       test_config pull.rebase true &&
+       git pull --rebase=false . copy &&
+       test $(git rev-parse HEAD^1) = $(git rev-parse before-preserve-rebase) &&
+       test $(git rev-parse HEAD^2) = $(git rev-parse copy) &&
+       test file3 = $(git show HEAD:file3.t)
+'
+
+test_expect_success '--rebase=true rebases and flattens keep-merge' '
+       git reset --hard before-preserve-rebase &&
+       test_config pull.rebase preserve &&
+       git pull --rebase=true . copy &&
+       test $(git rev-parse HEAD^^) = $(git rev-parse copy) &&
+       test file3 = $(git show HEAD:file3.t)
+'
+
+test_expect_success '--rebase=preserve rebases and merges keep-merge' '
+       git reset --hard before-preserve-rebase &&
+       test_config pull.rebase true &&
+       git pull --rebase=preserve . copy &&
+       test $(git rev-parse HEAD^^) = $(git rev-parse copy) &&
+       test $(git rev-parse HEAD^2) = $(git rev-parse keep-merge)
+'
+
+test_expect_success '--rebase=invalid fails' '
+       git reset --hard before-preserve-rebase &&
+       ! git pull --rebase=invalid . copy
+'
+
+test_expect_success '--rebase overrides pull.rebase=preserve and flattens keep-merge' '
+       git reset --hard before-preserve-rebase &&
+       test_config pull.rebase preserve &&
+       git pull --rebase . copy &&
+       test $(git rev-parse HEAD^^) = $(git rev-parse copy) &&
+       test file3 = $(git show HEAD:file3.t)
+'
+
 test_expect_success '--rebase with rebased upstream' '
 
        git remote add -f me . &&
@@ -171,9 +284,9 @@ test_expect_success 'pull --rebase dies early with dirty working directory' '
        git update-ref refs/remotes/me/copy copy^ &&
        COPY=$(git rev-parse --verify me/copy) &&
        git rebase --onto $COPY copy &&
-       git config branch.to-rebase.remote me &&
-       git config branch.to-rebase.merge refs/heads/copy &&
-       git config branch.to-rebase.rebase true &&
+       test_config branch.to-rebase.remote me &&
+       test_config branch.to-rebase.merge refs/heads/copy &&
+       test_config branch.to-rebase.rebase true &&
        echo dirty >> file &&
        git add file &&
        test_must_fail git pull &&