|  | #!/bin/sh | 
|  |  | 
|  | test_description='unpack-objects' | 
|  |  | 
|  | . ./test-lib.sh | 
|  |  | 
|  | test_expect_success setup ' | 
|  | mkdir pub.git && | 
|  | GIT_DIR=pub.git git init --bare && | 
|  | GIT_DIR=pub.git git config receive.fsckobjects true && | 
|  | mkdir work && | 
|  | ( | 
|  | cd work && | 
|  | git init && | 
|  | mkdir -p gar/bage && | 
|  | ( | 
|  | cd gar/bage && | 
|  | git init && | 
|  | >junk && | 
|  | git add junk && | 
|  | git commit -m "Initial junk" | 
|  | ) && | 
|  | git add gar/bage && | 
|  | git commit -m "Initial superproject" | 
|  | ) | 
|  | ' | 
|  |  | 
|  | test_expect_success push ' | 
|  | ( | 
|  | cd work && | 
|  | git push ../pub.git master | 
|  | ) | 
|  | ' | 
|  |  | 
|  | test_expect_success 'push if submodule has no remote' ' | 
|  | ( | 
|  | cd work/gar/bage && | 
|  | >junk2 && | 
|  | git add junk2 && | 
|  | git commit -m "Second junk" | 
|  | ) && | 
|  | ( | 
|  | cd work && | 
|  | git add gar/bage && | 
|  | git commit -m "Second commit for gar/bage" && | 
|  | git push --recurse-submodules=check ../pub.git master | 
|  | ) | 
|  | ' | 
|  |  | 
|  | test_expect_success 'push fails if submodule commit not on remote' ' | 
|  | ( | 
|  | cd work/gar && | 
|  | git clone --bare bage ../../submodule.git && | 
|  | cd bage && | 
|  | git remote add origin ../../../submodule.git && | 
|  | git fetch && | 
|  | >junk3 && | 
|  | git add junk3 && | 
|  | git commit -m "Third junk" | 
|  | ) && | 
|  | ( | 
|  | cd work && | 
|  | git add gar/bage && | 
|  | git commit -m "Third commit for gar/bage" && | 
|  | test_must_fail git push --recurse-submodules=check ../pub.git master | 
|  | ) | 
|  | ' | 
|  |  | 
|  | test_expect_success 'push succeeds after commit was pushed to remote' ' | 
|  | ( | 
|  | cd work/gar/bage && | 
|  | git push origin master | 
|  | ) && | 
|  | ( | 
|  | cd work && | 
|  | git push --recurse-submodules=check ../pub.git master | 
|  | ) | 
|  | ' | 
|  |  | 
|  | test_expect_success 'push fails when commit on multiple branches if one branch has no remote' ' | 
|  | ( | 
|  | cd work/gar/bage && | 
|  | >junk4 && | 
|  | git add junk4 && | 
|  | git commit -m "Fourth junk" | 
|  | ) && | 
|  | ( | 
|  | cd work && | 
|  | git branch branch2 && | 
|  | git add gar/bage && | 
|  | git commit -m "Fourth commit for gar/bage" && | 
|  | git checkout branch2 && | 
|  | ( | 
|  | cd gar/bage && | 
|  | git checkout HEAD~1 | 
|  | ) && | 
|  | >junk1 && | 
|  | git add junk1 && | 
|  | git commit -m "First junk" && | 
|  | test_must_fail git push --recurse-submodules=check ../pub.git | 
|  | ) | 
|  | ' | 
|  |  | 
|  | test_expect_success 'push succeeds if submodule has no remote and is on the first superproject commit' ' | 
|  | git init --bare a | 
|  | git clone a a1 && | 
|  | ( | 
|  | cd a1 && | 
|  | git init b | 
|  | ( | 
|  | cd b && | 
|  | >junk && | 
|  | git add junk && | 
|  | git commit -m "initial" | 
|  | ) && | 
|  | git add b && | 
|  | git commit -m "added submodule" && | 
|  | git push --recurse-submodule=check origin master | 
|  | ) | 
|  | ' | 
|  |  | 
|  | test_done |