Merge branch 'maint-1.7.7' into maint
[git/jrn.git] / t / t5520-pull.sh
blob0e5eb678ce6b2f4fad79c39947455e5284313ba4
1 #!/bin/sh
3 test_description='pulling into void'
5 . ./test-lib.sh
7 modify () {
8 sed -e "$1" <"$2" >"$2.x" &&
9 mv "$2.x" "$2"
12 D=`pwd`
14 test_expect_success setup '
16 echo file >file &&
17 git add file &&
18 git commit -a -m original
22 test_expect_success 'pulling into void' '
23 mkdir cloned &&
24 cd cloned &&
25 git init &&
26 git pull ..
29 cd "$D"
31 test_expect_success 'checking the results' '
32 test -f file &&
33 test -f cloned/file &&
34 test_cmp file cloned/file
37 test_expect_success 'pulling into void using master:master' '
38 mkdir cloned-uho &&
40 cd cloned-uho &&
41 git init &&
42 git pull .. master:master
43 ) &&
44 test -f file &&
45 test -f cloned-uho/file &&
46 test_cmp file cloned-uho/file
49 test_expect_success 'pulling into void does not overwrite untracked files' '
50 git init cloned-untracked &&
52 cd cloned-untracked &&
53 echo untracked >file &&
54 test_must_fail git pull .. master &&
55 echo untracked >expect &&
56 test_cmp expect file
60 test_expect_success 'test . as a remote' '
62 git branch copy master &&
63 git config branch.copy.remote . &&
64 git config branch.copy.merge refs/heads/master &&
65 echo updated >file &&
66 git commit -a -m updated &&
67 git checkout copy &&
68 test `cat file` = file &&
69 git pull &&
70 test `cat file` = updated
73 test_expect_success 'the default remote . should not break explicit pull' '
74 git checkout -b second master^ &&
75 echo modified >file &&
76 git commit -a -m modified &&
77 git checkout copy &&
78 git reset --hard HEAD^ &&
79 test `cat file` = file &&
80 git pull . second &&
81 test `cat file` = modified
84 test_expect_success '--rebase' '
85 git branch to-rebase &&
86 echo modified again > file &&
87 git commit -m file file &&
88 git checkout to-rebase &&
89 echo new > file2 &&
90 git add file2 &&
91 git commit -m "new file" &&
92 git tag before-rebase &&
93 git pull --rebase . copy &&
94 test $(git rev-parse HEAD^) = $(git rev-parse copy) &&
95 test new = $(git show HEAD:file2)
98 test_expect_success 'branch.to-rebase.rebase' '
99 git reset --hard before-rebase &&
100 git config branch.to-rebase.rebase 1 &&
101 git pull . copy &&
102 git config branch.to-rebase.rebase 0 &&
103 test $(git rev-parse HEAD^) = $(git rev-parse copy) &&
104 test new = $(git show HEAD:file2)
107 test_expect_success '--rebase with rebased upstream' '
109 git remote add -f me . &&
110 git checkout copy &&
111 git tag copy-orig &&
112 git reset --hard HEAD^ &&
113 echo conflicting modification > file &&
114 git commit -m conflict file &&
115 git checkout to-rebase &&
116 echo file > file2 &&
117 git commit -m to-rebase file2 &&
118 git tag to-rebase-orig &&
119 git pull --rebase me copy &&
120 test "conflicting modification" = "$(cat file)" &&
121 test file = $(cat file2)
125 test_expect_success '--rebase with rebased default upstream' '
127 git update-ref refs/remotes/me/copy copy-orig &&
128 git checkout --track -b to-rebase2 me/copy &&
129 git reset --hard to-rebase-orig &&
130 git pull --rebase &&
131 test "conflicting modification" = "$(cat file)" &&
132 test file = $(cat file2)
136 test_expect_success 'rebased upstream + fetch + pull --rebase' '
138 git update-ref refs/remotes/me/copy copy-orig &&
139 git reset --hard to-rebase-orig &&
140 git checkout --track -b to-rebase3 me/copy &&
141 git reset --hard to-rebase-orig &&
142 git fetch &&
143 git pull --rebase &&
144 test "conflicting modification" = "$(cat file)" &&
145 test file = "$(cat file2)"
149 test_expect_success 'pull --rebase dies early with dirty working directory' '
151 git checkout to-rebase &&
152 git update-ref refs/remotes/me/copy copy^ &&
153 COPY=$(git rev-parse --verify me/copy) &&
154 git rebase --onto $COPY copy &&
155 git config branch.to-rebase.remote me &&
156 git config branch.to-rebase.merge refs/heads/copy &&
157 git config branch.to-rebase.rebase true &&
158 echo dirty >> file &&
159 git add file &&
160 test_must_fail git pull &&
161 test $COPY = $(git rev-parse --verify me/copy) &&
162 git checkout HEAD -- file &&
163 git pull &&
164 test $COPY != $(git rev-parse --verify me/copy)
168 test_expect_success 'pull --rebase works on branch yet to be born' '
169 git rev-parse master >expect &&
170 mkdir empty_repo &&
171 (cd empty_repo &&
172 git init &&
173 git pull --rebase .. master &&
174 git rev-parse HEAD >../actual
175 ) &&
176 test_cmp expect actual
179 test_expect_success 'setup for detecting upstreamed changes' '
180 mkdir src &&
181 (cd src &&
182 git init &&
183 printf "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n" > stuff &&
184 git add stuff &&
185 git commit -m "Initial revision"
186 ) &&
187 git clone src dst &&
188 (cd src &&
189 modify s/5/43/ stuff &&
190 git commit -a -m "5->43" &&
191 modify s/6/42/ stuff &&
192 git commit -a -m "Make it bigger"
193 ) &&
194 (cd dst &&
195 modify s/5/43/ stuff &&
196 git commit -a -m "Independent discovery of 5->43"
200 test_expect_success 'git pull --rebase detects upstreamed changes' '
201 (cd dst &&
202 git pull --rebase &&
203 test -z "$(git ls-files -u)"
207 test_expect_success 'setup for avoiding reapplying old patches' '
208 (cd dst &&
209 test_might_fail git rebase --abort &&
210 git reset --hard origin/master
211 ) &&
212 git clone --bare src src-replace.git &&
213 rm -rf src &&
214 mv src-replace.git src &&
215 (cd dst &&
216 modify s/2/22/ stuff &&
217 git commit -a -m "Change 2" &&
218 modify s/3/33/ stuff &&
219 git commit -a -m "Change 3" &&
220 modify s/4/44/ stuff &&
221 git commit -a -m "Change 4" &&
222 git push &&
224 modify s/44/55/ stuff &&
225 git commit --amend -a -m "Modified Change 4"
229 test_expect_success 'git pull --rebase does not reapply old patches' '
230 (cd dst &&
231 test_must_fail git pull --rebase &&
232 test 1 = $(find .git/rebase-apply -name "000*" | wc -l)
236 test_expect_success 'git pull --rebase against local branch' '
237 git checkout -b copy2 to-rebase-orig &&
238 git pull --rebase . to-rebase &&
239 test "conflicting modification" = "$(cat file)" &&
240 test file = "$(cat file2)"
243 test_done