builtin/reset: add --recurse-submodules switch
[gitweb.git] / t / lib-submodule-update.sh
index ae560dc95c1d1cf102c743c4712de70b7504c3a1..f0b1b1820607249929f9d505de3d8c25b5ae92b4 100755 (executable)
@@ -73,6 +73,7 @@ create_lib_submodule_repo () {
 
                git checkout -b "add_sub1" &&
                git submodule add ../submodule_update_sub1 sub1 &&
+               git submodule add ../submodule_update_sub1 uninitialized_sub &&
                git config -f .gitmodules submodule.sub1.ignore all &&
                git config submodule.sub1.ignore all &&
                git add .gitmodules &&
@@ -782,6 +783,21 @@ test_submodule_forced_switch () {
 
 test_submodule_switch_recursing () {
        command="$1"
+       RESULTDS=success
+       if test "$KNOWN_FAILURE_DIRECTORY_SUBMODULE_CONFLICTS" = 1
+       then
+               RESULTDS=failure
+       fi
+       RESULTR=success
+       if test "$KNOWN_FAILURE_SUBMODULE_RECURSIVE_NESTED" = 1
+       then
+               RESULTR=failure
+       fi
+       RESULTOI=success
+       if test "$KNOWN_FAILURE_SUBMODULE_OVERWRITE_IGNORED_UNTRACKED" = 1
+       then
+               RESULTOI=failure
+       fi
        ######################### Appearing submodule #########################
        # Switching to a commit letting a submodule appear checks it out ...
        test_expect_success "$command: added submodule is checked out" '
@@ -822,7 +838,7 @@ test_submodule_switch_recursing () {
                )
        '
        # ... but an ignored file is fine.
-       test_expect_success "$command: added submodule removes an untracked ignored file" '
+       test_expect_$RESULTOI "$command: added submodule removes an untracked ignored file" '
                test_when_finished "rm submodule_update/.git/info/exclude" &&
                prolog &&
                reset_work_tree_to_interested no_submodule &&
@@ -891,7 +907,7 @@ test_submodule_switch_recursing () {
        '
        # Replacing a submodule with files in a directory must succeeds
        # when the submodule is clean
-       test_expect_success "$command: replace submodule with a directory" '
+       test_expect_$RESULTDS "$command: replace submodule with a directory" '
                prolog &&
                reset_work_tree_to_interested add_sub1 &&
                (
@@ -903,7 +919,7 @@ test_submodule_switch_recursing () {
                )
        '
        # ... absorbing a .git directory.
-       test_expect_success "$command: replace submodule containing a .git directory with a directory must absorb the git dir" '
+       test_expect_$RESULTDS "$command: replace submodule containing a .git directory with a directory must absorb the git dir" '
                prolog &&
                reset_work_tree_to_interested add_sub1 &&
                (
@@ -931,7 +947,7 @@ test_submodule_switch_recursing () {
        '
 
        # ... must check its local work tree for untracked files
-       test_expect_success "$command: replace submodule with a file must fail with untracked files" '
+       test_expect_$RESULTDS "$command: replace submodule with a file must fail with untracked files" '
                prolog &&
                reset_work_tree_to_interested add_sub1 &&
                (
@@ -987,7 +1003,8 @@ test_submodule_switch_recursing () {
                )
        '
 
-       test_expect_success "$command: modified submodule updates submodule recursively" '
+       # recursing deeper than one level doesn't work yet.
+       test_expect_$RESULTR "$command: modified submodule updates submodule recursively" '
                prolog &&
                reset_work_tree_to_interested add_nested_sub &&
                (
@@ -1006,6 +1023,11 @@ test_submodule_switch_recursing () {
 # the superproject as well as the submodule is allowed.
 test_submodule_forced_switch_recursing () {
        command="$1"
+       RESULT=success
+       if test "$KNOWN_FAILURE_DIRECTORY_SUBMODULE_CONFLICTS" = 1
+       then
+               RESULT=failure
+       fi
        ######################### Appearing submodule #########################
        # Switching to a commit letting a submodule appear creates empty dir ...
        test_expect_success "$command: added submodule is checked out" '
@@ -1151,7 +1173,7 @@ test_submodule_forced_switch_recursing () {
        '
 
        # ... but stops for untracked files that would be lost
-       test_expect_success "$command: replace submodule with a file" '
+       test_expect_$RESULT "$command: replace submodule with a file stops for untracked files" '
                prolog &&
                reset_work_tree_to_interested add_sub1 &&
                (
@@ -1191,14 +1213,31 @@ test_submodule_forced_switch_recursing () {
                )
        '
        # Updating a submodule from an invalid sha1 updates
-       test_expect_success "$command: modified submodule does not update submodule work tree from invalid commit" '
+       test_expect_success "$command: modified submodule does update submodule work tree from invalid commit" '
                prolog &&
                reset_work_tree_to_interested invalid_sub1 &&
                (
                        cd submodule_update &&
                        git branch -t valid_sub1 origin/valid_sub1 &&
-                       test_must_fail $command valid_sub1 &&
-                       test_superproject_content origin/invalid_sub1
+                       $command valid_sub1 &&
+                       test_superproject_content origin/valid_sub1 &&
+                       test_submodule_content sub1 origin/valid_sub1
+               )
+       '
+
+       # Old versions of Git were buggy writing the .git link file
+       # (e.g. before f8eaa0ba98b and then moving the superproject repo
+       # whose submodules contained absolute paths)
+       test_expect_success "$command: updating submodules fixes .git links" '
+               prolog &&
+               reset_work_tree_to_interested add_sub1 &&
+               (
+                       cd submodule_update &&
+                       git branch -t modify_sub1 origin/modify_sub1 &&
+                       echo "gitdir: bogus/path" >sub1/.git &&
+                       $command modify_sub1 &&
+                       test_superproject_content origin/modify_sub1 &&
+                       test_submodule_content sub1 origin/modify_sub1
                )
        '
 }