3 test_description='unpack-objects'
7 test_expect_success setup '
9 GIT_DIR=pub.git git init --bare &&
10 GIT_DIR=pub.git git config receive.fsckobjects true &&
15 git config push.default matching &&
20 git config push.default matching &&
23 git commit -m "Initial junk"
26 git commit -m "Initial superproject"
30 test_expect_success push '
33 git push ../pub.git master
37 test_expect_success 'push if submodule has no remote' '
42 git commit -m "Second junk"
47 git commit -m "Second commit for gar/bage" &&
48 git push --recurse-submodules=check ../pub.git master
52 test_expect_success 'push fails if submodule commit not on remote' '
55 git clone --bare bage ../../submodule.git &&
57 git remote add origin ../../../submodule.git &&
61 git commit -m "Third junk"
66 git commit -m "Third commit for gar/bage" &&
67 # the push should fail with --recurse-submodules=check
68 # on the command line...
69 test_must_fail git push --recurse-submodules=check ../pub.git master &&
71 # ...or if specified in the configuration..
72 test_must_fail git -c push.recurseSubmodules=check push ../pub.git master
76 test_expect_success 'push succeeds after commit was pushed to remote' '
79 git push origin master
83 git push --recurse-submodules=check ../pub.git master
87 test_expect_success 'push succeeds if submodule commit not on remote but using on-demand on command line' '
90 >recurse-on-demand-on-command-line &&
91 git add recurse-on-demand-on-command-line &&
92 git commit -m "Recurse on-demand on command line junk"
97 git commit -m "Recurse on-demand on command line for gar/bage" &&
98 git push --recurse-submodules=on-demand ../pub.git master &&
99 # Check that the supermodule commit got there
100 git fetch ../pub.git &&
101 git diff --quiet FETCH_HEAD master &&
102 # Check that the submodule commit got there too
104 git diff --quiet origin/master master
108 test_expect_success 'push succeeds if submodule commit not on remote but using on-demand from config' '
111 >recurse-on-demand-from-config &&
112 git add recurse-on-demand-from-config &&
113 git commit -m "Recurse on-demand from config junk"
118 git commit -m "Recurse on-demand from config for gar/bage" &&
119 git -c push.recurseSubmodules=on-demand push ../pub.git master &&
120 # Check that the supermodule commit got there
121 git fetch ../pub.git &&
122 git diff --quiet FETCH_HEAD master &&
123 # Check that the submodule commit got there too
125 git diff --quiet origin/master master
129 test_expect_success 'push recurse-submodules on command line overrides config' '
132 >recurse-check-on-command-line-overriding-config &&
133 git add recurse-check-on-command-line-overriding-config &&
134 git commit -m "Recurse on command-line overriding config junk"
139 git commit -m "Recurse on command-line overriding config for gar/bage" &&
141 # Ensure that we can override on-demand in the config
142 # to just check submodules
143 test_must_fail git -c push.recurseSubmodules=on-demand push --recurse-submodules=check ../pub.git master &&
144 # Check that the supermodule commit did not get there
145 git fetch ../pub.git &&
146 git diff --quiet FETCH_HEAD master^ &&
147 # Check that the submodule commit did not get there
148 (cd gar/bage && git diff --quiet origin/master master^) &&
150 # Ensure that we can override check in the config to
151 # disable submodule recursion entirely
152 (cd gar/bage && git diff --quiet origin/master master^) &&
153 git -c push.recurseSubmodules=on-demand push --recurse-submodules=no ../pub.git master &&
154 git fetch ../pub.git &&
155 git diff --quiet FETCH_HEAD master &&
156 (cd gar/bage && git diff --quiet origin/master master^) &&
158 # Ensure that we can override check in the config to
159 # disable submodule recursion entirely (alternative form)
160 git -c push.recurseSubmodules=on-demand push --no-recurse-submodules ../pub.git master &&
161 git fetch ../pub.git &&
162 git diff --quiet FETCH_HEAD master &&
163 (cd gar/bage && git diff --quiet origin/master master^) &&
165 # Ensure that we can override check in the config to
166 # push the submodule too
167 git -c push.recurseSubmodules=check push --recurse-submodules=on-demand ../pub.git master &&
168 git fetch ../pub.git &&
169 git diff --quiet FETCH_HEAD master &&
170 (cd gar/bage && git diff --quiet origin/master master)
174 test_expect_success 'push succeeds if submodule commit not on remote using on-demand from cmdline overriding config' '
177 >recurse-on-demand-on-command-line-overriding-config &&
178 git add recurse-on-demand-on-command-line-overriding-config &&
179 git commit -m "Recurse on-demand on command-line overriding config junk"
184 git commit -m "Recurse on-demand on command-line overriding config for gar/bage" &&
185 git -c push.recurseSubmodules=check push --recurse-submodules=on-demand ../pub.git master &&
186 # Check that the supermodule commit got there
187 git fetch ../pub.git &&
188 git diff --quiet FETCH_HEAD master &&
189 # Check that the submodule commit got there
191 git diff --quiet origin/master master
195 test_expect_success 'push succeeds if submodule commit disabling recursion from cmdline overriding config' '
198 >recurse-disable-on-command-line-overriding-config &&
199 git add recurse-disable-on-command-line-overriding-config &&
200 git commit -m "Recurse disable on command-line overriding config junk"
205 git commit -m "Recurse disable on command-line overriding config for gar/bage" &&
206 git -c push.recurseSubmodules=check push --recurse-submodules=no ../pub.git master &&
207 # Check that the supermodule commit got there
208 git fetch ../pub.git &&
209 git diff --quiet FETCH_HEAD master &&
210 # But that the submodule commit did not
211 ( cd gar/bage && git diff --quiet origin/master master^ ) &&
212 # Now push it to avoid confusing future tests
213 git push --recurse-submodules=on-demand ../pub.git master
217 test_expect_success 'push succeeds if submodule commit disabling recursion from cmdline (alternative form) overriding config' '
220 >recurse-disable-on-command-line-alt-overriding-config &&
221 git add recurse-disable-on-command-line-alt-overriding-config &&
222 git commit -m "Recurse disable on command-line alternative overriding config junk"
227 git commit -m "Recurse disable on command-line alternative overriding config for gar/bage" &&
228 git -c push.recurseSubmodules=check push --no-recurse-submodules ../pub.git master &&
229 # Check that the supermodule commit got there
230 git fetch ../pub.git &&
231 git diff --quiet FETCH_HEAD master &&
232 # But that the submodule commit did not
233 ( cd gar/bage && git diff --quiet origin/master master^ ) &&
234 # Now push it to avoid confusing future tests
235 git push --recurse-submodules=on-demand ../pub.git master
239 test_expect_success 'push fails if recurse submodules option passed as yes' '
242 >recurse-push-fails-if-recurse-submodules-passed-as-yes &&
243 git add recurse-push-fails-if-recurse-submodules-passed-as-yes &&
244 git commit -m "Recurse push fails if recurse submodules option passed as yes"
249 git commit -m "Recurse push fails if recurse submodules option passed as yes for gar/bage" &&
250 test_must_fail git push --recurse-submodules=yes ../pub.git master &&
251 test_must_fail git -c push.recurseSubmodules=yes push ../pub.git master &&
252 git push --recurse-submodules=on-demand ../pub.git master
256 test_expect_success 'push fails when commit on multiple branches if one branch has no remote' '
261 git commit -m "Fourth junk"
265 git branch branch2 &&
267 git commit -m "Fourth commit for gar/bage" &&
268 git checkout branch2 &&
275 git commit -m "First junk" &&
276 test_must_fail git push --recurse-submodules=check ../pub.git
280 test_expect_success 'push succeeds if submodule has no remote and is on the first superproject commit' '
290 git commit -m "initial"
293 git commit -m "added submodule" &&
294 git push --recurse-submodule=check origin master
298 test_expect_success 'push unpushed submodules when not needed' '
303 git checkout master &&
306 git commit -m "Fifth junk" &&
308 git rev-parse origin/master >../../../expected
310 git checkout master &&
312 git commit -m "Fifth commit for gar/bage" &&
313 git push --recurse-submodules=on-demand ../pub.git master
317 git rev-parse master >../actual
319 test_cmp expected actual
322 test_expect_success 'push unpushed submodules when not needed 2' '
325 git rev-parse master >../expected
333 git commit -m "Sixth junk"
337 git commit -m "Second junk for work" &&
338 git push --recurse-submodules=on-demand ../pub.git master
342 git rev-parse master >../actual
344 test_cmp expected actual
347 test_expect_success 'push unpushed submodules recursively' '
352 git checkout master &&
355 git commit -m "Seventh junk" &&
356 git rev-parse master >../../../expected
358 git checkout master &&
360 git commit -m "Seventh commit for gar/bage" &&
361 git push --recurse-submodules=on-demand ../pub.git master
365 git rev-parse master >../actual
367 test_cmp expected actual
370 test_expect_success 'push unpushable submodule recursively fails' '
375 git rev-parse origin/master >../../../expected &&
376 git checkout master~0 &&
379 git commit -m "Eighth junk"
382 git commit -m "Eighth commit for gar/bage" &&
383 test_must_fail git push --recurse-submodules=on-demand ../pub.git master
387 git rev-parse master >../actual
389 test_cmp expected actual