|  | #!/bin/sh | 
|  |  | 
|  | test_description='pulling into void' | 
|  |  | 
|  | . ./test-lib.sh | 
|  |  | 
|  | 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' ' | 
|  | test -f file && | 
|  | test -f cloned/file && | 
|  | diff file cloned/file | 
|  | ' | 
|  |  | 
|  | test_expect_success 'pulling into void using master:master' ' | 
|  | mkdir cloned-uho && | 
|  | ( | 
|  | cd cloned-uho && | 
|  | git init && | 
|  | git pull .. master:master | 
|  | ) && | 
|  | test -f file && | 
|  | test -f cloned-uho/file && | 
|  | test_cmp file cloned-uho/file | 
|  | ' | 
|  |  | 
|  | test_expect_success 'test . as a remote' ' | 
|  |  | 
|  | git branch copy master && | 
|  | git config branch.copy.remote . && | 
|  | git config branch.copy.merge refs/heads/master && | 
|  | echo updated >file && | 
|  | git commit -a -m updated && | 
|  | git checkout copy && | 
|  | test `cat file` = file && | 
|  | git pull && | 
|  | test `cat file` = updated | 
|  | ' | 
|  |  | 
|  | test_expect_success 'the default remote . should not break explicit pull' ' | 
|  | git checkout -b second master^ && | 
|  | echo modified >file && | 
|  | git commit -a -m modified && | 
|  | git checkout copy && | 
|  | git reset --hard HEAD^ && | 
|  | test `cat file` = file && | 
|  | git pull . second && | 
|  | test `cat file` = modified | 
|  | ' | 
|  |  | 
|  | test_expect_success '--rebase' ' | 
|  | git branch to-rebase && | 
|  | echo modified again > file && | 
|  | git commit -m file file && | 
|  | git checkout to-rebase && | 
|  | echo new > file2 && | 
|  | git add file2 && | 
|  | git commit -m "new file" && | 
|  | git tag before-rebase && | 
|  | git pull --rebase . copy && | 
|  | test $(git rev-parse HEAD^) = $(git rev-parse copy) && | 
|  | test new = $(git show HEAD:file2) | 
|  | ' | 
|  |  | 
|  | test_expect_success 'branch.to-rebase.rebase' ' | 
|  | git reset --hard before-rebase && | 
|  | git config branch.to-rebase.rebase 1 && | 
|  | git pull . copy && | 
|  | git config branch.to-rebase.rebase 0 && | 
|  | test $(git rev-parse HEAD^) = $(git rev-parse copy) && | 
|  | test new = $(git show HEAD:file2) | 
|  | ' | 
|  |  | 
|  | test_expect_success '--rebase with rebased upstream' ' | 
|  |  | 
|  | git remote add -f me . && | 
|  | git checkout copy && | 
|  | git tag copy-orig && | 
|  | git reset --hard HEAD^ && | 
|  | echo conflicting modification > file && | 
|  | git commit -m conflict file && | 
|  | git checkout to-rebase && | 
|  | echo file > file2 && | 
|  | git commit -m to-rebase file2 && | 
|  | git tag to-rebase-orig && | 
|  | git pull --rebase me copy && | 
|  | test "conflicting modification" = "$(cat file)" && | 
|  | test file = $(cat file2) | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success '--rebase with rebased default upstream' ' | 
|  |  | 
|  | git update-ref refs/remotes/me/copy copy-orig && | 
|  | git checkout --track -b to-rebase2 me/copy && | 
|  | git reset --hard to-rebase-orig && | 
|  | git pull --rebase && | 
|  | test "conflicting modification" = "$(cat file)" && | 
|  | test file = $(cat file2) | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'rebased upstream + fetch + pull --rebase' ' | 
|  |  | 
|  | git update-ref refs/remotes/me/copy copy-orig && | 
|  | git reset --hard to-rebase-orig && | 
|  | git checkout --track -b to-rebase3 me/copy && | 
|  | git reset --hard to-rebase-orig && | 
|  | git fetch && | 
|  | git pull --rebase && | 
|  | test "conflicting modification" = "$(cat file)" && | 
|  | test file = "$(cat file2)" | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'pull --rebase dies early with dirty working directory' ' | 
|  |  | 
|  | git checkout to-rebase && | 
|  | 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 && | 
|  | echo dirty >> file && | 
|  | git add file && | 
|  | test_must_fail git pull && | 
|  | test $COPY = $(git rev-parse --verify me/copy) && | 
|  | git checkout HEAD -- file && | 
|  | git pull && | 
|  | test $COPY != $(git rev-parse --verify me/copy) | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'pull --rebase works on branch yet to be born' ' | 
|  | git rev-parse master >expect && | 
|  | mkdir empty_repo && | 
|  | (cd empty_repo && | 
|  | git init && | 
|  | git pull --rebase .. master && | 
|  | git rev-parse HEAD >../actual | 
|  | ) && | 
|  | test_cmp expect actual | 
|  | ' | 
|  |  | 
|  | test_done |