search_for_subdir(): return (ref_dir *) instead of (ref_entry *)
[gitweb.git] / t / t5531-deep-submodule-push.sh
index 65d8d474bcc6aa5ab4a1c659e228ac2e61d71e04..1947c28c6466d46c79c7b1b093488c1620324172 100755 (executable)
@@ -6,7 +6,7 @@ test_description='unpack-objects'
 
 test_expect_success setup '
        mkdir pub.git &&
-       GIT_DIR=pub.git git init --bare
+       GIT_DIR=pub.git git init --bare &&
        GIT_DIR=pub.git git config receive.fsckobjects true &&
        mkdir work &&
        (
@@ -32,4 +32,185 @@ test_expect_success push '
        )
 '
 
+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_expect_success 'push unpushed submodules when not needed' '
+       (
+               cd work &&
+               (
+                       cd gar/bage &&
+                       git checkout master &&
+                       >junk5 &&
+                       git add junk5 &&
+                       git commit -m "Fifth junk" &&
+                       git push &&
+                       git rev-parse origin/master >../../../expected
+               ) &&
+               git checkout master &&
+               git add gar/bage &&
+               git commit -m "Fifth commit for gar/bage" &&
+               git push --recurse-submodules=on-demand ../pub.git master
+       ) &&
+       (
+               cd submodule.git &&
+               git rev-parse master >../actual
+       ) &&
+       test_cmp expected actual
+'
+
+test_expect_success 'push unpushed submodules when not needed 2' '
+       (
+               cd submodule.git &&
+               git rev-parse master >../expected
+       ) &&
+       (
+               cd work &&
+               (
+                       cd gar/bage &&
+                       >junk6 &&
+                       git add junk6 &&
+                       git commit -m "Sixth junk"
+               ) &&
+               >junk2 &&
+               git add junk2 &&
+               git commit -m "Second junk for work" &&
+               git push --recurse-submodules=on-demand ../pub.git master
+       ) &&
+       (
+               cd submodule.git &&
+               git rev-parse master >../actual
+       ) &&
+       test_cmp expected actual
+'
+
+test_expect_success 'push unpushed submodules recursively' '
+       (
+               cd work &&
+               (
+                       cd gar/bage &&
+                       git checkout master &&
+                       > junk7 &&
+                       git add junk7 &&
+                       git commit -m "Seventh junk" &&
+                       git rev-parse master >../../../expected
+               ) &&
+               git checkout master &&
+               git add gar/bage &&
+               git commit -m "Seventh commit for gar/bage" &&
+               git push --recurse-submodules=on-demand ../pub.git master
+       ) &&
+       (
+               cd submodule.git &&
+               git rev-parse master >../actual
+       ) &&
+       test_cmp expected actual
+'
+
+test_expect_success 'push unpushable submodule recursively fails' '
+       (
+               cd work &&
+               (
+                       cd gar/bage &&
+                       git rev-parse origin/master >../../../expected &&
+                       git checkout master~0 &&
+                       > junk8 &&
+                       git add junk8 &&
+                       git commit -m "Eighth junk"
+               ) &&
+               git add gar/bage &&
+               git commit -m "Eighth commit for gar/bage" &&
+               test_must_fail git push --recurse-submodules=on-demand ../pub.git master
+       ) &&
+       (
+               cd submodule.git &&
+               git rev-parse master >../actual
+       ) &&
+       test_cmp expected actual
+'
+
 test_done